Principios de diseño, las mejores prácticas y patrones de diseño para C (o la programación de procedimiento en general)? [cerrado]

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

  •  21-09-2019
  •  | 
  •  

Pregunta

¿Hay principios conocidos de diseño, las mejores prácticas y patrones de diseño que se puede seguir, mientras que el diseño de un proyecto de C? O principios de diseño útiles para procedimental (imperativo) la programación en general?

(soy hijo de la 'generación orientado a objetos' y tienen que diseñar un proyecto de C grande por primera vez)

¿Fue útil?

Solución

ocultación de la información - como el que defiende por Parnas ( Software Fundamentos )

El manejo cuidadoso de los encabezados y la visibilidad:

  • Todo en un archivo de origen que se puede ocultar del mundo exterior debe ser; sólo la interfaz externa documentado debe ser expuesto.
  • Todo lo que se expone se declara en un encabezado.
  • Eso cabecera se utiliza cuando se necesita la funcionalidad (y donde se define).
  • La cabecera es autónomo - cuando lo necesita, que lo utilice, y usted no tiene que preocuparse acerca de 'qué otras cabeceras ¿también tengo que incluir' porque garantiza el encabezado funciona mediante la inclusión de cualquier cosa que necesita para que funcione.
  • La cabecera está autoprotegido -. Por lo que no importa si se incluye varias veces

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • Diseño conjuntos de funciones para trabajar en 'objetos' (generalmente estructuras) - y el uso de dichas funciones en lugar de hurgar las entrañas de la estructura en el código que está utilizando. Piense en ello como encapsulación autoimpuesto.

Otros consejos

Hay una buena, libre, libro en línea, titulado Programación orientada a objetos con ANSI-C , que cubre el tema de la escritura de código orientado a objetos en C. a Búsqueda de google para 'C' orientado a objetos también produce un número de otros ejemplos y recursos buenas.

Si su proyecto es crítico para la seguridad, Misra-C es un conjunto de reglas buena. Se pretende principalmente para c incrustado, pero puede ser útil en otras áreas.

Me considero un codificador OO, y lo hago mucho trabajo con incrustado-C. El mejor consejo que puedo dar, especialmente para grandes proyectos, es no exagerar. La creación de un marco OO completa en la parte superior de la norma ANSI C puede ser muy tentador, pero se necesita una gran cantidad de tiempo y esfuerzo para hacerlo bien. El colombófilo que se obtiene, cuanto más tiempo se gastará la depuración del marco en lugar de trabajar en el real proyecto. Abordar la tarea con la cabeza clara y una buena y sólida base de YAGNI . Mejor de las suertes!

Mis tres consejos:

  • pruebas de la unidad de escritura. Ellos le ayudarán a concentrarse en un diseño que se adapte a su problema a medida que avanza. Mucho mejor que confiar (exclusivamente) en el pensamiento premeditado.
  • Haga que un detector de fugas de memoria (hay todo tipo de bibliotecas por ahí) instalado y en funcionamiento desde el primer día. Tener esta impresión biblioteca a cabo todas las fugas tan pronto como los programas / pruebas salidas. Esto le permitirá coger una fuga tan pronto como se introduce, haciendo de este modo su fijación mucho menos doloroso.
  • código de programación orientada a objetos de escritura en C. No es tan difícil. Si bien es posible emular el reemplazo de métodos, sugiero que comience con la emulación de objetos simples. Incluso este sencillo mecanismo le puede dar un gran rendimiento.

Este es un ejemplo:

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;
}

programación orientada a objetos no es una metodología de una tecnología. Así que mi primer consejo es dejar de pensar en ella como la programación de procedimiento.

punto de Para e.James, que no quieren tratar de volver a crear un lenguaje orientado a objetos o pretender que usted tiene las capacidades de los mismos. Todavía se puede hacer todas las cosas correctas por aferrarse a unos pocos principios simples:

  1. Prueba unidad de todo.
  2. Encuentra lo que varía y encapsular.
  3. Diseño de interfaces.

SEI CERT C Codificación estándar proporciona Buena conjunto de normas y prácticas comunes buenas así como las cosas que usted debe tratar de evitar el uso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top