Я большой поклонник статической проверки типов. Это мешает вам делать глупые ошибки, подобные этой:
// java code
Adult a = new Adult();
a.setAge("Roger"); //static type checker would complain
a.setName(42); //and here too
Но это не мешает вам делать глупые ошибки, подобные этой:
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
Проблема возникает, когда вы используете один и тот же тип для представления явно разных видов информации. Я думал, что хорошим решением для этого было бы расширение Integer
класса, просто для предотвращения ошибок бизнес-логики, но не для добавления функциональности. Например:
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));
Это считается хорошей практикой? Или есть непредвиденные инженерные проблемы в будущем с таким ограниченным дизайном?
new Age(...)
объект, вы не сможете неправильно назначить его переменной типа Weight
в других местах. Это уменьшает количество мест, где могут возникнуть ошибки.
a.SetAge( new Age(150) )
еще не скомпилируется?