
Дублювання дешевше за неправильну абстракцію — застереження Сенді Мец
У доповіді на RailsConf 2014 року та есе 2016 року Сенді Мец доводила, що дублювання значно дешевше за неправильну абстракцію, описала шлях, яким спільна функція перетворюється на пастку з умов, і запропонувала рецепт повернення назад.
Дублювання значно дешевше за неправильну абстракцію
2014 року на RailsConf Сенді Мец присвятила короткий фрагмент доповіді "All the Little Things" тезі, яка досі ходить по командах розробників: дублювання значно дешевше за неправильну абстракцію. Її порада була прямою — надавайте перевагу дублюванню, а не неправильній абстракції. Реакція виявилася настільки бурхливою, що згодом вона розгорнула цю думку в есе: текст спершу з'явився в її розсилці Chainline, а в січні 2016 року був опублікований у блозі. Частина розробників сказала, що вона збожеволіла; значно більше було тих, хто впізнав описаний шаблон у власному коді.
Як добра абстракція стає пасткою
Мец описала історію, що повторюється. Програміст A помічає дублювання, виносить його, дає йому ім'я — метод, а іноді й клас — і замінює ним кожну копію. Код виглядає бездоганно. Минає час. З'являється нова вимога, якій абстракція майже відповідає, але не точно. Програміст B вважає за потрібне зберегти її, тож додає параметр і умовну логіку. Наступна вимога приносить ще один параметр і ще одну умову, і цикл триває, доки код не стає незрозумілим.
Пастка психологічна не менше, ніж технічна. Наявний код сам собі слугує виправданням: сама його присутність натякає, що він правильний і потрібний, і він уособлює зусилля, які комусь хочеться захистити. Чим складніший код, тим сильніший тиск зберегти його — це помилка неповоротних витрат. Коли приходить наступний розробник, спільна функція вже не одна ідея, а переповнена умовами процедура, яку важко зрозуміти й легко зламати.
Шлях назад: вставити, обрізати, винести заново
Її рецепт неочевидний: якщо абстракція неправильна, найшвидший шлях уперед веде назад. Поверніть абстрагований код у кожного виклику, усередині кожного виклику за параметрами визначте, яка частина справді потрібна, а решту видаліть. Так разом зникають і абстракція, і умови, а кожен виклик залишається лише з тим кодом, який використовує.
Команди, які це спробували, часто виявляли, що виклики насправді ніколи не робили того самого. Коли стара абстракція зникла, дублювання можна було виділити заново й винести нові абстракції з набутого досвіду — і додавання функцій пришвидшувалося. Практичне правило Мец: якщо ви передаєте параметри й додаєте умовні шляхи в спільному коді, абстракція неправильна. Відмовитися від неї раніше — менш болісно, ніж її захищати. «Коли абстракція неправильна, найшвидший шлях уперед — назад. Це не відступ, це рух у кращому напрямку», — писала вона.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.