Design da API da biblioteca C ++


12

Estou procurando um bom recurso para aprender sobre o bom design de API para bibliotecas C ++, examinar objetos / dlls compartilhados etc. Há muitos recursos para escrever boas APIs, boas classes, modelos etc. no nível da fonte, mas quase nada sobre reunindo coisas em bibliotecas e executáveis ​​compartilhados. Livros como o Design de software C ++ em larga escala de John Lakos são interessantes, mas estão desatualizados.

O que estou procurando é um conselho, por exemplo, sobre como lidar com modelos. Com os modelos na minha API, muitas vezes acabo com o código da biblioteca no meu executável (ou outra biblioteca), por isso, se eu corrigir um bug, não posso simplesmente lançar a nova biblioteca, mas preciso recompilar e redistribuir todos os clientes desse código. (e sim, conheço algumas soluções, como tentar instanciar pelo menos as versões mais comuns dentro da biblioteca etc.)

Também estou procurando outras advertências e outras questões a serem mantidas para manter a compatibilidade binária enquanto estiver trabalhando nas bibliotecas C ++.

Existe um bom site ou livro sobre essas coisas?


Eu lidei com isso da seguinte maneira: sivut.koti.soon.fi/~terop/GameApi.html - ou seja, enquanto houver modelos dentro da lib, nada disso está na API ...
tp1

1
std::unique_ptré uma coisa bem nova. O que exatamente você achou mais adequado sobre sua API proposta? A maneira pela qual você teve que gerenciar manualmente todos os recursos, praticamente garantindo vazamentos e exclusões duplas, por exemplo? Ou a maneira pela qual muitos de seus tipos tinham nomes de uma ou duas letras, impossibilitando a divisão de seus propósitos?
DeadMG

1
@ tp1: Mas você não se importou em ver que eu lidei com eles. Você acabou de dizer "LIDAR COM ELES" sem fazer nada a respeito. Eu não lidei com eles e agora o que? Em vez de usar uma classe RAII que não permite tais erros. Se você tivesse usado unique_ptr, não seria possível escrever um código assim.
DeadMG

1
@ tp1: Notei que o Env pode ser destruído. É isso mesmo. Não parece haver nenhuma funcionalidade para gerenciar objetos. Se eu quisesse gerenciar uma memória mais refinada do que "Tudo o que eu já criei" ou "Nada", parece que estou ferrado.
DeadMG 02/09/12

3
Leve qualquer conversa prolongada ao Chat de Engenharia de Software . Qualquer informação útil pode ser incorporada na pergunta ou resposta?
ChrisF

Respostas:



3

Isso é praticamente impossível. O fato simples é que, às vezes, você precisa do compilador para fazer um trabalho e não pode simplesmente afastar essa necessidade. Não há função que possa criar std::vectoruma biblioteca não somente de cabeçalho. O compilador pode fazer muitas mágicas funcionarem, mas você não pode tê-las sem invocá-lo, e isso é um fato da vida.

Aqui está o que você pode fazer: não use modelos onde não precisar deles. Aqui está o que você não pode fazer: mais nada.

O fato simples é que a recompilação com a nova versão não é realmente tão difícil em comparação com as vantagens de desempenho, segurança e funcionalidade que você pode obter com bibliotecas com tipos estatísticos.


2
Eu mencionei isso como um exemplo para pensar. o que estou procurando é orientação sobre outros problemas semelhantes para os quais devo me preparar e práticas recomendadas para lidar com eles.
Johannes

Bem, se todas as novas versões que quebram a compatibilidade com a ABI são colocadas em um novo espaço de nome em linha, o que importa se é uma biblioteca apenas de cabeçalho ou não?
Deduplicator
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.