Jestem wielkim fanem sprawdzania typu statycznego. Zapobiega popełnianiu takich głupich błędów:
// java code
Adult a = new Adult();
a.setAge("Roger"); //static type checker would complain
a.setName(42); //and here too
Ale to nie przeszkadza ci popełniać tak głupich błędów:
Adult a = new Adult();
// obviously you've mixed up these fields, but type checker won't complain
a.setAge(150); // nobody's ever lived this old
a.setWeight(42); // a 42lb adult would have serious health issues
Problem pojawia się, gdy używasz tego samego typu do reprezentowania oczywiście różnego rodzaju informacji. Myślałem, że dobrym rozwiązaniem byłoby rozszerzenie Integer
klasy, aby zapobiec błędom logiki biznesowej, ale nie dodawać funkcjonalności. Na przykład:
class Age extends Integer{};
class Pounds extends Integer{};
class Adult{
...
public void setAge(Age age){..}
public void setWeight(Pounds pounds){...}
}
Adult a = new Adult();
a.setAge(new Age(42));
a.setWeight(new Pounds(150));
Czy jest to uważane za dobrą praktykę? A może występują nieprzewidziane problemy techniczne związane z tak restrykcyjnym projektem?
new Age(...)
obiektu nie można niepoprawnie przypisać go do zmiennej typu Weight
w żadnym innym miejscu. Zmniejsza liczbę miejsc, w których mogą wystąpić błędy.
a.SetAge( new Age(150) )
Nadal nie będziesz się kompilować?