Princípios de design, melhores práticas e padrões de design para C (ou programação processual em geral)? [fechado
-
21-09-2019 - |
Pergunta
Existem princípios de design conhecidos, melhores práticas e padrões de design que se pode seguir ao projetar um projeto C? Ou princípios úteis de design para programação processual (imperativa) em geral?
(Sou filho da 'geração orientada a objetos' e tenho que projetar um grande projeto C pela primeira vez)
Solução
Informações ocultas - como adotado por parnas (Fundamentos de software).
Gestão cuidadosa de cabeçalhos e visibilidade:
- Tudo em um arquivo de origem que pode ser oculto do mundo exterior deveria estar; Somente a interface externa documentada deve ser exposta.
- Tudo o que é exposto é declarado em um cabeçalho.
- Esse cabeçalho é usado onde a funcionalidade é necessária (e onde está definida).
- O cabeçalho é independente - quando você precisar, você o usa e não precisa se preocupar com 'quais outros cabeçalhos eu também preciso incluir' porque o cabeçalho garante trabalhar.
O cabeçalho é auto -protegido - portanto, não importa se estiver incluído várias vezes.
#ifndef HEADER_H_INCLUDED #define HEADER_H_INCLUDED ...rest of header contents, including other #include lines if necessary #endif /* HEADER_H_INCLUDED */
Conjuntos de funções de design para trabalhar em 'objetos' (geralmente estruturas) - e usam essas funções em vez de zombar das entranhas da estrutura no código que o está usando. Pense nisso como encapsulamento auto-imposto.
Outras dicas
Há um bom livro online gratuito, intitulado Programação orientada a objetos com ANSI-C, que abrange o tópico de escrever código orientado a objetos em C. a pesquisa do Google Para "C orientado a objetos", também produz vários outros bons exemplos e recursos.
Se o seu projeto for crítico de segurança, Misra-C é um bom conjunto de regras. Destina -se principalmente principalmente para C., mas também pode ser útil em outras áreas.
Eu me considero um codificador OO e faço muito trabalho com o Incledded-C. O melhor conselho que posso dar, especialmente para grandes projetos, não é exagerar. Criar uma estrutura OO completa sobre o ANSI C pode ser muito tentadora, mas é preciso muito tempo e esforço para acertar. Quanto mais sofisticado você receber, mais tempo você gastará depurar sua estrutura em vez de trabalhar no real projeto. Aborde a tarefa com uma cabeça clara e uma boa e sólida compreensão de Yagni. Boa sorte!
Meus três conselhos:
- Escreva testes de unidade. Eles o ajudarão a se concentrar em um design que aproveite seu problema à medida que você avança. Muito melhor do que confiar (apenas) no pensamento pré-meditado.
- Tenha um detector de vazamento de memória (existem todos os tipos de bibliotecas por aí) instaladas e funcionando desde o primeiro dia. Peça a esta biblioteca que impede todos os vazamentos assim que o programa/testes sair. Isso permitirá que você pegue um vazamento assim que o introduzir, tornando assim a fixação muito menos dolorosa.
- Escreva o código OOP em C. Não é tão difícil. Embora seja possível emular a substituição do método, sugiro que você comece com a emulação de objetos simples. Mesmo esse mecanismo simples pode lhe dar uma grande quilometragem.
Aqui está um exemplo:
typedef struct Vector {
int size;
int limit;
int* ints;
} Vector;
Vector* Vector_new() {
Vector* res = (Vector*) malloc(sizeof(Vector));
res->limit = 10;
res->size = 0;
res->ints = (int*) malloc(sizeof(int) * res.limit);
return res;
}
void Vector_destroy(Vector* v) {
free(v->ints);
free(v);
}
void Vector_add(Vector* v, int n) {
if(v->size == v->limit) {
v->limit = v->limit * 2 + 10;
v->ints = realloc(v->ints, v->limit);
}
v->ints[v->size] = n;
++v->size;
}
int Vector_get(Vector* v, int index) {
if(index >= 0 && index < v->size)
return v->ints[index];
assert false;
}
OOP é uma metodologia e não uma tecnologia. Portanto, meu primeiro conselho é parar de pensar nisso como programação processual.
Para o ponto de E.James, você não quer tentar recriar uma linguagem orientada a objetos ou fingir que tem os seus recursos. Você ainda pode fazer todas as coisas certas, apegando -se a alguns princípios simples:
- Teste aciona tudo.
- Encontre o que varia e encapsula -o.
- Design para interfaces.
O padrão de codificação sei cert c fornece Bom conjunto de regras e boas práticas comuns bem como as coisas que você deve tentar evitar usar.