Dobre praktyki programistyczne

Zredukuj liczbę instrukcji „if”, część 2

20.04.2011

Oto kolejne pomysły na zastąpienie instrukcji „if” innymi wzorami.

Usprawnienie pętli

Każda pętla sprawdza warunek, czy wykonać następną iterację. Powinno się używać tej wbudowanej konstrukcji zamiast używania wewnątrz instrukcji if(..) break; jeśli to możliwe.

  1. boolean oldLoop() {
  2. List list = getList();
  3. Object wanted = getObject();
  4. boolean found = false;
  5. for (Object o : list) {
  6. if (wanted.equals(o)) {
  7. found = true;
  8. break;
  9. }
  10. }
  11. return found;
  12. }

  1. boolean newLoop() {
  2. List list = getList();
  3. Object wanted = getObject();
  4. Iterator it = list.iterator();
  5. boolean found = false;
  6. while (it.hasNext() && !(found = wanted.equals(it.next())));
  7. return found;
  8. }

Switch

Jeśli sprawdzasz czy zmienna jest równa określonej wartości, możesz użyć konstrukcji switch. Działa ona z wartościami całkowitymi (także znakami, zobacz instrukcja switch w JLS) i typu enum.

If/else   
  1. int a = getInt();
  2. if (a == 1) {
  3. //pierwsza akcja
  4. } else if (a == 2) {
  5. //druga akcja
  6. } else if (a == 3) {
  7. //trzecia akcja
  8. } else {
  9. //coś innego
  10. }

  1. int a = getInt();
  2. switch (a) {
  3. case 1:
  4. //pierwsza akcja
  5. break;
  6. case 2:
  7. //druga akcja
  8. break;
  9. case 3:
  10. //trzecia akcja
  11. break;
  12. default:
  13. //coś innego
  14. }

Walidacja

Proces ten może przebiegać na różne sposoby. Zazwyczaj składa się 3 etapów:

  • sprawdzenie, czy dane są prawidłowe,
  • wyświetlenie ewentualnych informacji o błędach,
  • przejście do następnego etapu tylko wtedy, gdy wszystkie dane są prawidłowe.
  1. boolean validateOld(String data1, String data2) {
  2. boolean result = true;
  3. if (!validator1(data1)) {
  4. log("Błąd w data1");
  5. result = false;
  6. }
  7. if (!validator2(data2)) {
  8. log("Błąd w data2");
  9. result = false;
  10. }
  11. return result;
  12. }
  1. boolean validateNew(String data1, String data2) {
  2. boolean result = true;
  3. result &= (validator1(data1) ? true : log("Błąd w data1"));
  4. result &= (validator2(data2) ? true : log("Błąd w data2"));
  5. return result;
  6. }

Zwróć uwagę, że validator1 i validator1 zwracają rezultat walidacji,a log zawsze zwraca false.

Leave a Response