Strona główna > Java > Dziwna konstrukcja

Dziwna konstrukcja

Takie małe rozważanie na temat pewnej konstrukcji, sprawdza ona czy jest odpowiednia zmienna ustawiona.
W orginale były enum_y, ale tu są stringi dla prostoty.
Kod ma się tak:

		String currentType = "typ_3";
		if ("typ_1".equals(currentType) || "typ_2".equals(currentType) ||
				"typ_3".equals(currentType)) {
			System.out.println("currentType jest odpowiedni");
		}

Potrzeba jest jasnego zakomunikowania że do warunku można wejść kiedy currentType ma jedną z zadanych wartości. Niby jest to czytelne, ale czy można wyrazić to lepiej?😉 zawsze można gdybać jakby to wyglądało gdyby dozwolonych wartości było więcej.

Powstały konstrukcje jak poniżej – w wyniku początkowego skojarzenia z pythonem i takiego przykładu z niego:

current_type = "typ_3"
if (current_type in ["typ_1", "typ_2", "typ_3"]):
    print "current_type jest odpowiedni"


Podejście pierwsze
Czerpiące bezpośrednio z powyższego przykładu:

String currentType = "typ_3";
if (isElementIn(currentType, "typ_1", "typ_2", "typ_3")) {
	System.out.println("currentType jest odpowiedni");
}

...

private static boolean isElementIn(Object element, Object... expectedItem) {
	if (element != null) {
		for (int i = 0; i < expectedItem.length; i++) {
			if (expectedItem[i].equals(element)) {
				return true;
			}
		}
	}
	return false;
}

Proste podejście, spełnia swoje zadanie, dyskusyjne może być czy nie jest to już przesada, ale to już indywidualny gust.
Jednak nie ważna jest to co jest w metodzie, ważne żeby patrząc bezpośrednio na warunek wiedzieć o co chodzi.
W tej konstrukcji może być nieczytelne (mylące) gdzie umieścić element do sprawdzenia (na której pozycji ;)).
Problem ten jest eliminowany w następnym przykładzie.

Podejście drugie

String currentType = "typ_3";
if (is(currentType).in("typ_1", "typ_2", "typ_3")) {
	System.out.println("currentType jest odpowiedni");
}


...

private static <T>  ElementChecker<T> is(T element) {
	return new ElementChecker<T>(element);
}

private static class ElementChecker<T> {
	private final T element;
	public ElementChecker(T element) {
		this.element = element;
	}
	public boolean in(T ... elements) {
		if (element != null) {
			for (int i = 0; i < elements.length; i++) {
				if (elements[i].equals(element)) {
					return true;
				}
			}
		}
		return false;
	}
}

Tutaj kod do sprawdzenie jest już rozdmuchany i mocno giętki😉. Jednak najbardziej komunikuje o co chodzi w warunku. I daje bazę do pisania innych warunków w oparciu o tą konstrukcje. Na przykład: Czy wartość jest w zadanym zakresie?, można się pobawić🙂.
Przypomina mi to trochę warunki w Hibernate/JPA

DomainObject e = queryBuilder.createQueryDefinition(Employee.class);
DomainObject d = e.join("dept");
e.where(d.get("name").equal("Marketing")
           .and(e.type().in(PartTimeEmployee.class, Contractor.class)));

Lub kod pisane w stylu jaki narzuca biblioteka guava.

Kategorie:Java Tags: ,
  1. Brak komentarzy.
  1. No trackbacks yet.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d bloggers like this: