• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Software design, wyjątki vs kody wyjścia

Object Storage Arubacloud
0 głosów
320 wizyt
pytanie zadane 18 lipca 2019 w Python przez RafalS VIP (122,820 p.)

Mam problem architektoniczny. Jest sobie funkcja, która naprawia nagłówek licencyjny w pliku źródłowym. Naprawa może wymagać:

  • dodania nagłówka bo tam go nie było
  • poprawienia nagłówka bo był, ale był zły

lub może polecieć wyjątek, bo plik nie istnieje
Potrzebuje po wywołaniu funkcji dowiedzieć się co się stało.
Obecnie taka informacja jest przekazywana na zewnątrz w postaci typu rzuconego wyjątku. Każdy przypadek to inny wyjątek. Tak wiem, ale nie ja to pisałem.
Pytanie brzmi: jak to naprawić, żeby nie używać wyjątków do sterowania poprawnym przebiegiem, programu, ale zachować dotychczasową funkcjonalność.

Na pierwszy rzut oka problem rozwiązałby enum HeaderFixReturnStatus, ale koncepcja return code'ów trochę kojarzy mi się z prehistorią, a nie czystym kodem.

Jak to poprawić? Return code'y czy może coś innego?

BTW - szkoda, że nie ma kategorii do ogólnych pytań o architekturę oprogramowania.

komentarz 18 lipca 2019 przez Benek Szeryf (91,110 p.)
Czy możesz ingerować w kod, czy musisz jakoś opakować to, co już masz bez modyfikacji kodu?
komentarz 18 lipca 2019 przez RafalS VIP (122,820 p.)
Mogę modyfikować do woli.
komentarz 18 lipca 2019 przez Benek Szeryf (91,110 p.)

Można rozważyć opakowanie takich operacji w klasę. Każdy jej obiekt, to jeden plik źródłowy przekazywany jako parametr do metody __init__.  Obiekt wywoływałby pomocniczą metodę, która parsowałaby dany plik i ustawiała jego status (w przypadku braku pliku źródłowego zrzucany byłby wyjątek). Na podstawie statusu wykonywana byłaby naprawa pliku lub jej brak. Chodzi o osiągnięcie takiego czegoś:

>>> foo = SourceFile("foo.cpp")
>>> foo.fix_status
0
>>> bar = SourceFile("bar.cpp")
>>> bar.fix_status
1

W dalszej kolejności można by pomyśleć o odseparowaniu konkretnego nagłówka licencyjnego od klasy SourceFile, tak aby można było łatwo podmieniać licencje. W takim przypadku również pojawia się możliwość odseparowania parsera.

W każdym razie, nawet niedoskonały powyższy kod wydaje się ciut sensowniejszy niż rzucanie wyjątkami. Z drugiej strony ciężko powiedzieć jak bardzo "udana" jest reszta kodu i jaki będzie koszt takich poprawek.

komentarz 19 lipca 2019 przez RafalS VIP (122,820 p.)
Interfejs jest spoko o ile po stworzeniu sourcefile jest jeszcze jakieś zawołanie metody fix_header, bo wywołanie tego po cichu w inicie trochę zaciemnia co ta klasa ma zrobić.

2 odpowiedzi

+1 głos
odpowiedź 18 lipca 2019 przez mokrowski Mędrzec (156,100 p.)
wybrane 19 lipca 2019 przez RafalS
 
Najlepsza
To mocno zależy od kontekstu działania aplikacji i stylu w jakim jest napisana. IMHO lepiej się dostosować do sposobu myślenia w kodzie niż na siłę robić "rewolucję refaktoryzacji" (oczywiście poza przypadkami patolgicznymi). Rzucanie wyjątkami jako logika głównego przepływu sterowania, to taka patologia.

Na pierwszy rzut oka, brak pliku to sytuacja wyjątkowa i IMHO powinna owocować wyjątkiem. Przypadki dodania nagłówka lub poprawienia błędnego ale już istniejącego, to informacja o powodzie wykonania operacji. Sama operacja się wykonała więc... stan zastany przed wykonaniem operacji, można ew. logować. Jeśli chcesz mieć do niego dostęp w logice, cóż... zwróć rezultatem :)

Jak pisałem wyżej, tak to widzę przy niepełnych danych.
+1 głos
odpowiedź 18 lipca 2019 przez adrian17 Ekspert (345,220 p.)

Tak wiem, ale nie ja to pisałem. 
Pytanie brzmi: jak to naprawić, żeby nie używać wyjątków do sterowania poprawnym przebiegiem, programu

Mówisz o Pythonie, tak? (zgaduję z kategorii)

Tam używanie wyjątków do "normalnego przebiegu" jest dość powszechnym, niemalże idiomatycznym podejściem. Na przykład

try:
    with open(...) as f:
        ...
except IOError:
    ...

Ma parę zalet nad

if exists(...):
    with open(...) as f:
        ...
else:
    ...

, gdyż obsługuje więcej możliwych sytuacji i nie ma (mikroskopijnego) ryzyka że inny proces akurat usunie plik między linią exists() a linią open() ;)

Nie mówię że tak jest w Twojej konkretnej sytuacji, ale chciałem tylko zaznaczyć że w Pythonie podejście do wyjątków jest odrobinę inne niż w takim C++ie. No i zależy od poziomu abstrakcji tego API - funkcja edytująca konkretny plik może rzucić wyjątkiem że plik nie istnieje, ale już np funkcja wyższego poziomu działająca na całym projekcie być może by ten wyjątek złapała i zwróciła coś innego.

komentarz 19 lipca 2019 przez RafalS VIP (122,820 p.)

Tam używanie wyjątków do "normalnego przebiegu" jest dość powszechnym, niemalże idiomatycznym podejściem

Jeszcze lepszy przykład to tworzenie iteratora który rzuca StopIteration.

Brak pliku to sytuacja wyjwtkowa, która uniemożliwia kontynuowanie programu, więc wyjątek jest jak najbardziej uzasadniony.

W moim przypadku header jest naprawiony, więc wszystko poszło zgodnie z planem i można kontynuować pogram, dlatego taki wyjątek to patologia i chciałem go wyeliminować.

Podobne pytania

0 głosów
3 odpowiedzi 433 wizyt
+1 głos
1 odpowiedź 410 wizyt
pytanie zadane 6 listopada 2018 w Grafika i multimedia przez michh123 Bywalec (2,790 p.)
0 głosów
3 odpowiedzi 1,873 wizyt
pytanie zadane 3 maja 2016 w HTML i CSS przez Else Stary wyjadacz (12,260 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...