Princípios de design, melhores práticas e padrões de design para C (ou programação processual em geral)? [fechado

StackOverflow https://stackoverflow.com/questions/2492446

  •  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)

Foi útil?

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:

  1. Teste aciona tudo.
  2. Encontre o que varia e encapsula -o.
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top