Por que precisamos escrever um arquivo de cabeçalho?

12

Antes que você faça seus comentários sarcásticos, eu sei - essa é uma pergunta nooby. Esta é a minha primeira vez usando uma linguagem baseada em C.

Sou um estudante de graduação que está aprendendo o Objetivo C de um curso de ciência da computação sobre desenvolvimento móvel. Eu sei que, em um ambiente acadêmico, muitas considerações do mundo real não são necessárias, pois você está construindo projetos menores, trabalhando em equipes menores etc.

Mas nosso professor exige - e o XCode suporta - arquivos de cabeçalho .h para cada arquivo de implementação .m. Para mim, isso meio que parece um trabalho ocupado. Eu tenho que ter certeza de copiar cada assinatura de método e variável de instância para o outro arquivo. Se eu alterar um arquivo, tenho que garantir que seja consistente com o outro arquivo. Parece apenas um monte de pequenos aborrecimentos como esse.

Mas eu sei que deve haver algum uso no mundo real para arquivos de cabeçalho. Uma ótima resposta abordaria ambos:

  1. Para que um arquivo de cabeçalho é útil para o qual um arquivo de implementação não é adequado? Qual é seu propósito?
  2. Por que nós, como programadores, temos que escrever manualmente nossos arquivos de cabeçalho? Parece que eles poderiam ser facilmente gerados automaticamente.

Desde já, obrigado!

Hartley Brody
fonte
O XCode suporta refatoração automática para que, se você alterar uma assinatura no cabeçalho, ela seja propagada automaticamente para a implementação (e vice-versa)? Ou talvez haja um plugin que suporte isso? Eu sei que é uma dor de fazer manualmente.
FrustratedWithFormsDesigner
Minha primeira reação quando soube dos arquivos de cabeçalho foi "deve haver uma maneira de fazer isso automaticamente". Fiquei bastante intrigado quando tentei procurar uma ferramenta que o ajudasse e não encontrei grandes e óbvias escolhas.
Hartley Brody
Estou surpreso que essa funcionalidade não exista. Sei que o Eclipse pode fazer essa refatoração para Java, não sei se os plugins C / C ++ podem fazer refatoração de cabeçalho / impl. Eu acho que, se nenhuma ferramenta existe para o XCode, pode ser algo que vale a pena desenvolver. ;)
FrustratedWithFormsDesigner

Respostas:

9
  1. Em resumo;

    • O arquivo de cabeçalho define a API para um módulo. É uma lista de contratos cujos métodos podem ser chamados por terceiros. O módulo pode ser considerado uma caixa preta para terceiros.

    • A implementação implementa o módulo. É o interior da caixa preta. Como desenvolvedor de um módulo, você precisa escrever isso, mas como usuário de um módulo de terceiros, não precisa saber nada sobre a implementação. O cabeçalho deve conter todas as informações necessárias.

  2. Algumas partes de um arquivo de cabeçalho podem ser geradas automaticamente - as declarações do método. Isso exigiria que você anote a implementação, pois é provável que existam métodos privados na implementação que não façam parte da API e não pertençam ao cabeçalho.

Os arquivos de cabeçalho às vezes contêm outras informações; definições de tipo, definições constantes etc. Elas pertencem ao arquivo de cabeçalho e não à implementação.

Luke Graham
fonte
Mas quando alguém estaria em uma situação em que precisava usar meu código, mas tivesse apenas acesso ao arquivo .h? Eles ainda não precisariam do .m para executá-lo?
Hartley Brody
1
Entendo a necessidade de abstração em um nível teórico, caso você altere os detalhes da implementação, mas não tenho certeza de quando uma situação como essa surgiria.
Hartley Brody
10
Às vezes, geralmente por razões comerciais, convém permitir que alguém use seu código, mas não tenha acesso à sua implementação. Nesse caso, você forneceria um arquivo de cabeçalho e código de biblioteca ou objeto que já foi compilado.
Luke Graham
Ahh, entendi. Não considerou que o código já seria compilado, portanto utilizável, mas não legível. Obrigado!
Hartley Brody
3
Além disso, por que eu gostaria de ler a implementação para saber como usar seu código? Deve ser o suficiente para ler o arquivo de cabeçalho.
Per Johansson
5

O principal motivo para um cabeçalho é poder #includeusá - lo em outro arquivo, para que você possa usar as funções em um arquivo desse outro arquivo. O cabeçalho inclui (apenas) o suficiente para poder usar as funções, não as próprias funções, portanto (esperamos) compilá-lo é consideravelmente mais rápido.

Manter os dois resultados separadamente, com mais ninguém nunca ter escrito um editor que automatize o processo muito bem. Não há realmente muitas razões para que eles não pudessem fazer isso, e alguns tentaram - mas os editores que o fizeram nunca se saíram muito bem no mercado, e os editores mais tradicionais não o adotaram.

Jerry Coffin
fonte
2

A inclusão de um cabeçalho permite que seu código chame funções ou métodos escritos em outro local e que possam ou não fazer parte do seu projeto / construção de software, mas que podem ser encontrados pelo 'vinculador' ao criar o software.

Por exemplo, quando você chama uma função na biblioteca C padrão, não precisa colocar todas as entranhas dessa função dentro do seu projeto - você simplesmente espera que seu programa possa chamá-lo.

Mas seu compilador precisa ser informado de que a função existe em algum lugar, mesmo que não consiga ver o código e o cabeçalho faça isso. Quando o compilador é concluído, o vinculador é chamado e procura 'vincular' os bits do seu código que ficam pendurados, como as chamadas de biblioteca.

adrianmcmenamin
fonte
1

Os arquivos de cabeçalho são usados ​​principalmente para declarar e incluir as assinaturas (ou seja, nome da função, valor de retorno e argumentos) de suas funções em outros arquivos. O compilador precisa conhecer essas assinaturas ao compilar e vincular seus arquivos.

Leia este artigo para obter mais informações.

Bernard
fonte