Код у стилі Ruby: грамотно, красиво та раціонально по-українськи. Приклад для початківців
Це переклад посту Майкла МакКі. Майкл – професійний програміст, який час від часу ділиться своїм досвідом і навичками з колегами, як кодерами-початківцями, так і професіоналами.
Більшість програмістів в останню чергу думають про естетику коду, який вони створюють. Звісно, загальних правил дотримуються майже всі. Але що, якщо йти далі? Хороший код, насамперед, має працювати. Але я вважаю, що в нього має бути свій стиль, це стосується не лише змісту, а й форми.
Насправді, це не так. Ось деякі проблеми, з якими стикаються всі програмісти-початківці, які займаються самоосвітою. Про це є тонни статей та нотаток, але я хочу розповісти, як оформити код візуально так, щоб він був не лише коректним, а й непогано виглядав із боку. Я вважаю, що самовиражатися можна не лише в образотворчому мистецтві – це можна робити завжди і скрізь.
Для мене дуже важливою є організація роботи, а також її візуальна форма. Ruby – відмінний варіант мови програмування, ніби спеціально зроблений, щоб відповідати моїм вимогам, оскільки дозволяє робити те, що ми хочемо, без жодних проблем. Він гнучкий, стильний та логічний.
Давайте розглянемо цей приклад.
Навіть програміст-початківець зрозуміє, що тут не так. На цей код просто боляче дивитись. А ось виправлений варіант, який виглядає краще.
Уф! Набагато краще. Тепер ми бачимо, що до чого і яким чином. Але цей код можна поліпшити. Декларування attr_reader і attr_accessor можна зробити ще виразнішим.
Оголошення кожного нового атрибута з нового рядка набагато легше сприймається. Тепер ми маємо список атрибутів, які присвоєно кожному аксесору. Можна йти далі.
Тут уже легко зрозуміти, де є лише можливість читання, де і читання, і записи.
Давайте тепер подивимося на таку частину цього класу — метод ініціалізації. Тут можна зробити багато.
У принципі, код читаємо, начебто все добре. Але можна зробити краще.
Якщо проставити всі оператори привласнення в одну колонку, виходить дуже непогано. Дивлячись на цей код, легко сказати, що, як і чому працюватиме.
Давайте подивимося, як тепер буде виглядати InvoiceItem повністю.
Тепер у нас є клас, який легко читаємо та зрозумілий з першого погляду. Присвоєння легко підбираються, аксесори атрибутів легко використовувати.
Які ще є можливості для оптимізації нашого коду? Найчастіше на початку вивчення програмування написання тестів може викликати проблеми через відсутність необхідних знань. Час витрачається створення фейкових даних. У цьому немає нічого жахливого, але в багатьох випадках це призводить до створення великих масивів тексту, що складно читається. Давайте подивимося на це.
Ох. Тут на початку створюється новий репозиторій для зберігання класів транзакцій. Усього їх три, кожен використовується для тесту, попадання в хеш для більш пізнього використання. Причому для класу, який ми маємо намір створювати, потрібно чимало атрибутів. Кожен з них має досить довге ім’я та значення. Що можна покращити так, щоб код виглядав добре?
Все просто.
Ми розбили кожний з цих хешей з розривом рядка у кожному новому оголошенні значення. Крім того, використано той же метод, що і при оптимізації InvoiceTeam. Тепер у редакторі без проблем можна бачити всі тестові дані у досить вузькій області огляду. Ми можемо бачити значення ключів. Якщо потрібно, їх можна змінити без скролінгу туди-сюди.
Аналогічна стратегія може бути використана, коли ми працюємо з великою кількістю атрибутів.
У цьому випадку ми не бачимо всієї структури коду принаймні в поточній області перегляду. Для того, щоб побачити атрибути, потрібно постійно скролити, що не надто зручно. Давайте виправимо це так, як ми вже зробили вище, у прикладі з хешами.
Новий код читаємо – і набагато human friendly, якщо так можна висловитися. У нас ясно видно всі атрибути та присвоєння. Можливий дебаггін стає простіше. Щось може піти не так і потім з’ясовувати, що і чому не працює, буде складно, якщо не привести код до «красивого» вигляду.
Коли ми пишемо програми, не можна забувати: важливо не лише те, щоб вони працювали коректно, але ще й те, щоб принцип їхнього функціонування був зрозумілий колегам, якщо це буде потрібно. Код має бути логічним, розбитим на абзаци, речення та структурні розділи.
Ну і наприкінці – мій улюблений приклад для Ruby. Давайте його розглянемо.
Давайте візьмемо кожен елемент з тварин та застосуємо метод capitalize. Це виглядає непогано, але ще краще те, що код можна трохи скоротити і зробити його більш читаним для людини.
Загалом статтю можна назвати тривіальною, але вона дає можливість новачкові зрозуміти красу коду. Тобто сам код має бути не лише робітником, а ще й зрозумілим — нехай навіть у тому випадку, коли програма пишеться лише для себе. Якщо виробити звичку створювати гарний працюючий код, це може допомогти вашому професійному зростанню.