Haskell:
Refaktoryzacja

Jak to zrobić:

Załóżmy, że masz fragment kodu w Haskellu, który powtarza się częściej niż twoja ulubiona piosenka. Oto krótkie spojrzenie na to, jak można to zrefaktoryzować, używając funkcji.

Przed refaktoryzacją:

printInvoice :: String -> Float -> String -> IO ()
printInvoice customer total item = do
  putStrLn $ "Klient: " ++ customer
  putStrLn $ "Suma: " ++ show total
  putStrLn $ "Przedmiot: " ++ item

Po nieco refaktoryzacji:

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

printInvoice :: String -> Float -> String -> IO ()
printInvoice customer total item = do
  printDetail "Klient" customer
  printDetail "Suma" (show total)
  printDetail "Przedmiot" item

-- Przykładowe wyjście:
-- Klient: Alice
-- Suma: $42.00
-- Przedmiot: Przewodnik programowania w Haskellu

Jak widać, wyodrębniając wspólny wzorzec do osobnej funkcji printDetail, unikamy powtórzeń i czynimy printInvoice bardziej przejrzystym i łatwiejszym do zarządzania.

Głębsze zanurzenie

Kiedy Haskell pojawił się na scenie pod koniec lat 80., było jasne, że paradygmat funkcyjny może przynieść świeże powietrze do praktyk programowania. Z biegiem czasu, refaktoryzacja w Haskellu jest szczególnie elegancka dzięki temu, że funkcje są obywatelami pierwszej klasy oraz dzięki silnemu, statycznemu systemowi typów. Można przeprowadzać refaktoryzację bez obaw, że zepsuje się aplikację, ponieważ kompilator ma to pod kontrolą.

Alternatywami dla manualnej refaktoryzacji mogą być narzędzia automatyczne, choć funkcjonalny charakter i bezpieczeństwo typów w Haskellu mogą czasami sprawić, że są one mniej powszechne w porównaniu z innymi językami. Pod względem implementacyjnym ważne jest korzystanie z funkcji Haskellu takich jak funkcje wyższego rzędu, czystość i niemutowalność, aby refaktoryzacja przebiegała płynniej.

Refaktoryzacje takie jak “Wyodrębnij funkcję”, właśnie przedstawione, są powszechne, ale można również wykonywać “Wstaw funkcję inline”, “Zmień nazwę zmiennej” i “Zmień sygnaturę funkcji” z pewnością siebie dzięki systemowi typów. Potężne wnioskowanie o typach w Haskellu czasami może wyłapać błędy, które przeszłyby niezauważone w innych językach.

Zobacz również

Aby zgłębić refaktoryzację w Haskellu, sięgnij po książkę “Refaktoryzacja: Ulepszanie istniejącego kodu” autorstwa Martina Fowlera, gdzie koncepcje są uniwersalnie stosowane. Sprawdź narzędzie hlint dla automatycznych wskazówek dotyczących ulepszania kodu w Haskellu. Odwiedź także wiki Haskell (https://wiki.haskell.org/Refaktoryzacja) po spostrzeżenia społeczności i dalsze czytanie.