Zauważyłem że Twoje testy w projekcie mają room na improvement. Starałem Ci się to pokazać, ale widocznie mi się nie udało. Wiesz swoje lepiej. Uważam że Twoje testy mogłyby być lepszę, mógłbym Ci pokazać kilka sztuczek albo miejsc w których mógłbyś poprawić te testy, ale widzę że wolisz polemikę bardziej niż faktyczne rozważania o tym jak możnaby poprawić te testy.
Twój poprzedni post opiera się na zasadności zmian. Mówisz że moja "zmiana" lambd na regexpy nie jest zasadna, tak samo usunięcie listy jednokierunkowej. Mówisz też że "nic nie zrobiłem", i wreszcie stosujesz argumentum ad absurdium, czyli kod zbyt dobrze dopasowany do testów, czyli coś o czym Kent Beck pisze w swojej książce "TDD By Example" w rozdziale o usuwaniu duplikacji.
Pamiętaj że ja nic nie refaktorowałem i nie zmieniłem (tzn. nie przerabiałem istniejącego kodu). Powiedziałem Ci - po prostu usunąłem Core/, i napisałem najprostszą implementację przechodzącą test, tak jak moim zdaniem powinno się pracować w TDD. Żaden inny kod nie był konieczny żeby testy przeszły.
- Narzekałes że użyłem regexpów - mówiłem Ci, zmiana na lambdy i predicate'y jest trywialna, wszędzie gdzie wsklejam regexpa, wystarczy wsadzić lambdę z predykatem. Mówisz że to co ja napisałem to jest "implementacja regexpów w regexpach". To dla mnie jasny sygnał że próbujesz myśleć o tej aplikacji z perspektywy implementacji. Stworzyłeś sobie klasy
Matcherz chainowanym interfejsem. To co ma znaczenie, to to czy zbudowanie konkretnych metod zmatchuje konkretny string. To czy pod spodem jest regexp czy predykaty to jest szczegół implementacyjny, i nie ma specjalnego znaczenia. Ale nadal - możesz bardzo łatwo zamienić te regexpy na te lambdy, nadal to nie zmieni faktu że pozostała większość logiki jest nieprzetestowana. Niektóre metody z Twojego buildera w ogóle nie są wołane w testach. - Narzekałes że nie ma listy jednokierunkowej - po pierwsze, to jest mikrooptymalizacja, nigdzie nie usuwasz elementów, więc dostęp po array'u jest okej. A nawet jakbyś wyciągnął profiler, i faktycznie wykazał że użycie listy jednokierunkowej w tym miejscu jest zasadne, to powinno to być kwestią podmiany implementacji kolekcji (mianowicie
new List<>()nanew LinkedList()) - Narzekałeś na to że kod jest zbyt dopasowany do testów - ciężko żeby
return true;nie był doskonale dopasowany doAssert.True()- bo tyle wymagają niektóre Twoje metody żeby testy przeszły. To jest dla mnie jasny sygnał że te testy po prostu nie są zbyt silne żeby wymusić poprawną implementację.
Jesli nie podoba Ci się implementacja która w ten sposób powstała, to to jest jeszcze kolejny sygnał, że testy nie są dobre. Bo kod który w ten sposób powstał to jest ilustracja tego co faktycznie było przetestowane. Więc w Twojej "idealnej" implementacji bez regexpów i z NextOperation, przetestowane było tylko to co widzisz w moim forku. Wszystko pozostałe (praktycznie cała logika, exception, etc.) nie było. Żeby w stylu TDD przerobić mój kod w Twój, musiałbys napisać więcej testów które wymusiłyby te zimany. Np testy pod exception message, które wymusiłby dodanie message'ów do exceptionów.