2.5 Sistemas com Operações Genéricas
Na seção anterior, vimos como projetar sistemas nos quais os objetos de dados podem ser representados de mais de uma maneira. A ideia chave é vincular o código que especifica as operações de dados às várias representações por meio de funções de interface genéricas. Agora veremos como usar essa mesma ideia não apenas para definir operações que são genéricas sobre diferentes representações, mas também para definir operações que são genéricas sobre diferentes tipos de argumentos.
Já vimos vários pacotes diferentes de operações aritméticas: a aritmética primitiva (+, -, *, /) embutida em nossa linguagem, a aritmética de números racionais (add_rat, sub_rat, mul_rat, div_rat) da seção 2.1, e a aritmética de números complexos que implementamos na seção 2.4. Agora usaremos técnicas orientadas a dados para construir um pacote de operações aritméticas que incorpora todos os pacotes aritméticos que já construímos.
A figura abaixo mostra a estrutura do sistema que vamos construir. Observe as barreiras de abstração. Da perspectiva de alguém usando "números", há uma única função add que opera em quaisquer números fornecidos. A função add faz parte de uma interface genérica que permite que os pacotes separados de aritmética ordinária, aritmética racional e aritmética complexa sejam acessados uniformemente por programas que usam números. Qualquer pacote aritmético individual (como o pacote complexo) pode ser acessado através de funções genéricas (como add_complex) que combinam pacotes projetados para diferentes representações (como retangular e polar). Além disso, a estrutura do sistema é aditiva, de modo que podemos projetar os pacotes aritméticos individuais separadamente e combiná-los para produzir um sistema aritmético genérico.