Tôi là một fan hâm mộ của kiểm tra loại tĩnh. Nó ngăn bạn khỏi những sai lầm ngu ngốc như thế này:
// java code
Adult a = new Adult();
a.setAge("Roger"); //static type checker would complain
a.setName(42); //and here too
Nhưng nó không ngăn bạn mắc những sai lầm ngu ngốc như thế này:
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
Vấn đề xảy ra khi bạn đang sử dụng cùng loại để đại diện cho các loại thông tin rõ ràng khác nhau. Tôi đã nghĩ rằng một giải pháp tốt cho việc này sẽ mở rộng Integer
lớp, chỉ để ngăn ngừa lỗi logic nghiệp vụ, nhưng không thêm chức năng. Ví dụ:
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));
Đây có được coi là thực hành tốt? Hoặc có những vấn đề kỹ thuật không lường trước được với thiết kế hạn chế như vậy?
new Age(...)
đối tượng của mình, bạn không thể gán nó cho một biến kiểu Weight
ở bất kỳ nơi nào khác. Nó làm giảm số lượng những nơi mà sai lầm có thể xảy ra.
a.SetAge( new Age(150) )
Vẫn không biên dịch?