Haskell:
Рефакторинг
Как это делать:
Допустим, у вас есть кусок кода на Haskell, который повторяется чаще, чем ваша любимая песня. Вот быстрый взгляд на то, как вы могли бы рефакторить это с использованием функций.
До рефакторинга:
printInvoice :: String -> Float -> String -> IO ()
printInvoice customer total item = do
putStrLn $ "Customer: " ++ customer
putStrLn $ "Total: " ++ show total
putStrLn $ "Item: " ++ item
После небольшого рефакторинга:
printDetail :: String -> String -> IO ()
printDetail label value = putStrLn $ label ++ ": " ++ value
printInvoice :: String -> Float -> String -> IO ()
printInvoice customer total item = do
printDetail "Customer" customer
printDetail "Total" (show total)
printDetail "Item" item
-- Пример вывода:
-- Customer: Alice
-- Total: $42.00
-- Item: Руководство по программированию на Haskell
Как вы можете видеть, извлекая общие шаблоны в отдельную функцию printDetail
, мы избегаем повторения и делаем printInvoice
более понятной и легкой для управления.
Глубокое погружение
Когда Haskell появился в конце 80-х, стало ясно, что функциональная парадигма может принести некоторое новшество в практики программирования. Проведя быстрый взгляд вперёд, рефакторинг на Haskell выглядит особенно элегантно благодаря тому, что функции являются объектами первого класса и сильной статической типизации. Вы можете рефакторить, не боясь, что сломаете приложение, так как компилятор защитит вас.
Альтернативами ручному рефакторингу могут быть автоматизированные инструменты, хотя функциональная природа и типовая безопасность Haskell иногда могут делать это менее распространенным по сравнению с другими языками. С точки зрения реализации, важно использовать такие возможности Haskell, как функции высших порядков, чистота и неизменяемость для облегчения рефакторинга.
Такие рефакторинги, как “Извлечение функции”, как было показано, являются обычным делом, но вы также можете с уверенностью выполнять “Встраивание функции”, “Переименование переменной” и “Изменение сигнатуры функции” благодаря системе типов. Мощный механизм вывода типов в Haskell иногда может обнаружить ошибки, которые могли бы проскользнуть в других языках.
Смотрите также
Для глубокого погружения в рефакторинг на Haskell обратитесь к книге “Рефакторинг: Улучшение проекта существующего кода” Мартина Фаулера, где концепции являются универсально применимыми. Ознакомьтесь с инструментом hlint для автоматизированных подсказок по улучшению вашего кода на Haskell. Также зайдите на вики Haskell (https://wiki.haskell.org/Refactoring) для получения сообщественных взглядов и дальнейшего чтения.