Segundo Exercício: Caneta com Memória


Suponha agora que quer criar um tipo especial de caneta, a caneta com memória. A caneta com memória é uma caneta com uma dada capacidade de memória que permite guardar as últimas cadeias de caracteres escritas. Deverá ser possível aceder a cada uma das cadeias de caracteres já escritas pela caneta. No caso de se esgotar a capacidade de armazenamento, então as novas cadeias de caracteres escritas pela caneta não são guardadas. Deverá ser possível fazer o reset das cadeias de caracteres já escritas por uma caneta, ficando a caneta sem qualquer cadeia de caracteres. A verificação da igualdade de duas canetas com memória segue a mesma semântica que no exercício anterior (só que agora é necessário considerar o novo campo capacidade).

Defina a interface deste novo conceito no ficheiro PenWithMemory.h e compare a sua solução com a seguinte solução proposta: PenWithMemory.h. Note devido a uma limitação da linguagem de programação C, as funções que definir para este novo conceito têm que ter um nome diferente das definidas anteriormente para o conceito Caneta. A linguagem de programação C não suporta o mecanismo de sobreposição (overloading). Linguagens que suportam este mecanismo, como Java e C++ pr exemplo, permitem a definição de funções com o mesmo nome e argumentos diferentes.

Agora será necessário concretizar este novo conceito. Se aplicássemos o mesmo procedimento que foi feito no exercício 1, iríamos ter uma certa repetição de código nos dois tipos definidos: Pen e PenWithMemory. Esta repetição de código implicaria que alterações realizadas ao conceito Caneta teriam que ser igualmente replicadas no conceito Caneta com Memória. Por esta razão, a duplicação de código deve ser evitada e deve-se tentar reutilizar o código em vez de o duplicar. Assim, o conceito Caneta com Memória deve ser construído com base no conceito Caneta. Tendo em conta este requisito, concretize o conceito Caneta com Memória e compare a sua solução com a solução proposta: PenWithMemory.c

Note-se que mesmo nas funcionalidades de Caneta com Memória que são exactamente iguais às definidas em Caneta temos que definir funções em Caneta com Memória que irão simplesmente invocar as funções correspondentes de Caneta. Desta forma consegue-se evitar a duplicação de código mas tem-se o custo de concretização destas funções. Nas linguagens de programação com objectos, que oferecem mecanismos mais poderosos, não é necessário concretizar estas funções para evitar a duplicação de código.