Perl best practices на русском

Jul 13, 2016 09:34

1. Все скобки должны быть в стиле K&R
2. Разделяйте операторы и круглые скобки пробелом
3. Не разделяйте процедуры и круглые скобки, массивы и квадратные скобки, хэши и фигурные скобки пробелами
4. Всегда пишите круглые скобки при вызове операторов и подпрограмм
5. Отделяйте сложные ключи хэшей от окружающих скобок пробелами
6. Отеляйте операторы от операндов пробелами
7. Ставьте точку с запятой в конце каждого выражения
8. Ставьте запятую после каждого значения в многостроковом списке(после последнего элемента - тоже)

9. Используйте ширину экрана в 78 колонок
10. Используйте отступ в 4 пробела
11. Используйте для отступов пробелы, не табы
12. Никогда не ставьте на одной строке два выражения
13. Разделяйте код на блоки
14. Не пишите else на одной строке с закрывающей фигурной скобкой
15. Выравнивайте связанные элементы по вертикали
16. Разбивайте длинные строки на отдельные перед операторами (например, в длинном арифметическом выражении перенос строки надо ставить перед знаком +)
17. Выносите длинные выражения в отдельные строки
18. Отделяйте вызовы операторов в длинных выражениях отступами
19. Разделяйте длинные выражения на отдельные строки перед знаком равно (по аналогии с п.16)
20. Оформляйте каскадные тернарные операторы в колонки
21. Для инициализации длинных списков не используйте запятые, используйте qw или q
22. Доведите свой стиль форматирования кода до автоматизма

Конвенции именования

23. Используйте осмысленные имена переменных
24. Логические (булевы) переменные должны идти после значеий с которыми они сравниваются
25. Помечайте ссылки префиксом _ref
26. Именуйте массивы во множественном числе, а хэши - в единственном
27. Для разделения слов в именах переменных используйте подчеркивание
28. Модули в camel-нотации, перменные и функции - с маленькой буквы через подчеркивание
29. Аббрувиатуры необходимо разделять знаком подчеркивания
30. Сокращайте имена переменных по первым буквам
31. Избегайте двусмысленных слов при именовании
32. Для приватных методов используйте в качестве префикса двойное подчеркивание __

Значения и выражения

34. Используйте интерполируемые операторы только для тех строк, которые должны быть интерполированы
35. Не используйте “” или ” для определения пустых строк, лучше писать: q{}
36. Используйте модуль charnames для специальных ASCII-символов, не числовые представления и не шестнадцатеричные
37. Не используйте в выражениях числа напрямую, лучше помещайте их в константы (например, с помощью модуля Readonly)
38. Десятеричные числа не должны начинаться с нулей, иначе они будут интерпретированы как восьмеричные
39. Используйте подчеркивания для улучшения читабельности длиных чисел (123_234_000_000_000)
40. Разбивайте длинные строковые литераты на несколько строк
41. Используйте heredoc для помещения в переменную многострочных литералов
42. Используйте theredoc когда heredoc конфликтует с вашим выравниванием
43. Каждую heredoc-метку пишите в верхнем регистре
44. При открытии heredoc, заключайте метку heredoc’а в кавычки
45. Не используйте возможность писать строковые литераты без кавычек (barewords)
46. Используйте ‘=>’ для формирования хэшей
47. Не используйте запятые для последовательностей значений ???
48. Не смешивайте высокоприоритетные и низкоприоритетные булевы операторы (&&,|| и and, or)
49. Заключайте списки в скобки
50. Используйте grep для проверки присутствия строки в массиве, для проверки любого другого значения в массиве используйте any() из модуля List::MoreUtils

Переменные

51. Избегайте использования нелексических переменных. Все свои переменные определяйте с my и постарайтесь не пересекаться с множеством зарезервированных perl переменных
52. Не используйте переменные из пакетов в своем коде
53. Если необходимо изменить переменную из пакета, локализуйте ее (local)
54. Инициализируйте все переменные только в локальной области видимости
55. Используйте полноценные английские слова для именования переменных
56. Если вам необходимо изменить пунктуационную переменную, изменяйте ее в локальной области видимости (пунктуационные переменные: $_, $., $|, …)
57. Не используйте regex match variables ???
58. Остерегайтесь модификации через $_
59. Используйте отрицательные индексы для получения последних элементов массива
60. Используйте упрощенное получение среза для массивов и хэшей (для массива: получить элементы со 2-го по 7-ой: @arr[2..7], для хэшей: @hash{‘alice’, ‘alex’, ‘ben’} )
61. Используйте табуляцию при получении срезов:
@frames[ -1, -2, -3 ]
= @active{‘top’, ‘prev’, ‘backup’};
62. Слишком длинные наборы ключей выносите из операций среза в отдельные переменные

Управляющие структуры

63. Старайтесь не использовать постфиксный if
64. Оставьте постфиксный if для исключительный условий (die, last, next)
65. Не используйте постфиксные for, while, unless или until
66. Никогда не используйте unless и until
67. Избегайте C-подобного синтаксиса при написании циклов (плохо: for (my $n=4; $n<=$MAX; $n+=2), хорошо: for my $n (4..$MAX))
68. Избегайте изменения массивов или хэшей внутри циклов
69. Никогда не вызывайте одну и ту же подпрогамму несколько раз в пределах одной итерации
70. Используйте для переменных циклов осмысленные имена
71. Всегда объявляйте для for переменную-итератор с my
72. При генерации нового списка взамен старого используйте map
73. Используйте grep и first при поиске элементов в массивах
74. Используйте for вместо map при изменении массива и сохранении его в новую переменную
75. Используйте подпрограммы для сложных преобразований над списками
76. Никогда не изменяйте $_ в функциях со списковым контекстом
77. Избегайте каскадного нагромождения if
78. Используйте таблицы поиска (table-lookup) вместо каскадной проверки if
79. Используйте тернарный оператор в случае неизбежности каскадной проверки
80. Не используйте do..while циклы
81. Отвергайте как можно больше итераций как можно раньше и завершайте цикл как можно раньше
82. Не контролируйте циклы только ради их контролирования
83. Используйте for и redo вместо while
84. Ставьте метку (label) перед while и при вызове next, last или redo добавляйте название метки после оператора

Документирование

85. Отделяйте документацию для пользователей от документации для разработчиков
86. Используйте стандартную POD-документацию для модулей и приложений
87. Расширяйте и дорабатывайте ваши стандарты POD-документации
88. Пишите пользовательскую документацию внутри файлов с кодом
89. Храните всю пользовательскую документацию в одном месте с файлами исходников
90. По возможности помещайте POD-документацию в конец файла
91. Отделяйте техническую документацию соответственно вышеперечисленным правилам
92. Используйте блоки комментариев для важных замечаний
93. Используйте полнострочные комментарии для объяснения алгоритмов
94. Используйте комментарии # для объяснения тонкостей и странностей в коде
95. Комментируйте все, что может вызвать недоумение или ввести в заблуждение
96. Подумайте, не лучше ли это переписать, чем комментировать
97. Используйте ‘invisible’ POD-секции для длинных технических описаний
98. Проверяйте свою документацию на наличие ошибок, в том числе и синтаксических

Создание функций

99. Не изменяйте ключи сортировки внутри sort
100. Используйте reverse для инвертирования порядка элементов в массивах
101. Используйте reverse в скалярном контексте для инвертирования строк
102. Используйте unpack для извлечения полей фиксированной длины
103. Используйте split для разбиения строк по простому разделителю (паттерну)
104. Используйте Text::CSV_XS для разбиения строк по более сложным паттернам
105. Избегайте использования eval для интерполяции строк в программный код
106. Используйте Sort::Maker для создания собственных подпрограмм сортировки
107. Используйте четвертый аргумент substr для получения результата операции substr
108. Используйте левосторонние функции только по прямому назначению
109. Используйте glob вместо <..>
110. Избегайте вызова select с нецелыми аргументами (например, 0.5 - полсекунды в результате округлится до секунды)
111. Всегда отделяйте блок выполнения фигурными скобками для map и grep
112. Используйте по возможности модули, которые являются встроенными в perl по-умолчанию (Scalar::Util, List::Util, List::MoreUtils)

Процедуры

113. Вызывайте процедуры со скобками, но без предварительного &
114. Не передавайте процедурам такие же имена, как у встроенных процедур
115. Всегда в начале процедуры извлекайте параметры из @_
116. Для процедур, принимающих более трех аргументов передавайте параметры через хэш
117. Используйте defined или exist для проверки существования аргументов процедур
118. Определяйте значения по-умолчанию для аргументов сразу же после их извлечения из @_
119. Всегда возвращайте скаляр при вызове в скалярном контексте
120. Возвращайте списки при вызове процедур в списковом контексте и скаляры при вызове в скалярном контексте
121. Когда не определено ‘общего’ скалярного контекста, используйте Contextual::Return
122. Не используйте прототипы для процедур
123. Всегда возвращайте значения из процедур с использованием return
124. В исключительных ситуациях просто пишите return

Ввод/вывод

125. Не используйте сырые файловые манипуляторы
126. Используйте непрямые файловые манипуляторы
127. Если вы используете файловый манипулятор из пакета, локализуйте его
128. Используйте либо IO::File, либо open с тремя аргументами
129. Никогда не применяйте open, close или print без проверки возможности работы с файлом
130. Закрывайте файловые манипуляторы сразу же по окончании работы с ними
131. При чтении файлов используйте while(<>), а не for(<>)
132. Лучше считывать из файла строками (не блоками/байтами)
133. Делайте блочное считывание из файла с использованием do
134. Для удобства и простоты используйте Perl6::Slurp для поточного считывания из файла
135. Не используйте *STDIN если в этом нет крайней нужды
136. Всегда помещайте файловые манипуляторы в при выводе print
137. Всегда выводите сообщение для интерактивного ввода
138. Не изобретайте тестов для ввода данных
139. Используйте IO::Prompt модуль для ввода данных пользователем
140. Всегда визуализируйте прогресс при выполнении длительных операций в интерактивных приложенияъ
141. Используйте Smart::Comments модуль для автоматизации ваших индикаторов прогресса
142. Избегайте использования select при установленном autoflush

Ссылки
143. Всегда выполняйте разыменование ссылок с использованием стрелки ->
144. Если необходимо разыменовать вложенную ссылку, заключайте выражение в фигурные скобки
145. Никогда не используйте символические ссылки
146. Используйте weaken для предотвращения утечек памяти при работе с перекрестными ссылками

Регулярные выражения

147. Всегда используйте /x флаг
148. Всегда используйте /m флаг
149. Используйте \A и \z как string boundary anchors
150. Используйте \z, а не \Z для обнаружения конца строки
151. Всегда используйте \s флаг
152. Consider mandating the Regexp::Autoflags module
153. Используйте m{} в предпочтение /../ в многострочных регулярных выражениях
154. Не используйте другие ограничители, кроме // и {}
155. Предпочтительно использование простых символьных классов перед экранированными метасимволами (например, вместо . - [.])
156. Предпочтительно использование именованных символов перед экранированными метасимволами. Для этого можно использовать модуль charnames. (например, вместо \177 - \N{DELETE})
157. Используйте Unicode-свойства вместо перечисления символьных классов ( \p{Alphabetic} вместо [A-Za-z]} )
158. В качестве разделителя лучше всего использовать пробел
159. Будьте осторожны при использовании поиска “as much as possible” (символ *)
160. Используйте скобки лишь в том случае, когда вам нужно сохранить значение после выполнения регулярного выражения
161. Используйте нумерованные захватывающие переменные ($1, $2, …) лишь в том случае, если вы уверены в успешности поиска
162. Всегда давайте имена захватывающим скобкам
163. Используйте /gc флаг
164. Создавайте регулярных выражения из таблиц (с помощью join вы можете объединить повторяющиеся сравнения: join ‘|’, qw(a b c d))
165. Создавайте сложные регулярные выражения из более простых частей
166. Используйте по возможноcти модуль Regexp::Common, вместо написания собственных регулярных выражений
167. Всегда используйте символьные классы вместо простых символьных сравнений (вместо a|b|c|d - [abcd])
168. Выносите за скобки общие части строк при альтернативном сравнении (Hello|Bye) Mary
169. Предотвращайте обратный поиск (backtracking)
170. Если это возможно, лучше использовать простое сравнение строк eq, чем сравнение с помощью регулярного выражения

Обработка ошибок

171. Вызывайте исключения вместо возвращения специальных значений или флагов
172. Делайте свои (встроенные) исключения для обработки ошибок
173. Делайте фатальные исключения во всех контекстах
174. Будье особенно внимательны при проверке на работоспособность системных функций
175. Вызывайте исключения при каждом отказе, включая процесс отладки
176. Выводите сообщения об ошибках не из того места, где произошло исключение, а там, где оно было перехвачено
177. Пишите сообщения об ошибках понятные для их получателей
178. Документируйте каждое сообщение об ошибке, которое может увидеть пользователь
179. Передавайте объекты с информацией об ошибке в обработчик исключений
180. Передавайте объекты с информацией об ошибке в обработчик исключений и в том случае, если сообщение для пользователя может изменяться
181. Используйте объекты с информацией об ошибке в случае, если два и более исключения связаны между собой
182. Отлавливайте объекты с информацией об ошибке в порядке их поступления
182. Автоматизируйте создание классов для отлова исключений
184. Извлекайте данные об исключениях в специальных обработчиках

Объекты

192. Создавайте объекты только при необходимости, а не всегда
193. Пишите свойства и методы класса, используя соответствующие критерии объекта
194. Не используйте псевдохэши
195. Не используйте ограниченные хэши
196. Вегда используйте инкапсуляцию при работы с объектами
197. Конструкторы должны иметь одно общее название (new)
198. Не помещайте копирование объектов в конструкторы
199. Всегда создавайте деструкторы
200. При создании методов, следуйте принципам, указанным для подпрограмм
201. Создавайте разные методы для чтения и записи
202. Не используйте lvalue-доступ к атрибутам
203. Не используйте непрямой объектный синтаксис
204. Старайтесь обеспечивать оптимальный интерфейс, а не единый минималистичный
205. Перегружайте только изоморфные операторы алгебраических классов
206. Всегда пишите явное приведение объектов к строкам, числам и логическим значениям

Наследование классов

207. Не используйте управление родительскими классами напрямую
208. При работе с классами оставляйте публичными только необходмые методы и атрибуты
209. Никогда не используйте bless с одним аргументом
210. Передавайте аргументы в конструктор в виде хэша (по ссылке)
211. Отделяйте аргументы для базовых классов префиксами в именах
212. Разделяйте конструтор, инициализацию и деструтор объектов
213. Делайте построение стандартой инфраструктуры классов автоматически
214. Используйте Class:Std to automate the dellocation of attribute data
215. Делайте инициализацию и проверку атрибутов автоматической
216. Опишите приведения :STRINGIFY, :NUMERITY, :BOOLIFY в виде методов
217. Используйте :CUMULATIVE методы вместо обращения к SUPER
218. Не используйте AUTOLOAD()

Модули

219. В первую очередь проектируйте интерфейсы модулей
220. Избегайте дублирования кода. Помещайте повторяющиеся куски кода в подпрограммы, подпрограммы объединяйте в модули
221. Используйте трехзначную систему нумерации версий
222. Указывайте при подключении модулей (use) версии, которые необходимы для работы вашего модуля
223. Экспортируйте разумно и, где это возможно, только по запросам
224. Учитываейте декларируемый экспорт
225. Никогда не делайте переменные частями интерфейсов модулей
226. Создавайте новые модули для фрэймверком автоматически
227. Используйте модули ядра во всех случаях, когда это возможно
228. Используйте модули с CPAN во всех подходящих случаях

Тестирование и отладка

229. Сначала пишите тесты, потом код
230. Стандартизуйте свои тесты с помощью Test::Simple или Test::More
231. Станрдартизуйте свои тестовые пакеты с помощью Test::Harness
232. Пишите тесты для неуспешных случаев выполнения
233. Тестируйте как удачное, так и неудачное выполнение подпрограмм
234. Добавляйте новые тесты перед началом отладки
235. Всегда используйте: use strict
236. Всегда пишите осмысленние сообщения об ошибках
237. Никогда не полагайте, что безошибочная компиляция работает верно
238. Отключайте сообщения об ошибках явно и в минимальной области видимости
239. Познакомьтесь со всеми подпрограммами, предоставляемыми отладчиком perl
240. Используйте при отладке вывод сериализованных структур (Data::Dumper)
241. Используйте для отладки модуль Smart::Comments вместо warn

Разное

242. Используйте системы контроля версий
243. Интегрируйте свой неперловый код в perl-приложения с помощью Inline::modules
244. Старайтесь делать конфигурационные файлы для ваших приложений максимально простыми
245. Не используйте format для вывода структурированных данных
246. Не используйте tie для переменных и файловых манипуляторов
247. Пишите код, понятный другим
248. Прячьте слишком сложные конструкции в процедуры
249. Не оптимизируйте код не замеряя его быстродействие
250. Не оптимизируйте структуры данных, без измерения их эффективности
251. При любом удобном случае применяйте кэширование
252. Автоматизируйте кэширование результатов работы процедур
253. Стандартизуйте стратегию кэширования, которую вы используете
254. Не оптимизируйте ваши приложения не замеряя их быстродействия
255. Будьте осторожны при рефакторинге ваших приложений, чтобы не внести в код ошибки

Взято отсюда http://alexahdp.blogspot.ru/2013/09/perl-best-practices-1.html и http://alexahdp.blogspot.ru/2013/09/perl-best-practices-2.html

Perl Critic distributions and policies - http://perlmaven.com/perl-critic

perl

Previous post Next post
Up