Design de arquivos de cabeçalho C ++: assim como definir uma API?


8

Eu sou uma espécie de iniciante em desenvolvimento de software em larga escala em C ++ e estava pensando no lado do design.

Eu estava lendo esta pergunta e pensei que, em geral, uma vez que passamos por definições constantes e outros assuntos triviais, os arquivos de cabeçalho C ++ são apenas definições de API :

Eles definem o que outros programadores (ou você, de outros módulos) poderão usar (classes, funções públicas), mas nenhuma classe ou função privada deve ser definida nela. É como se o arquivo de cabeçalho definisse as abstrações (interfaces ...) e o arquivo de origem as implementasse. Depois que o arquivo de origem é compilado, os detalhes da implementação são ocultados e permanecem os cabeçalhos disponíveis ao público que definem o que o módulo pode fazer.

Achei que essa visão da separação do cabeçalho / arquivo de origem era muito mais fácil de entender e seguir do que as explicações usuais, já que você pode pensar "seria XXXum material de API disponível ao público, ou é um detalhe de fabricação de linguiça a ser escondido em um arquivo de origem não revelado? "

Meu modelo mental de arquivos de cabeçalho está aproximadamente correto? Do que eu senti falta?


Também olhar para UML para um sistema criado para software ajuda design - suas classes mostrar métodos API e dados (atributos) nos diagramas de classe
gbjbaanb

Oh, acredite, eu sei sobre a UML! = p É apenas a maneira de pensar em C ++ que tenho problemas para entender. Eu "venho do mundo Python", com todos os preconceitos de pensar "Por que uma linguagem precisaria de arquivos de cabeçalho?" =)
Jiby 23/09/2015

Respostas:


10

Não é um modelo mental ruim para ser usado como guia, mas, infelizmente, por razões históricas / técnicas, os cabeçalhos do C ++ combinam interface e implementação de maneiras que esse modelo mental simples não captura completamente.

Para tomar boas decisões de design físico quando as coisas ficam um pouco mais complexas, geralmente é necessário entender como os cabeçalhos funcionam no C ++ em um nível mais detalhado.

Para dar um exemplo: na sua visualização da API, um arquivo de cabeçalho não deve incluir a definição de uma classe de implementação privada. Na prática, no entanto, essas definições de classe geralmente aparecem em um arquivo de cabeçalho, pois o compilador precisará saber seu tamanho se elas estiverem contidas em qualquer classe pública. Existem técnicas para quebrar esse tipo de dependência, mas geralmente impõem um custo em termos de complexidade de código, desempenho ou ambos. Entender quando é apropriado usar uma dessas técnicas requer uma compreensão mais profunda de como os cabeçalhos funcionam em C ++.


Eu estava pensando nas definições avançadas de classes privadas: podemos trapacear colocando-as em um arquivo de cabeçalho "oculto" separado e incluí-las? Dessa forma, você manteria o "cabeçalho simples da API" e o "truque particular sujo". Não tenho certeza se faria muito bem.
Jiby

@Jiby Um cabeçalho "detalhe" separado é uma maneira bastante comum de dividir detalhes de implementação privada; portanto, essa pode ser uma boa abordagem. Também é bastante comum colocar detalhes da implementação em um detailespaço de nomes aninhado para que eles não poluam o espaço de nomes da biblioteca principal e deixem claro que eles não devem ser usados ​​diretamente.
mattnewport

3

Praticamente, há pouca diferença entre um arquivo de cabeçalho e uma interface usada por outros idiomas para a parte principal. Obviamente, embora haja diferenças na implementação, o cabeçalho também conterá informações privadas, mas fundamentalmente elas são usadas para descrever os recursos que a classe ou o módulo fornecerá.

De certa forma, também é um modelo mental de estruturas de dados combinadas com a API, para que possa ser mais útil quando você estiver executando o tipo de design inicial que descreve.

Idealmente, um cabeçalho que define uma API conteria apenas a interface pura, mas como o C ++ não possui uma ABI, isso realmente não importa. Se você criar um sistema de nível superior que forneça uma interface pura do cliente, estará usando um mecanismo diferente, como um IDL ou WSDL, para definir isso de qualquer maneira.



-1

O arquivo de cabeçalho como uma interface pura funciona mais ou menos bem com as classes. Assim que os modelos aparecem, esse modelo para de funcionar. Os modelos não são compiláveis ​​e toda a implementação do modelo deve aparecer no cabeçalho.


Podemos enganar escrevendo código relacionado ao modelo em um cabeçalho separado e incluindo-o?
Jiby
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.