Code Smells: skomplikowane instrukcje warunkowe

Kolejnym problemem

z którym przyjdzie się nam mierzyć jest nadmierna złożoność instrukcji warunkowych. Jest to często przejaw programowania nie-do-końca zorientowanego obiektowo. Zwłaszcza gdy występuje w świeżym kodzie. W kodzie zastanym jest zjawiskiem tyle niepożądanym przez „utrzymywaczy” co powszechnym. I niestety rzadko kiedy jest refaktoryzowany, nie koniecznie z powodu lenistwa programistów ale z racji sztywnych powiązań i uzależnienia od semantyki – czego, nomen omen, jest przyczyną.

Bez zbędnych wstępów popatrzmy na poniższe potworki:)

I w końcu na naszym ekranie pojawia się takie cudo:

 

to jest oczywiście tylko jeden ekran, przewijając zobaczymy kolejne serie if’ów – tak jeszcze ze 300 linijek. Zgadzając się, mam nadzieję, ze stwierdzeniem że tak tego zostawić nie można zastanówmy się co tutaj nie gra:

  • Kłująca w oczy długość i czytelność instrukcji warunkowych
  • Niektóre warunki kończą się samymi returnami
  • Mnogość warunków
  • Pierwszy warunek nie związany z happy-path. to też pogarsza czytelność (oczywiście można to rozpatrywać w kategoriach fail-fast, ale w takim wypadku powinien to być osobny warunek nie związany z pozostałymi)

Co możemy z tym zrobić? Przyglądając się command_executor możemy zauważyć, że instrukcje są grupowane ze względu na status_code. W związku z tym możemy bardzo prosto zamknąć poszczególne if’y w osobnych funkcjach. Przy przenoszeniu usuńmy też wszystkie instrukcje które kończą się samym wyjściem z funkcji, i pierwszy warunek, tak aby nie kolidował ze ścieżką happy-path:

W ten sposób znacznie zyskaliśmy na czytelności. Co prawda moglibyśmy refaktoryzować dalej i np. przenieść obsługę poszczególnych statusów do osobnych klas, ale myślę że na razie wystarczy :). Przy okazji bardziej złożonych warunków sposobem może być też wykorzystanie metod opartych na tabelach, o czym też wkrótce napiszę.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *