Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
m_
очень сложно.s = connection(file, ...args) s.write(data) .... s.close()
Сижу, разглядываю листинг на Питоне. Отец, глянув издалека на монитор, спрашивает:
— Маяковского читаешь?
quote/406082
bool Memory::SetByte(unsigned int offset, unsigned char value) { if (!inRange(offest)) return 1 Memory[inOffest] = value return 0 }
Copy Source | Copy HTML
- //wtf
- if(foo == bar)
- {
- if(tempVar = foobar(true))
- {
- print(doodle(tempVar));
- }
- else
- {
- print('No Joy');
- }
- }
- else
- {
- if(tempVar = foobar(false))
- {
- print(doodle(tempVar));
- }
- else
- {
- print('Really No Joy');
- }
-
- }
-
-
- //not so wtf
- if(foo == bar) {
- if(tempVar == foobar(true)) {
- print(doodle(tempVar));
- } else {
- print('No Joy');
- }
- }else{
- if(tempVar == foobar(false)) {
- print(doodle(tempVar));
- } else {
- print('Really No Joy');
- }
- }
-
-
- //totally not wtf
- if(foo == bar && (tempVar == fooBar(true) || tempVar == fooBar(false))) {
- print(doodle(tempVar));
- } else {
- print('No Joy');
- }
Если в методе больше 20 строк кода — то она плохо написана
Copy Source | Copy HTML
- // ПЛОХО
- if (someVariable > 10)
- {
- // что-то там
- }
Copy Source | Copy HTML
- // ХОРОШО
- int tresholdValue = 10; // пороговое значение
- if (someVariable > tresholdValue)
- {
- // что-то там
- }
-
1) не использую тернарный условный оператор (?:) — т.к. плохо читаем
int max = value1 > value2 ? value1 : value2;
private int i = 1; // объявляем перменную i и инициализируем ее единичкой
i++; // инкрементируем переменную i
throws HabrException
, а в первой же строке он бросает IllegalArgumentException
. Но можно предположить, что это оговорено в соглашениях для данного проекта, поэтому не критично.IllegalArgumentException
я не документирую отдельно, однако в комментарии к параметру функции указываю pre-condition («Must not be null», в случае title
из примера).Как известно, финансовые и временные затраты на сопровождение программного продукта могут в несколько раз превысить затраты на его разработку. Программа, создаваемая 1 год, может использоваться 10 лет.
Одним из важнейших факторов, влияющих на способность программы к развитию, является правильная организация и оформление исходного текста. Если он написан без соблюдения определенного стиля и системы, без комментариев, представляет собой «мешанину» операторов и знаков препинания, то вносить изменения в него очень сложно даже автору. Представьте, что вы пытаетесь прочесть книгу, текст которой не отформатирован: нет абзацных отступов, разделения абзацев пустой строкой, пробелов после знаков препинания и т. д. Сложности модификации также значительно возрастают по прошествии времени и при необходимости работать с чужой программой.
Правила оформления исходного текста
1. Иерархия конструкций
Подчинение операторов и управляющих конструкций заключается в том, что такие операторы, как операторы цикла (for, while, do), условные операторы (if/else), операторы выбора (switch) имеют основную часть (управляющую конструкцию) и подчиненную часть.
При описании класса в качестве управляющей конструкции выступает заголовочная часть класса.
При определении функции в качестве управляющей конструкции выступает заголовок функции.
2. Количество операторов в строке
Для улучшения читаемости исходного текста программы следует располагать не более одного оператора в строке, что вызвано особенностями человеческого восприятия текста. Кроме того, это облегчает пошаговую отладку в символьных отладчиках.
Использование двух и более операторов в строке допустимо только в том случае, если это позволяет подчеркнуть некоторую систему в локальной последовательности операторов.
3. Отступы (сдвиги)
Правильное использование сдвигов или, иначе, отступов (indentation) является ключевым методом обеспечения читаемости. Идея состоит в том, что отступы зрительно показывают подчиненность (иерархию) операторов. При этом директивы препроцессора (#include, #define и т.д.), описания классов, структур, типов, глобальных данных и определения функций всегда имеют наивысший приоритет, то есть начинаются с крайней левой позиции.
// Number of posts per session
/** Number of posts per session */
Код, который приятно читать