Programowanie strukturalne to paradygmat wprowadzający dekompozycję kodu źródłowego na następujące elementy: struktury kontrolne, podprogramy oraz bloki kodu. W paradygmacie wyróżniono trzy struktury kontrolne: sekwencje kodu, instrukcje warunkowe oraz pętle. Konsekwencją tych konstrukcji jest zakaz używania instrukcji skoku typu goto
oraz zasada pojedynczego wyjścia.
Opracowanie paradygmatu było odpowiedzią na rosnący problem skomplikowania kodu związany z użyciem w językach maszynowych (assembler-ach) wspomnianych instrukcji skoku.
Programowanie strukturalne w C++
Język C++ umożliwia programowanie z wykorzystaniem wielu paradygmatów. Również umożliwia tworzenie kodu strukturalnego – język zawiera instrukcję goto
jednak jej użycie jest powszechnie traktowane jako wysoce niewskazane.
Język zawiera również dodatkowe instrukcje, które powodują, że kod nie jest strukturalny w pierwotnym rozumieniu paradygmatu. Są to między innymi instrukcje: return
, break
, continue
oraz throw
. Powodują one, że łamana jest zasada pojedynczego wyjścia.
Early return w C++
Zasada pojedynczego wyjścia powoduje inny problem – kod może stać się wielokrotnie zagnieżdżony, a przez to mało czytelny. Odpowiedzią na ten problem jest użycie wspomnianych instrukcji return
, break
, continue
oraz throw
.
Technika return early polega na zastosowaniu wielu wyjść z bloku w celu jego uproszczenia. Uproszczenie polega na rozpatrywaniu na początku bloku możliwych przypadków brzegowych oraz wywołanie instrukcji wyjścia. Przykładowo może to być wywołanie wyjątku (throw
) w sytuacji wywołania funkcji z niepoprawnymi parametrami bądź przerwanie bloku kodu zwracając wartość domyślną (return
) jeżeli dane nie spełniają określonych warunków.
Przeciwnicy techniki wskazują, że wiele wyjść utrudnia analizę wykonania kodu oraz może powodować problemy ze zwalnianiem zasobów (jeżeli programista nie zweryfikuje wszystkich miejsc przerwania kodu). Te problemy mogą zostać rozwiązane poprzez uzupełnienie kodu komentarzami objaśniającymi zaistniałe przypadki brzegowe oraz poprzez zastosowanie wzorca projektowego RAII w celu zwolnienia zasobów. Obecnie w C++ automatyczne zwalnianie zasobów jest ułatowione ze względu na standaryzację inteligentnych wskaźników.
Early return w Python
W języku Python nie ma instrukcji analogicznej do goto, niemniej język zawiera instrukcje wyjścia z bloku analogiczne do instrukcji języka C++. Zwalnianie zasobów lub wywołanie określonego kodu przed wyjściem z bloku w Python-ie może być problematyczne ze względu na garbage collector uniemożliwiający zastosowanie wzorca RAII. Między innymi dlatego została wprowadzona instrukcja with
wraz z context manager-ami dopuszczającymi deterministyczne wywoływanie określonego kodu zwalniającego zasoby podczas wyjścia z bloku. Podobną rolę pełni słowo kluczowe finally
w bloku try except
, które gwarantuje wykonanie sekwencji kodu niezależnie od instrukcji wyjścia.
Podsumowanie
Programowanie strukturalne odegrało istotną rolę w historii rozwoju języków programowania. Języki takie jak C++ oraz Python umożliwiają pisanie kodu niezgodnego z tym paradygmatem. Jeżeli dana konstrukcja języka sprawia, że kod jest łatwiejszy w zrozumieniu, to jest to dobry argument, by ją stosować, bo kod powinien być pisany dla ludzi.
Twój zespół potrzebuje wsparcia we wdrożeniu dobrych praktyk?
Leave a Reply