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

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

  •  21-09-2019
  •  | 
  •  

Вопрос

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

(Я представитель «объектно-ориентированного поколения», и мне впервые пришлось разработать большой проект на языке C.)

Это было полезно?

Решение

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

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

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

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • Создавайте наборы функций для работы с «объектами» (обычно структурами) — и используйте эти функции, а не копаетесь во внутренностях структуры в коде, который ее использует.Думайте об этом как о добровольной инкапсуляции.

Другие советы

Есть хорошая бесплатная онлайн-книга под названием Объектно-ориентированное программирование с использованием ANSI-C, в котором рассматривается тема написания объектно-ориентированного кода на C.А поиск Гугл для «объектно-ориентированного C» также есть ряд других хороших примеров и ресурсов.

Если ваш проект имеет решающее значение для безопасности, МИСРА-С это хороший набор правил.Он предназначен в основном для встроенного языка C, но может быть полезен и в других областях.

Я считаю себя объектно-ориентированным программистом и много работаю со встроенным C.Лучший совет, который я могу дать, особенно для крупных проектов, — не переусердствовать.Создание полноценной объектно-ориентированной среды на основе ANSI C может быть очень заманчивым, но для того, чтобы сделать это правильно, требуется много времени и усилий.Чем изобретательнее вы становитесь, тем больше времени вы потратите на отладку своей среды вместо работы над настоящий проект.Подходите к задаче с ясной головой и хорошим, твердым пониманием ЯГНИ.Удачи!

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

  • Пишите модульные тесты.Они помогут вам сосредоточиться на дизайне, который соответствует вашей проблеме, по мере продвижения вперед.Гораздо лучше, чем полагаться (исключительно) на заранее обдуманное мышление.
  • Установите и запустите с первого дня детектор утечки памяти (есть всевозможные библиотеки).Пусть эта библиотека распечатает все утечки сразу после завершения программы/тестов.Это позволит вам обнаружить утечку сразу же после ее появления, что сделает ее устранение гораздо менее болезненным.
  • Напишите ООП-код на 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;
}

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

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

  1. Тест-драйв всего.
  2. Найдите то, что меняется, и инкапсулируйте это.
  3. Проектирование интерфейсов.

Стандарт кодирования SEI CERT C обеспечивает Хороший набор правил и общепринятая передовая практика а также вещи, которых следует избегать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top