вторник, 24 сентября 2013 г.

Perl best practices на русском (часть 2)

Данная статья является второй частью свободного перевода заголовков глав книги “Perl Best Practices Standards and Styles for Developing Maintainable Code” (Damian Conway). В статье я постарался в максимально сжатом виде пересказать основные тезисы и рекомендации, приводимые в книге. К сожалению, книги на русском я не нашел, именно поэтому привожу здесь данный перевод. Если какой-то из пунктов покажется вам непонятным, советую обратиться непосредственно к книге, или пишите комментарии. Со многими приведенными здесь рекомендациями я сам не согласен, но оставляю их в неизменном виде.

Ссылки
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. Будьте осторожны при рефакторинге ваших приложений, чтобы не внести в код ошибки