Рейтинг темы:
  • 0 Голос(ов) - 0 в среднем
  • 1
  • 2
  • 3
  • 4
  • 5
15 правил написания качественного кода
#1
Есть миллиарды способов написать плохой код. К счастью, чтобы подняться до уровня качественного кода, достаточно следовать 15 правилам. Их соблюдение не сделает из вас мастера, но позволит убедительно имитировать его.

Правило 1. Следуйте стандартам оформления кода.
У каждого языка программирования есть свой стандарт оформления кода, который говорит, как надо делать отступы, где ставить пробелы и скобки, как называть объекты, как комментировать код и т.д.

Например, в этом куске кода в соответствии со стандартом есть 12 ошибок:

Цитата:for(i=0 ;i<10 ;i++){

Изучайте стандарт внимательно, учите основы наизусть, следуйте правилам как заповедям, и ваши программы станут лучше, чем большинство, написанные выпускниками вузов.

Многие организации подстраивают стандарты под свои специфические нужды. Например, Google разработал стандарты для более чем 12 языков программирования. Они хорошо продуманы, так что изучите их, если вам нужна помощь в программировании под Google. Стандарты даже включают в себя настройки редактора, которые помогут вам соблюдать стиль, и специальные инструменты, верифицирующие ваш код на соответствию этому стилю. Используйте их.

Правило 2. Давайте наглядные имена.
Ограниченные медленными, неуклюжими телетайпами, программисты в древности использовали контракты для имён переменных и процедур, чтобы сэкономить время, стуки по клавишам, чернила и бумагу. Эта культура присутствует в некоторых сообществах ради сохранения обратной совместимости. Возьмите, например, ломающую язык функцию C wcscspn (wide character string complement span). Но такой подход неприменим в современном коде.

Используйте длинные наглядные имена наподобие complementSpanLength, чтобы помочь себе и коллегам понять свой код в будущем. Исключения составляют несколько важных переменных, используемых в теле метода, наподобие итераторов циклов, параметров, временных значений или результатов исполнения.

Гораздо важнее то, чтобы вы долго и хорошо думали перед тем, как что-то назвать. Является ли имя точным? Имели ли вы ввиду highestPrice заместо bestPrice? Достаточно ли специфично имя, дабы избежать его использования в других контекстах для схожих по смыслу объектов? Не лучше ли назвать метод getBestPrice заместо getBest? Подходит ли оно лучше других схожих имён? Если у вас есть метод ReadEventLog, вам не стоит называть другой NetErrorLogRead. Если вы называете функцию, описывает ли её название возвращаемое значение?

В заключение, несколько простых правил именования. Имена классов и типов должны быть существительными. Название метода должно содержать глагол. Если метод определяет, является ли какая-то информация об объекте истинной или ложной, его имя должно начинаться с «is». Методы, которые возвращают свойства объектов, должны начинаться с «get», а устанавливающие значения свойств — «set».

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

Вдобавок, убедитесь, что для вашего приложения или библиотеки есть руководство, объясняющее, что ваш код делает, определяющий его зависимости и предоставляющий инструкции для сборки, тестирования, установки и использования. Документ должен быть коротким и удобным; просто README-файла часто достаточно.

Правило 4. Не повторяйтесь.
Никогда не копируйте и не вставляйте код. Вместо этого выделите общую часть в метод или класс (или макрос, если нужно), и используйте его с соответствующими параметрами. Избегайте использования похожих данных и кусков кода. Также используйте следующие техники:
Создание справочников API из комментариев, используя Javadoc и Doxygen.
Автоматическая генерация Unit-тестов на основе аннотаций или соглашений об именовании.
Генерация PDF и HTML из одного размеченного источника.
Получение структуры классов из базы данных (или наоборот).

Правило 5. Проверяйте на ошибки и реагируйте на них.
Методы могут возвращать признаки ошибки или генерировать исключения. Обрабатывайте их. Не полагайтесь на то, что диск никогда не заполнится, ваш конфигурационный файл всегда будет на месте, ваше приложение будет запущено со всеми нужными правами, запросы на выделение памяти всегда будут успешно исполнены, или что соединение никогда не оборвётся. Мой компьютер - лучший паблик! Да, хорошую обработку ошибок тяжело написать, и она делает код длиннее и труднее для чтения. Но игнорирование ошибок просто заметает проблему под ковёр, где ничего не подозревающий пользователь однажды её обнаружит.

Правило 6. Разделяйте код на короткие, обособленные части.
Каждый метод, функция или блок кода должна умещаться в обычном экранном окне (25-50 строк). Если получилось длиннее, разделите на более короткие куски. Даже внутри метода разделяйте длинный код на блоки, суть которых вы можете описать в комментарии в начале каждого блока.

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

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

Правило 8. Не переусердствуйте с проектированием.
Проектируйте только то, что актуально сейчас. Ваш код можно делать довольно обобщённым, чтобы он поддерживал дальнейшее развитие, но только в том случае, если он не становится от этого слишком сложным. Не создавайте параметризованные классы, фабрики, глубокие иерархии и скрытые интерфейсы для решения проблем, которых даже не существует — вы не можете угадать, что случится завтра. С другой стороны, когда структура кода не подходит под задачу, не стесняйтесь рефакторить его.

Правило 9. Будьте последовательны.
Делайте одинаковые вещи одинаковым образом. Если вы разрабатываете метод, функциональность которого похожа на функциональность уже существующего, то используйте похожее имя, похожий порядок параметров и схожую структура тела. То же самое относится и к классам. Создавайте похожие поля и методы, делайте им похожие интерфейсы, и сопоставляйте новые имена уже существующим в похожих классах.

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

Правило 10. Избегайте проблем с безопасностью.
Современный код редко работает изолированно. У него есть неизбежный риск стать мишенью атак. Они необязательно должны приходить из интернета; атака может происходить через входные данные вашего приложения. В зависимости от вашего языка программирования и предметной области, вам возможно стоит побеспокоиться о переполнении буфера, кросс-сайтовых сценариях, SQL-инъекциях и прочих подобных проблемах. Изучите эти проблемы, и избегайте их в коде. Это не сложно.

Правило 11. Используйте эффективные структуры данных и алгоритмы.
Простой код часто легче сопровождать, чем такой же, но изменённый ради эффективности. К счастью, вы можете совмещать сопровождаемость и эффективность, используя структуры данных и алгоритмы, которые даёт ваш фреймворк. Используйте map, set, vector и алогоритмы, которые работают с ними. Благодаря этому ваш код станет чище, быстрее, более масштабируемым и более экономным с памятью. Например, если вы сохраните тысячу значений в отсортированном множестве, то операция пересечения найдёт общие элементы с другим множеством за такое же число операций, а не за миллион сравнений.

Правило 12. Используйте Unit-тесты.
Сложность современного ПО делает его установку дороже, а тестирование труднее. Продуктивным подходом будет сопровождение каждого куска кода тестами, которые проверяют корректность его работы. Этот подход упрощает отладку, т.к. он позволяет обнаружить ошибки раньше. Unit-тестирование необходимо, когда вы программируете на языках с динамической типизацией, как Python и JavaScript, потому что они отлавливают любые ошибки только на этапе исполнения, в то время как языки со статической типизацией наподобие Java, C# и C++ могут поймать часть из них во время компиляции. Unit-тестирование также позволяет рефакторить код уверенно. Вы можете использовать XUnit для упрощения написания тестов и автоматизации их запуска.

Правило 13. Сохраняйте код портируемым.
Если у вас нет особой причины, не используйте функциональность, доступную только на определённой платформе. Не полагайтесь на то, что определённые типы данных (как integer, указатели и временные метки) будут иметь конкретную длину (например, 32 бита), потому что этот параметр отличается на разных платформах. Храните сообщения программы отдельно от кода и на зашивайте параметры, соответствующие определённой культуре (например, разделители дробной и целой части или формат даты). Соглашения нужны для того, чтобы код мог запускаться в разных странах, так что сделайте локализацию настолько безболезненной, насколько это возможно.

Правило 14. Делайте свой код собираемым.
Простая команда должна собирать ваш код в форму, готовую к распространению. Команда должна позволять вам быстро выполнять сборку и запускать необходимые тесты. Для достижения этой цели используйте средства автоматической сборки наподобие Make, Apache Maven, или Ant. В идеале, вы должны установить интеграционную систему, которая будет проверять, собирать и тестировать ваш код при любом изменении.

Правило 15. Размещайте всё в системе контроля версий.
Все ваши элементы — код, документация, исходники инструментов, сборочные скрипты, тестовые данные — должны быть в системе контроля версий. Git и GitHub делают эту задачу дешёвой и беспроблемной. Но вам также доступны и многие другие мощные инструменты и сервисы. Вы должны быть способны собрать и протестировать вашу программу на сконфигурированной системе, просто скачав её с репозитория.

Заключение.
Сделав эти 15 правил частью вашей ежедневной практики, вы в конце концов создадите код, который легче читать, который хорошо протестирован, с большей вероятностью запустится корректно и который будет гораздо проще изменить, когда придёт время. Вы также убережёте себя и ваших пользователей от большого числа головных болей.

Если статья оказалась вам полезной, вы можете отблагодарить кликом благодарности.

Оригинал статьи https://tproger.ru/translations/15-rules...lity-code/
Ответ
#2
Стив Макконнелл, Совершенный код /thread
А пост не читал, разве что пару пунктов, которые древние и не очень для новичков.
Ответ
#3
Newble Написал:Если статья оказалась вам полезной, вы можете отблагодарить кликом благодарности.

Интересно... Благодарность за ваш копипаст? Хоть бы источник указали, например этот
L2j Pane v1.7 - админка для вашего L2 сервера
Ответ
#4
Aleksey Написал:Интересно... Благодарность за ваш копипаст? Хоть бы источник указали, например этот

Полезная тема, в зоне видимости. Когда гуглиш, источник выпадает и на ЗГ. Я и не указывал, что этот пост лично мой. Но больше новичков, по переходам на пост, смогут найти на форуме ЗГ и другую информацию.

Информация весьма полезна. Если имеете, что либо против, пишите прям в тему. Я выслушаю ваши замечания, по посту, для новичков.

Я очень сожалею, что пост вами воспринимается, как вымогательство. Денег я никаких не просил, и не писал, "Ознакомился, ставь спс". Кто посчитает нужным, что информация полезна и решит, что автор поста заслужил благодарность, тот поставит.

Я разместил, полезную статью, а не троллинг, глупый вопрос,или рекламу. Так что, вполне вероятно, можно ознакомившись, и спасибо кликнуть, если оказалось полезным. А копипастить, я думаю, еще ни кто не запрещал.
Ответ
#5
Newble Написал:Полезная тема, в зоне видимости. Когда гуглиш, источник выпадает и на ЗГ. Я и не указывал, что этот пост лично мой. Но больше новичков, по переходам на пост, смогут найти на форуме ЗГ и другую информацию.

Информация весьма полезна. Если имеете, что либо против, пишите прям в тему. Я выслушаю ваши замечания, по посту, для новичков.

Я очень сожалею, что пост вами воспринимается, как вымогательство. Денег я никаких не просил, и не писал, "Ознакомился, ставь спс". Кто посчитает нужным, что информация полезна и решит, что автор поста заслужил благодарность, тот поставит.

Я разместил, полезную статью, а не троллинг, глупый вопрос,или рекламу. Так что, вполне вероятно, можно ознакомившись, и спасибо кликнуть, если оказалось полезным. А копипастить, я думаю, еще ни кто не запрещал.

Не путайте, претензия не к контенту, а к копирайтам. Источников много, но на мой взгляд вам бы стоило указать тот, откуда вы делали ctrl+c ctrl+v
L2j Pane v1.7 - админка для вашего L2 сервера
Ответ
#6
Aleksey Написал:Не путайте, претензия не к контенту, а к копирайтам. Источников много, но на мой взгляд вам бы стоило указать тот, откуда вы делали ctrl+c ctrl+v

А на мой взгляд, меня ни кто не обязывал писать от руки,а так же осведомлять об источниках. При желании могу скопировать из достоверного источника, и разместить, полезную информацию тут. Или вы с этим не согласны?

Вот правила форума написано непосредственно Администратором.
https://forum.zone-game.info/showthread.php?t=2287

Найдите ка мне, запрет на копипаст из гугл источников. В противном случае ваши сообщения будут рассмотрены как провокация, или посты не имеющие смысла относящегося к теме, а так же замечания не по теме, составлена петиция, и отправлена модераторам на рассмотрение.

В моем посту ни кто ни кого не обязывал, как либо меня поощрять. Если вам по прежнему это не ясно, примите мои соболезнования.
Ответ
#7
Newble Написал:А на мой взгляд, меня ни кто не обязывал писать от руки,а так же осведомлять об источниках. При желании могу скопировать из достоверного источника, и разместить, полезную информацию тут. Или вы с этим не согласны?

Вот правила форума написано непосредственно Администратором.
https://forum.zone-game.info/showthread.php?t=2287

Найдите ка мне, запрет на копипаст из гугл источников. В противном случае ваши сообщения будут рассмотрены как провокация, или посты не имеющие смысла относящегося к теме, а так же замечания не по теме, составлена петиция, и отправлена модераторам на рассмотрение.

В моем посту ни кто ни кого не обязывал, как либо меня поощрять. Если вам по прежнему это не ясно, примите мои соболезнования.

Да к черту, что с вами спорить, общество потреблядства. Может уж все статьи скопируете с гугла тут?

А чтобы не быть голословным - расскажите про 12 ошибок попунктно, если понимаете, о чем пишите.

Цитата:Например, в этом куске кода в соответствии со стандартом есть 12 ошибок:

Цитата:
for(i=0 ;i<10 ;i++){
Изучайте стандарт внимательно, учите основы наизусть, следуйте правилам как заповедям, и ваши программы станут лучше, чем большинство, написанные выпускниками вузов.
L2j Pane v1.7 - админка для вашего L2 сервера
Ответ
#8
Очень интересно. Назревает вопрос, или скорее просьба. Не мог бы кто показать как реально правильно писать на с#? Какие есть уже выработанные технологии по разработке приложений winforms тесно связанных с БД? К примеру видел с# сервер линейки от кролика. Достаточно дико для меня выглядел кусок селект запроса, в котором по while-у заполнялись обьекты классов. Ведь не раз слышал, что данный программист талантливый и опытный. Я обычно вытягиваю с БД таблицу в виде Ienumerable, а потом через linq уже орудую готовыми данными. Почему так, или иначе? Есть кто опытный в данной отрасли, кто может показать достаточно удобные решения в данном русле и натолкнуть на мысль, как же всё-таки правильно?
Ответ
#9
Aleksey Написал:Да к черту, что с вами спорить, общество потреблядства. Может уж все статьи скопируете с гугла тут?

А чтобы не быть голословным - расскажите про 12 ошибок попунктно, если понимаете, о чем пишите.
когда я был не согласен с данным субьектом, и дал - репу, он мне в приват очень просил не минусовать, так как ему очень важна репутация. зачем - не уточнялся. думаю, статья из той же оперы.
Ответ
#10
Aleksey Написал:Да к черту, что с вами спорить, общество потреблядства. Может уж все статьи скопируете с гугла тут?

А чтобы не быть голословным - расскажите про 12 ошибок попунктно, если понимаете, о чем пишите.

Вас ни кто не оскорблял. Обратите внимание на свое поведение.

Кусочек кода принадлежит вычеслению цикла. Какого именно сказать не могу. Но точно не бесконечного цикла.

А вообще, условие i++ считаю не актуальным.

Добавлено через 2 минуты
epmak Написал:когда я был не согласен с данным субьектом, и дал - репу, он мне в приват очень просил не минусовать, так как ему очень важна репутация. зачем - не уточнялся. думаю, статья из той же оперы.

Разумеется, ведь к теме которая была на тот момент актуальна, вы вообще отношения никакого не имели. И вы не имеете никакого права, минусовать, "от фонаря", а так же из за личной неприязни(хотя какой вообще не понимаю, мы с вами даже не знакомы). Впрочем как и сейчас. Более того, в вашем мнении не нуждаюсь. Вставляйте свои 5 копеек, и набивайте посты в темах своих друзей.
Ответ


Возможно похожие темы ...
Тема Автор Ответы Просмотры Последний пост
  Универсальная система оценки кода foxovsky 3 1,527 06-14-2016, 06:45 PM
Последний пост: Sojang
  Какой есть софт для актуализации кода из SVN? flopix 6 1,663 01-28-2016, 04:38 PM
Последний пост: n3k0nation
  Многократное нарушение Правил Krasavella 30 5,180 07-01-2013, 01:38 PM
Последний пост: Zeratyl
  Почему цензоры не знают правил форума? Krasavella 26 5,365 05-05-2013, 02:57 PM
Последний пост: MrShyr
  Расшифровка кода xolseg 5 2,322 07-13-2012, 09:56 PM
Последний пост: Aquanox

Перейти к форуму:


Пользователи, просматривающие эту тему: 1 Гость(ей)