Haskell:
Рефакторинг

Як:

Припустимо, у вас є частина коду на Haskell, яка повторюється частіше, ніж ваша улюблена пісня. Ось швидкий погляд на те, як ви могли б рефакторити це за допомогою функцій.

До рефакторингу:

printInvoice :: String -> Float -> String -> IO ()
printInvoice customer total item = do
  putStrLn $ "Замовник: " ++ customer
  putStrLn $ "Всього: " ++ show total
  putStrLn $ "Предмет: " ++ item

Після невеликого рефакторингу:

printDetail :: String -> String -> IO ()
printDetail label value = putStrLn $ label ++ ": " ++ value

printInvoice :: String -> Float -> String -> IO ()
printInvoice customer total item = do
  printDetail "Замовник" customer
  printDetail "Всього" (show total)
  printDetail "Предмет" item

-- Приклад виводу:
-- Замовник: Аліса
-- Всього: $42.00
-- Предмет: Путівник з програмування на Haskell

Як ви можете бачити, екстрагуючи спільний шаблон в окрему функцію printDetail, ми уникаємо повторення і робимо printInvoice чіткішим і легшим для управління.

Поглиблене занурення

Коли Haskell з’явився наприкінці 80-х, було зрозуміло, що функціональний парадигм може принести свіжий подих у практики кодування. Швидко промотуючи вперед, рефакторинг на Haskell є особливо елегантним завдяки функціям, що є громадянами першого класу, та його сильній статичній системі типів. Ви рефакторите, не побоюючись, що зламаєте свій додаток, оскільки компілятор стоїть на вашому боці.

Альтернативи ручному рефакторингу можуть включати використання автоматизованих інструментів, хоча функціональна природа та типова безпека Haskell іноді можуть робити це менш поширеним в порівнянні з іншими мовами. З точки зору впровадження, важливо використовувати можливості Haskell, такі як функції вищого порядку, чистота та незмінність, для спрощення рефакторингу.

Рефакторинги на кшталт “Витягнути Функцію”, щойно продемонстрованого, є поширеними, але ви також можете виконувати “Інлайн Функцію”, “Перейменувати Змінну” та “Змінити Сигнатуру Функції” з упевненістю, завдяки системі типів. Могутня типова інференція Haskell іноді може виявити помилки, які змогли б проскочити в інших мовах.

Дивіться також

Для поглибленого занурення в рефакторинг на Haskell загляньте до книги “Рефакторинг: Покращення дизайну існуючого коду” Мартіна Фаулера, де концепції універсально застосовні. Перевірте інструмент hlint для автоматизованих підказок щодо покращення вашого коду на Haskell. Також завітайте на вікі Haskell (https://wiki.haskell.org/Refactoring) за інсайтами спільноти та подальшим читанням.