Принципы проектирования, лучшие практики и шаблоны проектирования для C (или процедурного программирования в целом)?[закрыто]
-
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;
}
ООП — это методология, а не технология.Поэтому мой первый совет: перестаньте думать об этом как о процедурном программировании.
По мнению Э.Джеймса, вы не хотите пытаться воссоздать объектно-ориентированный язык или притворяться, что у вас есть его возможности.Вы все равно можете поступать правильно, придерживаясь нескольких простых принципов:
- Тест-драйв всего.
- Найдите то, что меняется, и инкапсулируйте это.
- Проектирование интерфейсов.
Стандарт кодирования SEI CERT C обеспечивает Хороший набор правил и общепринятая передовая практика а также вещи, которых следует избегать.