Quando eu estava pesquisando as vantagens de C sobre C ++, deparei-me com este parágrafo:
A maneira padrão em C de fazer o encapsulamento é encaminhar declarar uma estrutura e permitir apenas o acesso aos seus dados através de funções. Este método também cria encapsulamento em tempo de compilação. O encapsulamento em tempo de compilação nos permite alterar os membros das estruturas de dados sem recompilar o código do cliente (outro código usando nossa interface). A maneira padrão de encapsular o C ++, por outro lado (usando classes) requer a recompilação do código do cliente ao adicionar ou remover variáveis de membros particulares.
Eu entendo como a declaração de uma estrutura e o acesso a seus membros por meio de funções ocultam os detalhes de implementação da estrutura. O que eu não entendo é essa linha especificamente:
O encapsulamento em tempo de compilação nos permite alterar os membros das estruturas de dados sem recompilar o código do cliente (outro código usando nossa interface).
Em que cenário isso é aplicável?
struct
é uma caixa preta com componentes internos desconhecidos. Se o cliente não souber os internos, ele nunca poderá acessá-los diretamente e você poderá alterá-los à vontade. Isso é semelhante ao encapsulamento no OOP. Os internos são privados e você só altera o objeto usando métodos públicos.Respostas:
Um possível cenário do mundo real onde isso ocorreria é quando uma biblioteca de banco de dados, escrita nos dias em que o espaço no disco rígido era muito limitado, usava um único byte para armazenar o campo 'ano' de uma data (por exemplo, 11 de novembro de 1973 teria
73
para o ano). Mas, quando o ano 2000 chegou, isso não seria mais suficiente e o ano teve que ser armazenado como um número inteiro curto (16 bits). O cabeçalho relevante (muito simplificado) para esta biblioteca pode ser o seguinte:E um programa 'cliente' seria:
A implementação 'original':
Em seguida, na abordagem do Y2K, esse arquivo de implementação seria alterado da seguinte maneira (tudo o mais permanece intocado):
Quando o cliente precisar ser atualizado para usar a nova versão (segura para o Y2K), nenhuma alteração de código será necessária. De fato, talvez você nem precise recompilar: basta vincular novamente a biblioteca de objetos atualizada (se é isso que é) a ser suficiente.
fonte
Nota: A lista a seguir não será exaustiva. As edições são bem-vindas!
Os cenários aplicáveis incluem:
A estrutura mais conhecida desse tipo é
FILE
. Você acabou de ligarfopen()
e obter um ponteiro, se for bem-sucedido. Esse ponteiro é então entregue a outra função que funciona em arquivos. Mas você não sabe - e não quer saber - os detalhes, como elementos contidos e tamanho.fonte