Рефакторинг, когнетика и дезодорант
1 сентября 2009



В этой заметке речь пойдет об одном интересном совпадении, которое автор заметил, когда читал книгу Дональда Номана The Design of Everyday Things.

Речь пойдет о рефакторинге, который представляет собой набор приёмов для улучшения программного кода, о когнетике — науке, которая похожа на эргономику, но изучает не физические, а ментальные (умственные) ограничения человека, а также о дезодоранте, который, как оказалось, есть и там и там.

Так как заметка может заинтересовать и дизайнеров и программистов — скажу пару слов о рефакторинге и когнетике.
doet.jpg
Дональд Норман,
The Design of Everyday Things
(USA, 2002. ISBN 0-465-06710-7)



Рефакторинг

Итак рефакторинг — это, всего-навсего, набор приемов, которые позволяют сделать код лучше, но, что важно, не изменяя того, что это код делает. То есть внутри код становится лучше, а работает абсолютно так же как и до модификаций. Лучше обычно означает проще для понимания [другими программистами] и модификаций.



Рассмотрим небольшой пример. Допустим ваш Директор, Артемий Лебедев, попросил вас написать программу для расчета заработной платы по его собственной методологии (потраченное время на коэффициент). Для простоты представим, что коэффициент для всех фиксированный и составляет 1,5. Упрощенный код такой программы мог бы выглядеть так:

IvanovsSalary := IvanovWorkingHours * 1.5;
PetrovSalary := PetrovWorkingHours * 1.5;
SidorovSalary := SidorovWorkingHours * 1.5;



В этом коде есть существенный недостаток — коэффициент на который надо умножать рабочие часы (1,5) повторяется. Если вдруг Артемий попросит вас изменить коэффициент, то вам придется исправлять его трижды, и есть вероятность, что вы забудете изменить его в одном из мест.

Подобные ошибки в рамках рефакторинга называются плохими запахами. Описанный выше запах называется «Дублирующимся кодом» и может быть устранен, например, вынесением коэффициента в константу.

const
  Factor = 1.5;

IvanovsSalary := IvanovWorkingHours * Factor ;
PetrovSalary := PetrovWorkingHours * Factor ;
SidorovSalary := SidorovWorkingHours * Factor ;


Такой код гораздо безопаснее, так как при необходимости коэффициент нужно будет поменять только в одном месте.

Весь рефакторинг, по сути — это список плохих запахов и каталог способов их устранения.

avis_rara:
— Расскажи о ценообразовании на работы студии?
tema:
— Время сотрудников умноженное на коэффициент = цена.
Из народной приемной



Когнетика

Обратимся теперь к когнитивной психологии и проектированию интерфейсов.

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

В качестве примера можно рассмотреть варочную поверхность. Очень часто конфорки на таких поверхностях расположены квадратом, а ручки в линию.
badcookingsurface1.jpg
Это типичный пример нарушения принципа естественного соответствия, потому что нельзя однозначно сказать какая ручка управляет какой конфоркой. Иными словами, трудно понять как четыре конфорки, расположенные квадратом, отображаются в четыре ручки, расположенные в линию; любой из 24 вариантов кажется одинаково возможным.

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

squarecookingsurface.jpg 


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



Дезодорант

Что же общего может быть у рефактиринга и когнитивной психологии? — Дезодорант.

Все знают, что комментарии в коде — это хорошо. Однако в книге Мартина Фаулера про рефакторинг комментарии упоминаются в списке плохих запахов. Неужели Мартин считает комментарии плохими? — Нет, ни в коем случае. В этот список к плохим запахам комментарии попали потому, что часто они являются признаком плохого кода. Подобно дезодоранту они могут скрывать проблемы, выдавая плохой код за хороший.

Взглянем теперь на варочную поверхность, в которой не использовался принцип естественного соответствия. Ведь как-то же ей можно пользоваться? — Конечно, ведь заботливый производитель снабдил ручки небольшими пиктограммками, которые объясняют, какой из 24 вариантов отображения используется.

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


Вывод

Осталось обобщить найденное соответствие. И комментарии и интерфейсная справка — это всё подсказки.

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

Поэтому найдя подсказку нужно, во-первых, проверить, что это не дезодорант и если она окажется таковой — превратить дезодорант в духи.

Сделать из подсказки-дезодоранта духи очень просто.

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

refactoring-improving_the_design_of_existing_code.jpg
Martin Fowler,
Refactoring: Improving the Design of Existing Code
(USA, 2000. ISBN 0-201-48567-2)

badcookingsurface1.jpg



Николай Товеровский
При использовании материалов ссылка на ksoftware.ru обязательна.

См. также