Я великий фанат перевірки статичного типу. Це заважає вам робити такі дурні помилки:
// 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) )
все ще не будете компілювати?