2010-06-22 8 views
6

Czytałem o tym, jak bardzo szybki styl programowania w językach takich jak Erlang kończy się znacznie krótszymi programami niż styl obronny w większości innych języków. Czy jest to poprawne dla wszystkich typów programów i jaki jest tego powód?Dlaczego programy typu fast fast są krótsze niż programy w stylu defensywnym?

+2

Zamierzam zerwać z tradycją i zapytać, dlaczego powstała społeczność wiki. :) –

+0

Czy powinienem to zmienić, aby nie być wspólnotową wiki? Nigdy nie jestem pewien, która rzecz jest wiki społeczności, a która nie. – Zubair

+0

Największą zaletą społecznościowej wiki jest to, że ludzie mogą edytować dowolną odpowiedź, aby ją naprawić, i nie ma żadnych punktów upvote dla użytkownika, który przesłał odpowiedź, podczas gdy normalny tryb daje punkty i tylko użytkownicy z minimalną liczbą punktów mogą edytować odpowiedzi. –

Odpowiedz

10

Programy fail-fast niekoniecznie są krótsze niż programy w stylu defensywnym: zależy to od implementacji i środków potrzebnych do zabezpieczenia twojego kodu defensywnego.

W przypadku Erlang, programy fail-fast są zwykle krótsze ze względu na deklaratywny styl i sposób, w jaki VM zapewnia generowanie błędów dla ciebie. Na przykład, w funkcji:

day(1) -> sunday; 
day(2) -> monday; 
day(3) -> tuesday; 
day(4) -> wednesday; 
day(5) -> thursday; 
day(6) -> friday; 
day(7) -> saturday; 

dowolnej nieoczekiwane wartości przekazywane do funkcji będzie prowadzić do błędów, które mogą zostać pochwycone i obsługiwany przez inny (tj .: promotorem). Takie błędy nigdy nie zagrażają również systemowi jako całości i nie wymagają dodawania kodu do samej funkcji - wszystko to odbywa się poza normalną ścieżką wykonywania przez określone z góry zachowania.

W dynamicznym języku, w którym niepowodzenie szybkie nie jest normą, trzeba ręcznie sprawdzić granice i samemu wyrzucić wyjątek. Następnie musisz złapać wyjątek lokalnie (najłatwiejszy chwyt ...), jeśli nie chcesz, aby cały system przestał działać. Kod obsługi błędów zwykle musi być wstawiany w normalnej ścieżce wykonania.

W języku statycznym, w którym szybka reakcja nie jest normą, czas trwania kodu zależy w dużym stopniu od posiadanego systemu typów. Jeśli język pozwala na definiowanie typów, w których przypadki brzegowe są sprawdzane przez kompilator, zwykle nie trzeba tego obsługiwać wewnątrz kodu poza zdarzeniami niedeterministycznymi (pliki nie działają, nieoczekiwane dane wejściowe użytkownika itp.). Języki z tego typu systemami, wiele błędów zostanie przechwyconych przed uruchomieniem, więc nie będziesz mieć tylu defensywnych przypadków.

Gdy nie można uniknąć obsługi błędów, języki obsługujące szybkie idiomy (takie jak Erlang) pozwolą na zapewne wyraźniejszy kod niż języki, które nie są (statyczne lub nie), głównie dlatego, że kod dla specjalnych przypadków nie jest " t miesza się z kodem dla idealnej ścieżki wykonania.

-4

Programowanie odporne na błędy koncentruje się na lepszej czytelności kodu i debugowaniu. Doświadczenie użytkownika jest celem dodatkowym: użytkownik może doświadczyć dziwnych komunikatów o błędach lub błędów programu, ale wyższa jakość kodu pozwala programistom łatwo znaleźć błąd i rozwiązać problem.

Defensywne programowanie stylu, zamiast tego, skupia się na sprawdzaniu danych wejściowych od użytkownika i innych fragmentów kodu. Kod jest bardziej szczegółowy, ponieważ programista musi dokładnie zweryfikować dane wejściowe i z powodzeniem zakończyć się niepowodzeniem w przypadku błędu. Doprowadziło to do większej ilości kodu (z punktu widzenia programistów) i bardziej niezawodnej aplikacji (z punktu widzenia użytkowników).

+2

Nie zgadza się. Jesteś mylący styl fail-fast z stylem obsługi bez błędów.Styl Fail-fast nadal pozwala programowi wychwycić błędy i odzyskać je bez przeszkadzania użytkownikowi. – Deestan

+3

Oczywiście użytkownik czerpie również korzyści z mniej wadliwego oprogramowania w stylu failfast. Powiedziałbym raczej, że failfast dotyczy jasności co do poprawności danych wejściowych i co jest nieprawidłowym wprowadzeniem, i faktycznie wymusza to. Klarowność niezmiennie zapewnia lepsze programowanie. Błędy w danych wejściowych powinny być oznaczone jako takie (zamiast umieszczania aplikacji w nieokreślonym miejscu), ale to nie przeszkadza aplikacji w obsłudze tego błędu elegancko i intuicyjnie. Myślę, że tworzysz fałszywą dychotomię. – harms

+2

Zła odpowiedź. W kontekście Erlanga, dla którego zadano pytanie, bardziej zdecydowane podejście polega na uniknięciu programowania defensywnego i po prostu niech "upaść" obrażający proces. Kolejny proces podejmie odpowiednie działania w celu odzyskania. W Javie, w którym wydaje się, że masz doświadczenie, nie masz wyboru, musisz być defensywny, ponieważ jest to język imperatywny z modelem współbieżności współdzielonej. Ponieważ Erlang jest językiem funkcjonalnym z współbieżnością przekazywania komunikatów, a także dlatego, że istnieją mechanizmy umożliwiające komunikację błędów między procesami, jest on idealnie czysty i lepszy niż szybki. – dsmith

5

Zobacz punkty 4.3 i 4.4 artykułu Joe Armstronga: thesis.

+0

Link jest zepsuty, ale tutaj jest taki, który działa: http://erlang.org/download/armstrong_thesis_2003.pdf –

+0

Rozdział 4.5 jest również istotny, moim zdaniem. –