Mô hình đối tượng Null và xác thực đầu vào - sao chép thực hiện thực tế hoặc âm thầm chấp nhận mọi thứ?


8

Tôi có một WifiComponenttrong Cameraứng dụng khách hàng của tôi. Nó chịu trách nhiệm xử lý các chức năng liên quan đến Wifi của Camera. Camera đại diện cho một máy ảnh thế giới thực.

Điều này WifiComponentcó thể được kích hoạt (trong trường hợp tôi có thể thực hiện mọi việc với nó, như kiểm tra trạng thái kết nối và quét) hoặc bị vô hiệu hóa (trong trường hợp đó bạn không thể làm gì với nó, ngoài việc hỏi liệu nó có được bật không).

Khi tạo một ứng dụng kháchCamera của mình , tôi hỏi máy ảnh xem nó có được bật không. Sau đó, tôi xây dựng lớp con thích hợp của , hoặc .WifiComponentWifiComponentWifiComponentImplNullWifiComponent

Thực hiện supportedWifiTypes()wifiScan()các phương pháp là dễ dàng. Các NullWifiComponentkhông hỗ trợ bất kỳ loại, là ngay lập tức thực hiện với quét và tìm thấy không có kết quả.

Nhưng bây giờ tôi phải thực hiện một bool connect(WifiNetwork network, String password)phương pháp. Tôi muốn nói rằng tôi đã thất bại trong việc kết nối ... Nhưng tôi thậm chí không hỗ trợ WifiEncryptionTypeđược cung cấp trong WifiNetwork! Việc triển khai thực sự sẽ ném IllegalArgumentExceptionnếu bạn vượt qua nó một WifiEncryptionTypemạng wifi không được hỗ trợ .

Tôi có ...

  • Ném IllegalArgumentException, vì tôi không ủng hộ WifiEncryptionTypeyêu cầu?
  • Âm thầm không kết nối ( return false), bất kể những gì được cung cấp?

Câu hỏi tổng quát:

Nếu việc thực hiện thực sự hoàn thành một hợp đồng và một phần của hợp đồng này là đưa ra các ngoại lệ cho một số đầu vào nhất định, thì việc thực hiện null có ưu tiên tính trung lập của nó hay hợp đồng không?


Từ một POV hợp lý nghiêm ngặt, bạn có thể nói rằng vì bạn không có máy ảnh, máy ảnh của bạn không từ chối WifiEncriptionTypevì vậy nó không nên ném IllegalArgumentException. Vì vậy, tôi không nghĩ rằng không ném nó sẽ vi phạm hợp đồng.
SJuan76

Tôi có Máy ảnh, nó chỉ không hỗ trợ Wifi thông qua API của tôi, vì nó không được triển khai trên Máy ảnh trong API thiết bị hoặc vì Máy ảnh thực sự không có bộ điều hợp Wifi. Tôi nhận được quan điểm của bạn mặc dù.
Pimgd

Không bao giờ phá vỡ hợp đồng của một lớp. Khả năng của bạn để lý giải về những gì một chương trình làm phụ thuộc vào mọi thành phần làm những gì nó nói. Đôi khi bạn cần thay đổi hợp đồng hoặc thiết kế tổng thể để làm những gì bạn muốn, nhưng không bao giờ phá vỡ hợp đồng.
Doval

1
Nhưng tại sao bạn không thể thực hiện hợp đồng để khắc phục tình trạng wifi bị vô hiệu hóa? Chỉ cần ném một số WifiDisablesException (giả sử, mở rộng IllegalStateException) trong trường hợp này. Điều này sẽ cho phép mã máy khách nhận ra tình huống đó và phản hồi chính xác (ví dụ với chỉ dẫn thích hợp).
điệp khúc

@lorus Tôi chưa nghĩ đến điều đó.
Pimgd

Câu trả lời:


4

Vì việc triển khai null được coi là sự thay thế thả xuống cho việc thực hiện đầy đủ chức năng, nên việc triển khai null phải tuân thủ đầy đủ giao diện mà nó thực hiện.

Nếu WifiComponentgiao diện chỉ định connect()ném ngoại lệ nếu nó được gọi với một không được hỗ trợ WifiEncryptionType, thì đó chính xác là điều mà việc triển khai null của bạn nên làm, đặc biệt là nếu ứng dụng phải sử dụng cùng WifiComponentgiao diện để tìm hiểu WifiEncryptionTypenhững hỗ trợ nào.

Nếu danh sách các hỗ trợ WifiEncryptionTypekhông xuất phát từ việc triển khai null của bạn, thì việc triển khai null của bạn chỉ nên đưa ra một ngoại lệ nếu việc triển khai chức năng cũng được yêu cầu để ném nó.

Nếu WifiComponentgiao diện không xác định rằng phải ném ngoại lệ, thì tốt hơn là giả sử giá trị sẽ được chấp nhận đối với việc triển khai chức năng và báo cáo lỗi kết nối chung ( return false).


Tôi được phép sửa đổi giao diện của WifiComponent, nhưng tôi đang tìm kiếm sự cân bằng giữa việc không khó để làm việc và cung cấp lỗi ngay khi bạn làm điều gì đó chỉ có thể sai. Tôi nghĩ rằng việc ném ngoại lệ sẽ là cách tốt nhất vì đó là lỗi nhà phát triển chuyển sang loại mã hóa không được hỗ trợ và việc sử dụng mẫu đối tượng null là để đơn giản hóa việc xử lý null, không đơn giản hóa việc sử dụng hợp đồng.
Pimgd

@pimgd Tôi đồng ý với bạn ở đây. Đây rõ ràng là một lỗi logic chương trình nếu một loại mã hóa được chỉ định không xuất phát từ danh sách các loại được hỗ trợ, do đó, ném ngoại lệ chắc chắn là lựa chọn tốt nhất.
Jules

@Pimgd: Nếu WifiComponent chưa được thiết lập, tôi khuyên bạn trước tiên nên xác định hợp đồng hợp lý cho nó và sau đó tạo triển khai null của bạn với chức năng tối thiểu tuyệt đối không vi phạm hợp đồng bạn đã đặt.
Bart van Ingen Schenau
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.