Myślę, że jednym z najgorszych anty-wzorów, jakie widziałem, jest użycie tabeli bazy danych jako pamięci tymczasowej zamiast użycia pamięci komputera.
Domena problemowa jest zastrzeżona, co uniemożliwia mi jej wyjaśnienie, ale nie jest konieczne zrozumienie podstawowego problemu. To była aplikacja GUI napisana w Javie z backendową bazą danych. Miał pobrać określone dane wejściowe, zmanipulować je, a następnie zatwierdzić przetworzone dane w bazie danych.
Nasz projekt ma dość skomplikowany algorytm, który zapisuje wartości pośrednie do późniejszego przetworzenia. Zamiast enkapsulować obiekty tymczasowe w ... obiektach, utworzono tabelę bazy danych, taką jak „t_object”. Za każdym razem, gdy wartość była obliczana, była dodawana do tej tabeli. Po zakończeniu działania algorytmu wybierze wszystkie wartości pośrednie i przetworzy je wszystkie w jednym dużym obiekcie Map. Po zakończeniu całego przetwarzania pozostałe wartości, które zostały oznaczone do zapisania, zostaną dodane do rzeczywistego schematu bazy danych, a tymczasowe wpisy w tabeli „t_object” zostaną odrzucone.
Tabela była również używana jako unikalna lista, dane mogły istnieć tylko raz. Mogłoby to być przyzwoitą cechą projektu, gdybyśmy wdrożyli Ograniczenia na stole, ale zakończyliśmy iterację po całej tabeli, aby sprawdzić, czy dane istnieją, czy nie. (Nie, nawet nie korzystaliśmy z zapytań, w których zastosowano klauzule where z CONTAINS)
Niektóre problemy, na które natrafiliśmy w związku z tym projektem, były w szczególności debugowaniem. Aplikacja została zbudowana w celu potokowania danych, aby istniało wiele GUI, które wstępnie przetwarzałyby dane, zanim dotrą do tego algorytmu. Proces debugowania polegał na przetworzeniu przypadku testowego, a następnie wstrzymaniu natychmiast po zakończeniu powyższej sekcji. Następnie zapytalibyśmy bazę danych, aby zobaczyć, jakie dane były zawarte w tej tabeli.
Innym problemem, który odkryliśmy, było to, że dane nie były poprawnie usuwane z tej tabeli tymczasowej, co w przyszłości mogłoby zakłócać działanie programu. Odkryliśmy, że było to spowodowane tym, że wyjątki nie były odpowiednio obsługiwane, a zatem aplikacja nie wychodzi poprawnie i nie usuwa danych z tabeli, nad którą sprawuje kontrolę.
Gdybyśmy użyli podstawowego projektowania obiektowego i zachowali wszystko w pamięci, powyższe problemy nigdy by nie wystąpiły. Po pierwsze, debugowanie byłoby proste, ponieważ moglibyśmy łatwo ustawić punkty przerwania w aplikacji, a następnie sprawdzić pamięć w stosie i stercie. Po drugie, po nieprawidłowym wyjściu z aplikacji pamięć java zostałaby naturalnie wyczyszczona bez obawy o usunięcie jej z bazy danych.
UWAGA: Nie twierdzę, że ten wzorzec jest z natury zły, ale w tym przykładzie uznałem, że nie jest potrzebny, gdy wystarczyłyby podstawowe zasady OO.
Nie jestem pewien nazwy tego anty-wzoru, ponieważ po raz pierwszy widziałem coś takiego. Jakieś dobre imiona, które możecie wymyślić dla tego wzoru?