Dwa słowa o typach własnych

Wiele osób nie lubi tworzyć własnych specyficznych dla domeny typów, które nie niosą ze sobą wartości biznesowej. Przykładowo po co tworzyć własny typ reprezentujący wiek skoro można oprzeć się o starego dobrego inta?

Z moich obserwacji wynika, że przyczyna tego zachowania leży w niechęci do pisania jakiegokolwiek dodatkowego kodu, czyli zazwyczaj testów. Zamiast tego dzielnie napieramy na dodatkowy kod przy okazji różnorodnych funkcjonalności biznesowych. Wiek to jest zresztą piękny przykład, bo za każdym razem nasze testy będą jakoś zahaczać o wartości ujemne, nulle itp. Czy nie lepiej jest napisać to raz, a porządnie?

Listing 1. Przykładowa klasa Age

class Age {

	@Min(0)
	@Max(Integer.MAX_VALUE)
	@NotNull
	private Integer value;

	public Age() {
	}

	public Age(Integer value) {
		this.value = value;
	}

	public int getValue() {
		return value;
	}

	public void setValue(int value) {
		this.value = value;
	}
// hash, equals, toString co tam trzeba
}

Do tego dopisac konwertery na potrzeby Hibernate-a i gotowe. czy to tak dużo roboty?

Dziwi mnie ta niechęć do wzorca Value Object i jednej z Ekstremalna obiektowość w praktyce – część 3 – Opakowuj wszystkie prymitywy i Stringi. Nie dużo z tym roboty, a życie łatwiejsze.

5 myśli na temat “Dwa słowa o typach własnych

  1. A po co Ci publiczny konstruktor bezargumentowy? Przecież to umożliwia utworzenie obiektu w stanie niespójnym – bez wieku.

  2. Ponieważ np. Jackson wymaga 🙁 to jest też dość duża wada otoczenia w jakim tworzymy kod, że czasami potrzebne są rzeczy złe.

Napisz odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax