2010-01-29 33 views
15

Nếu một lớp có một hàm tạo cần một số đối tượng giá trị làm tham số và dựa vào điều này để thực hiện khởi tạo của nó. Làm thế nào nó sẽ phản ứng nếu đối tượng này là null?Làm thế nào một constructor nên hành động khi đưa ra các thông số không hợp lệ?

class SomeClass 
{ 
    private SomeData _data; 
    public SomeClass(SomeValueObject obj) 
    { 
     _data = obj.Data; 
    } 
} 

Đây là một ví dụ, nhưng nói chung: Nhà thầu nên hoạt động như thế nào nếu thông số không hợp lệ và do đó không thể xây dựng đúng cách? Nó có nên quay trở lại mà không thực hiện bất kỳ khởi tạo nào không? Đặt các tham số cho một số giá trị mặc định? Ném một ngoại lệ? Thứ gì khác?

Tôi chắc chắn câu trả lời cho điều này là "Phụ thuộc", nhưng có bất kỳ phương pháp hay nhất nào không?

Trả lời

15

Một lập trình viên nên có thể để giả định một đối tượng được tạo thành công, trừ khi ngoại lệ được nêu ra. Loại ngoại lệ phụ thuộc vào đối số, nhưng dù sao cũng được bỏ chọn. Điều cuối cùng bạn muốn là constructor không xây dựng một đối tượng hợp lệ và không nói cho người gọi về nó.

Tôi nghĩ rằng việc sử dụng giá trị mặc định trong hàm tạo là một thói quen nguy hiểm.

+0

Tôi chắc chắn sẽ đi với cách tiếp cận ngoại lệ này. Đó là cách sạch nhất trong số này. – hurikhan77

+2

Tôi hỗ trợ điều này.Có đối tượng ở một số trạng thái không xác định thực sự không có nhiều giá trị .. – stiank81

2

Ném ngoại lệ đối số null.

+0

Điều gì xảy ra nếu nó không phải là rỗng, chỉ không hợp lệ? – NVRAM

+0

Trích dẫn 'Nếu một lớp có một hàm tạo sẽ nhận một số đối tượng giá trị làm tham số và dựa vào điều này để thực hiện khởi tạo của nó. Làm thế nào nó sẽ phản ứng nếu đối tượng này là null? ' – David

+1

Điều gì sẽ xảy ra nếu nó không phải là null, chỉ là không hợp lệ? Sau đó ném một ngoại lệ invalidargument, không phải khoa học tên lửa – David

3

Có vẻ như đây là Java, nhưng trong C++, nó sẽ dứt khoát ném (thậm chí là std::invalid_argument).

Xem C++ FAQ Lite 17.2.

Tôi đoán rằng đối với Java, nó giống hệt nhau.

Trong những trường hợp hiếm hoi khi ném ngoại lệ cho thấy quá lớn chi phí, bạn nên quay lại và đặt cờ trong đối tượng mà nó không xây dựng đúng cách. Sau đó, hãy kiểm tra chức năng thành viên isValid().

+0

Thực ra nó là C#, nhưng tôi cho rằng điều này nên giống nhau cho cả 3 ngôn ngữ - và nhiều hơn nữa. – stiank81

6

Rất nhiều phụ thuộc vào logic kinh doanh của bạn. Nếu logic nghiệp vụ của bạn yêu cầu SomeValueObject không được rỗng, nghĩa là SomeClass không thể được khởi tạo mà không có SomeValueObject thì trình xây dựng chắc chắn nên ném Ngoại lệ, có thể là IllegalArgumentException.

+0

nhiều apprechiated !!! –

1

Nếu trường là quan trọng, nó sẽ bỏ một ngoại lệ để cho biết rằng đối tượng không nên được sử dụng. Nếu nó không quan trọng bạn có thể gán giá trị mặc định.

1

Nếu một đối tượng có thể có giá trị mặc định không hợp lệ, thì nó phải khởi tạo giá trị mặc định và chờ khởi tạo. Ví dụ: foo.set_values(...). Trong trường hợp này, cần có truy vấn is_ready() hoặc is_valid() để cho phép kiểm tra trước khi sử dụng.

Nếu một đối tượng hoàn toàn không ở trạng thái dữ liệu không hợp lệ, thì nó sẽ ném một ngoại lệ.

Cả hai trường hợp này đều là những thứ tôi đã gặp phải.

Các vấn đề liên quan