Hej. Mam napisać klasę porównywacz napisów z kilkoma opcjami. np. ignoreCase
, ignoreSpaces
, ignoreWordB
lub opcje przeciwne do tych tj. caseInsensitive
, checkSpaces
itd... Będzie takich opcji maks z 5 . Mogę to zaimplementować w jednej klasie i ustawiać porównywacza za pomocą metod -> w środku pojawi mi się trochę IFów. Czy da się w takim wypadku obejść IFy jakimś wzorcem? Napisałam coś takiego: http://ideone.com/PuNtQh , lecz nie ma to sensu i nie działa prawidłowo (logicznie nie da się tego pogodzić). Jak byście podeszli do takiego problemu?
Odnośnie kodu - raczej:
result = result && v.check(wordA, wordB);
Twoje podejście do tego (w takiej formie) imho jest jak najbardziej słuszne.
W 6 casie jest źle chyba.
Nie wiem jak to zrobić w oparciu o wzorce i OOP, ale tak na "chłopski" rozum:
- jeśli ignoreBlank i a lub b puste: zwróć true
- jeśli ignoreSpaces: oczyść oba stringi ze spacji i przejdź do (3) -> tu masz błąd
- jeśli ignoreCase: zrób upper case na obu (lub lower case) - i przejdź do (4)
- porównaj przez "equals"
dobraa czyli nie jest tak źle. to tak zrobię. dzięki!
Jakby nauczyciel się upierał, to zdefiniuj takie strategie:
interface CompareProcessor
{
Pair<String, String> process(String valueA, String valueB);
}
I zdefiniować taki procesor dla każdej opcji.
Dla ignoreBlank to będzie:
public class BlankProcessor implements CompareProcessor {
Pair<String, String> process(String valueA, String valueB)
{
if ((valueA == null) || (valueA.isEmpty()) {
return new Pair<String, String>("", "");
}
if ((valueB == null) || (valueB.isEmpty()) {
return new Pair<String, String>("", "");
}
return new Pair<String, String>(valueA, valueB);
}
}
Pair:
http://stackoverflow.com/questions/156275/what-is-the-equivalent-of-the-c-pairl-r-in-java
Pewnie ładniej by to było zrobić bez konwertowania łańcuchów, ale nie mam pomysłu jak.
Hej. Wydaje mi się, że linijka:
result = result && v.check(...);
jest zbędna. Otóż jeżeli natrafimy na pierwszego false, można śmiało zwracać false, bo false && obojętnie co da false...
Moim zdaniem wyglądałoby to tak:
for(Option v : options)
if(!v.check(wordA, wordB))
return false;
return true;
W związku z czym, nie trzeba będzie wywoływać wszystkich metod check. ;) Może w tym przypadku niewiele zmieni, ale zawsze warto pooptymalizowac na przyszłość.
W przypadku:
boolean result = checkConditionA() && checkConditionB() && ... ;
W przypadku, gdy checkConditionA() zwróci false to checkConditionB() i dalsze nie są wykonywane (tym się różnią operatory & oraz &&).
Więc zapis:
result = result && v.check()
Jest jak najbardziej poprawny. Niektórzy marudni mogą narzekać, że zaciemnia to kod ale moim zdaniem w takich przypadkach wszystko jest OK.
Tyle, że sposób od jackweb przerywa nie tylko wywoływania funkcji check() ale też całą iterację po liście walidatorów.