Myślę, że może to być kontrowersyjna meta-odpowiedź, i jestem trochę spóźniony na imprezę, ale myślę, że bardzo ważne jest, aby wspomnieć o tym tutaj, ponieważ myślę, że wiem, skąd pochodzisz.
Problem ze sposobem używania wzorców projektowych polega na tym, że kiedy są nauczane, przedstawiają taki przypadek:
Masz ten konkretny scenariusz. Uporządkuj swój kod w ten sposób. Oto elegancki, ale nieco wymyślony przykład.
Problem polega na tym, że kiedy zaczynasz robić prawdziwą inżynierię, rzeczy nie są już takie proste. Wzorzec projektowy, o którym czytasz, nie do końca pasuje do problemu, który próbujesz rozwiązać. Nie wspominając o tym, że biblioteki, których używasz, całkowicie naruszają wszystko, co podano w tekście, wyjaśniając te wzorce, każda na swój sposób. W rezultacie kod, który piszesz, „wydaje się niewłaściwy” i zadajesz takie pytania.
Oprócz tego chciałbym zacytować Andrei Alexandrescu, mówiąc o inżynierii oprogramowania, który stwierdza:
Inżynieria oprogramowania, być może bardziej niż jakakolwiek inna dziedzina inżynierii, wykazuje bogatą różnorodność: możesz zrobić to samo na wiele poprawnych sposobów, a nieskończone niuanse między dobrem a złem.
Być może jest to trochę przesada, ale myślę, że to doskonale wyjaśnia dodatkowy powód, dla którego możesz czuć się mniej pewnie w swoim kodzie.
W takich czasach proroczy głos Mike Acton, lider silnika gry w Insomniac, krzyczy mi w głowie:
ZNAJ SWOJE DANE
Mówi o wejściach do twojego programu i pożądanych wyjściach. A potem jest ten klejnot Freda Brooksa z Miesiąca Mitycznego Człowieka:
Pokażcie mi swoje schematy blokowe i ukryjcie swoje stoły, a będę nadal mistyfikowany. Pokaż mi swoje tabele, a zwykle nie potrzebuję twoich schematów blokowych; będą oczywiste.
Więc gdybym był tobą, uzasadniałbym mój problem na podstawie mojego typowego przypadku wejściowego i tego, czy osiąga on pożądany prawidłowy wynik. I zadawaj takie pytania:
- Czy dane wyjściowe z mojego programu są prawidłowe?
- Czy jest produkowany wydajnie / szybko dla mojego najpopularniejszego przypadku wejściowego?
- Czy mój kod jest wystarczająco łatwy do lokalnego uzasadnienia, zarówno dla mnie, jak i moich kolegów z drużyny? Jeśli nie, to czy mogę to uprościć?
Kiedy to zrobisz, pytanie „ile warstw abstrakcji lub wzorów jest potrzebnych” staje się znacznie łatwiejsze do odpowiedzi. Ile warstw abstrakcji potrzebujesz? Tyle, ile jest to konieczne do osiągnięcia tych celów, i nie więcej. „Co z wzorami projektowymi? Nie użyłem żadnych!” Cóż, jeśli powyższe cele zostały osiągnięte bez bezpośredniego zastosowania wzoru, to w porządku. Uruchom to i przejdź do następnego problemu. Zacznij od swoich danych, a nie od kodu.