Принципы разработки, Лучшие практики и Шаблоны разработки для C (или Процедурное программирование в целом)? [закрытый]

Там кто-либо - известные принципы разработки, лучшие практики и шаблоны разработки, за которыми можно следовать при разработке проекта C? Или полезные принципы разработки для процедурного (императив), программирующий в целом?

(Я - ребенок 'объектно-ориентированного поколения' и должен разработать большой проект C впервые),

90
задан Dimi 22 March 2010 в 13:16
поделиться

4 ответа

Сокрытие информации - как утверждает Парнас (Основы программного обеспечения).

Тщательное управление заголовками и видимостью:

  • Все в исходном файле, что может быть скрыто от внешнего мира, должно быть скрыто; только документированный внешний интерфейс должен быть открыт.
  • Все, что открыто, объявляется в заголовке.
  • Этот заголовок используется там, где функциональность необходима (и где она определена).
  • Заголовок является самодостаточным - когда он нужен, вы используете его, и вам не нужно беспокоиться о том, "какие еще заголовки я должен включить", потому что заголовок обеспечивает его работу, включая все, что ему нужно для работы.
  • Заголовок является самозащищенным - поэтому не имеет значения, если он включен несколько раз.

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...остальное содержимое заголовка, включая другие строки #include, если необходимо
    #endif /* HEADER_H_INCLUDED */
    
  • Создавайте наборы функций для работы с "объектами" (обычно структурами) - и используйте эти функции вместо того, чтобы копаться во внутренностях структуры в коде, который ее использует. Считайте это самоинкапсуляцией.

63
ответ дан 24 November 2019 в 07:06
поделиться

Мои три совета:

  • Пишите модульные тесты. Они помогут вам сконцентрироваться на дизайне, который решает вашу проблему в дальнейшем. Намного лучше, чем полагаться (исключительно) на заранее продуманное мышление.
  • Установите и запускайте детектор утечек памяти (существуют всевозможные библиотеки) с первого дня. Попросите эту библиотеку распечатать все утечки сразу после выхода из программы / тестов. Это позволит вам поймать протечку сразу же, как только вы ее введете, что сделает ее устранение менее болезненным.
  • Написать ООП-код на C. Не так уж и сложно. Хотя можно имитировать переопределение метода, я предлагаю начать с эмуляции простых объектов. Даже этот простой механизм может дать вам большой пробег.

Вот пример:

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;
}
23
ответ дан 24 November 2019 в 07:06
поделиться

Есть хорошая бесплатная онлайн книга под названием Object-Oriented Programming With ANSI-C, которая охватывает тему написания объектно-ориентированного кода на C. Поиск google по запросу "object-oriented C" также дает ряд других хороших примеров и ресурсов.

Если ваш проект критичен к безопасности, MISRA-C - хороший набор правил. Он предназначен в основном для встраиваемых систем, но может быть полезен и в других областях.

Я считаю себя ОО-кодером, и я много работаю со встроенным Си. Лучший совет, который я могу дать, особенно для больших проектов, - не переусердствовать. Создание полного ОО-фреймворка поверх ANSI C может быть очень заманчивым, но это требует много времени и усилий, чтобы сделать все правильно. Чем фантастичнее вы станете, тем больше времени вы потратите на отладку фреймворка вместо того, чтобы работать над настоящим проектом. Подходите к задаче с ясной головой и хорошим, прочным пониманием YAGNI. Желаю удачи!

22
ответ дан 24 November 2019 в 07:06
поделиться

ООП - это методология, а не технология. Поэтому мой первый совет - перестаньте думать о нем как о процедурном программировании.

К замечанию e.James'а, не стоит пытаться воссоздать объектно-ориентированный язык или притворяться, что у вас есть его возможности. Вы все еще можете делать все правильные вещи, придерживаясь нескольких простых принципов:

  1. Тестируйте все.
  2. Найдите то, что варьируется, и инкапсулируйте это.
  3. Проектируйте под интерфейсы.
7
ответ дан 24 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: