Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 159
1

Есть ли какие-то общие рекомендации по организации кода на Си?

02.12.2016, 19:03. Просмотров 927. Ответов 6
Метки нет (Все метки)

Здравствуйте! Есть следующий вопрос. Есть ли какие-то общие рекомендации по организации кода, конкретно по файлам и папкам. Например, я пишу DNS Resolver, есть ли смысл расбрасывать каждую функцию в отдельный файл? Или же есть какие-то другие подходы?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.12.2016, 19:03
Ответы с готовыми решениями:

Какие рекомендации по улучшению оформления кода вы можете предложить?
#include <stdio.h> #include <malloc.h> // Замечания по оформлению: // 1) Ко именам типов...

Какие есть рекомендации для обхода совпадения имён функций?
Вот тестовый пример: data Dat1 = Dat1 {x::Int,y::Int} data Dat2 = Dat2 {y::String,x::String}...

Чем лучше открывать .h .И есть ли какие то рекомендации и предостережения в работе с ними?
Посоветуйте, чем лучше открывать .h .И есть ли какие то рекомендации и предостережения в работе с...

Принципы организации css кода и его семантика – какие существуют варианты и чем отличаются?
Доброго времени суток! Данная тема является скорее темой-обсуждением, чем темой-вопросом. Я...

Какие есть правила по написанию кода в VB?
В процессе работы с большими проектами стала интересовать информация о правильном написании кода....

6
cordfield
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 189
02.12.2016, 20:09 2
Функции следует группировать по смыслу в различные файлы, причём так, чтобы файлы не были слишком длинными. Примерно 500 строчек кода это нормальный размер для файла. Могут быть и файлы поменьше.
Каждую крупную часть программы, обладающую законченным функционалом и слабо зависящую от других частей, выделяют в отдельную папку и называют модулем. Обычно в модуле 5-20 пар файлов .h/.c. Если модулей много, их группируют в папки более высокого уровня.
Иногда модуль состоит из 1-2 заголовочных файлов и папки src с реализацией модуля. Это делается для удобства: чтобы воспользоваться функциональностью модуля достаточно подключить 1 заголовочный файл и не лезть внутрь.
3
Убежденный
Ушел с форума
Эксперт С++
16145 / 7292 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
02.12.2016, 23:05 3
Я бы посоветовал раскидывать функции по файлам не только по смысловым или
логическим признакам, но и для того, чтобы иметь больше возможностей
для тестирования.

Например, файл с реализацией функции можно заинклудить в тестовый код,
предварительно описав все ее зависимости дефайнами. Получим компактный и
изолированный от всего остального материал для теста. Если у тебя в одном
файле будет пять, десять или больше функций, то тестировать их будет сложнее.

К сожалению, для C, если не прибегать к 'opaque handle', реализации
виртуальных таблиц а-ля C++ и т.п., это чуть ли не единственный способ
тестирования, который позволяет не трогать код тестируемой функции.
2
si1n3rd
42 / 41 / 17
Регистрация: 27.04.2016
Сообщений: 159
03.12.2016, 00:16  [ТС] 4
Убежденный, еще такой вопрос, насколько глубоким должен быть уровень декомпозиции? Насколько я понимаю, то каждая функция должна выполнять одну минимальную задачу. Или у меня неправильное понимание этого термина?
0
cordfield
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 189
03.12.2016, 10:42 5
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Желательно, чтобы число строк в функции не превышало больше, чем в 2 раза количество строк, помещающееся на экране. Это помогает видеть большую часть функции одновременно.

Декомпозиция зависит от поставленной задачи.

Предположим, задача написать функцию strrev, переворачивающую строку задом наперёд. Она состоит из следующих этапов:
1. Найти конец строки
2. В цикле пройтись по левой половине строки
2.1. При этом менять местами текущий символ с симметричным ему символом в правой половине строки.

Здесь можно выделить 2 подфункции: функцию поиска конца строки и функцию обмена местами двух символов.

Функцию обмена местами символов выделять нет смысла. Во-первых, она слишком простая. Во-вторых, если действительно произойдёт вызов такой операции как функции, то стоимость вызова функции будет достаточно большой. От компьютера потребуется больше усилий и времени на вызов функции и передачу ей параметров, чем на выполнение её программного кода. Это тоже следует учитывать при декомпозиции.

Функцию поиска конца строки имеет смысл выделить по нескольким причинам. Во-первых, она выполняет чётко поставленную задачу, независимую от других задач, и её входные и выходные данные строго определены. Во-вторых, данную функцию можно будет использовать повторно и неоднократно в других местах программы (если это не так, возможно, подфункцию выделять не следует).

На практике в реализации strrev вместо функции поиска конца строки используют функцию-аналог, strlen. По стандарту такая функция точно должна существовать, а создавать большое количество функций, которые делают по сути одно и тоже - нехорошо. Ведь каждую из этих функций придётся тестировать.
2
Убежденный
Ушел с форума
Эксперт С++
16145 / 7292 / 1182
Регистрация: 02.05.2013
Сообщений: 11,637
Записей в блоге: 1
Завершенные тесты: 1
03.12.2016, 15:44 6
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Цитата Сообщение от si1n3rd Посмотреть сообщение
насколько глубоким должен быть уровень декомпозиции?
В моем понимании - максимально возможным, пока в этом есть смысл.
Противопоказания этому тоже есть. Например, чрезмерная декомпозиция
приводит к некоторому "разбуханию" кода, иногда из-за нее код теряет в
эффективности, т.к. сказываются накладные расходы на создание
стековых фреймов и вызовов функций.

В свое время довольно много пришлось работать с откровенным "спагетти-кодом" и
такая манера написания, когда в одну функцию понапихают всего-всего,
сейчас прилично бесит. Так что лучше немного потерять в эффективности (как
правило, очень немного), но получить красивый, аккуратный и декомпозированный код,
чем иметь быструю, глючную и не поддающуюся сопровождению простыню.
0
Evg
Эксперт CАвтор FAQ
19792 / 7431 / 561
Регистрация: 30.03.2009
Сообщений: 20,734
Записей в блоге: 30
03.12.2016, 16:31 7
Лучший ответ Сообщение было отмечено si1n3rd как решение

Решение

Если руководствоваться формальными критериями типа "функция должна быть размером не более, чем в два экрана" или "размер файла не должен превышать сто строк", то рано или поздно наступит момент, когда часть кода превратится в помойку. Всегда нужно руководствоваться в первую очередь разумными соображениями, и только потом формальными. И всегда при написании кода в первую очередь нужно думать о том, что код должен быть понятным для чтения. Да, бывают ситуации, когда ещё и о производительности думать надо, но по опыту могу тебе сказать, что 90% людей думают о производительности не правильно и не в тех местах. А потому до тех пор, пока не появится реальный опыт работы, особенно в вопросах производительности, в первую очередь нужно думать о том, чтобы код был хорошо читаемым (понимаемым) и только во вторую очередь думать о производительности (а на ранних этапах программирования о производительности лучше вообще не думать)

Можно прочесть миллион советов по оформлению кода, но пока не начнёшь ходить по граблям и по минным полям, реальное понимание всё равно не придёт. Да, советы полезны, потому что "дурак учится на своём опыте, а умный на чужом", но как ни крути, кроме как на собственных ошибках выучиться невозможно
3
03.12.2016, 16:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.12.2016, 16:31

Использование C++ кода внутри программы на C: какие есть варианты?
Есть программа на C++, и в ней кое-какие нужные функции, которые хотелось бы использовать в...

А какие есть способы написания кода с параллельным просмотром в браузере?
Типа LiveReload, или по принципу редактора Brackets. подскажите, пожалуйста, все способы,...

Подскажите какие платные есть варианты для встроенного редактора кода?
Необходимо в свое приложение включить редактор кода. Нашел пока два варианта:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru