вторник, 22 мая 2007 г.

Удобочитаемый код

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

"Время от времени я натыкаюсь на столь поразительные образцы кода, что не могу не рассказывать о них в течение месяцев, а то и лет. Так произошло и тогда, когда я изучал образец кода, написанного Вардом Каннингемом (Ward Cunningham)...
...Изучаемый мною код представлял часть вымышленной системы платежных ведомостей, предназначенной для использования на семинаре по рефакторингу. Как одному из преподавателей семинара, мне было необходимо предварительно разобраться в коде. Я начал с просмотра тестирующего кода. Первый же разобранный мною тестовый метод вычислял выплаченную сумму для данной даты. Что сразу бросилось мне в глаза, так это дата. Код гласил:

november(20, 2005)

Этот код вызывал следующий метод:

public void Date november(int day, int year)

Я был удивлен и восхищен. Даже в тестовом коде Вард беспокоился о написании легко воспринимаемого метода. Если бы он не испытывал желания написать простой и легкий для понимания код, он бы написал так:

java.util.Calendar c = java.util.Calendar.getInstance();
c.set(2005, java.util.Calendar.NOVEMBER, 20);
c.getTime();

И хотя этот код создает ту же дату, что и предыдущий, в нем отсутствует многое из того, что присуще методу Варда november(), который:

  • читается как фраза на обычном языке;
  • отделяет важный код от побочного.

А вот совершенно другая история. Она касается метода с названием w44(). Функцию w44() я обнаружил в куче мусора на языке Turbo Pascal, которую пердставлял собой калькулятор ссуд большого банка на Уолл-стрит. Свои первые три недели карьеры профессионального программиста я потратил на исследование этой трясины. В конце концов я выяснил, что 44 - это ASCII-код запятой, а "w" означает "with". Таким образом, для программиста название w44() было способом указать, что данная подпрограмма возвращает число в текстовом формате с запятыми. Это надо же было додуматься! Программист или решил обеспечить секретность работы, или просто не выработал способ именования функций.

Мартин Фаулер (Martin Fowler) выразил это лучше:

"Каждый дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям"."

Комментариев нет: