Porównywacz słów - czy da się uniknąć IFów?

2

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?

1

Odnośnie kodu - raczej:

result = result && v.check(wordA, wordB);

Twoje podejście do tego (w takiej formie) imho jest jak najbardziej słuszne.

1

W 6 casie jest źle chyba.
Nie wiem jak to zrobić w oparciu o wzorce i OOP, ale tak na "chłopski" rozum:

  1. jeśli ignoreBlank i a lub b puste: zwróć true
  2. jeśli ignoreSpaces: oczyść oba stringi ze spacji i przejdź do (3) -> tu masz błąd
  3. jeśli ignoreCase: zrób upper case na obu (lub lower case) - i przejdź do (4)
  4. porównaj przez "equals"
0

dobraa czyli nie jest tak źle. to tak zrobię. dzięki!

1

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.

0

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ść.

0

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.

0

Tyle, że sposób od jackweb przerywa nie tylko wywoływania funkcji check() ale też całą iterację po liście walidatorów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1