To prawdopodobnie zły pomysł. Po pierwsze, symbolizuje maksymę „definicja szaleństwa robi to samo dwa razy i za każdym razem oczekuje różnych rezultatów”. Po drugie, ten wzór kodowania nie komponuje się dobrze z samym sobą. Na przykład:
Załóżmy, że warstwa sprzętowa sieci ponownie wysyła pakiet trzy razy w przypadku awarii, czekając, powiedzmy, sekundę między awariami.
Załóżmy teraz, że warstwa oprogramowania trzykrotnie wysyła powiadomienie o awarii w przypadku awarii pakietu.
Załóżmy teraz, że warstwa powiadomień aktywuje powiadomienie trzykrotnie w przypadku niepowodzenia dostarczenia powiadomienia.
Załóżmy teraz, że warstwa zgłaszania błędów ponownie aktywuje warstwę powiadomienia trzykrotnie w przypadku niepowodzenia powiadomienia.
A teraz załóżmy, że serwer WWW reaktywuje raportowanie błędów trzykrotnie w przypadku niepowodzenia błędu.
A teraz załóżmy, że klient WWW trzykrotnie wysyła żądanie po otrzymaniu błędu z serwera.
Załóżmy teraz, że linia na przełączniku sieciowym, która ma kierować powiadomienie do administratora, jest odłączona. Kiedy użytkownik klienta WWW w końcu dostaje komunikat o błędzie? Robię to około 12 minut później.
Żeby nie pomyśleć, że to tylko głupi przykład: widzieliśmy ten błąd w kodzie klienta, choć daleko, znacznie gorzej, niż tutaj opisałem. W konkretnym kodzie klienta przerwa między wystąpieniem błędu a zgłoszeniem go użytkownikowi wynosiła kilka tygodni, ponieważ tak wiele warstw automatycznie ponawiało próbę oczekiwania. Wyobraź sobie, co by się stało, gdyby było dziesięć prób zamiast trzech .
Zwykle właściwą rzeczą w przypadku błędu jest zgłoszenie go natychmiast i pozwolenie użytkownikowi zdecydować, co należy zrobić. Jeśli użytkownik chce utworzyć zasadę automatycznych prób, pozwól mu utworzyć tę zasadę na odpowiednim poziomie w abstrakcji oprogramowania.