Giả sử bạn phân chia các hệ thống của bạn trong các đối tượng Giá trị và Dịch vụ (như được đề xuất trong "Phát triển phần mềm hướng đối tượng, được hướng dẫn bằng thử nghiệm" .Misko Hevery gọi đây là "newables" và "injectables".Tiêm phụ thuộc khi lớp được tạo ra cũng cần giá trị thời gian chạy?
Điều gì sẽ xảy ra khi một đối tượng giá trị của bạn đột nhiên cần truy cập dịch vụ để thực hiện các phương thức của nó?
Giả sử bạn có một đối tượng Giá trị đơn giản tốt đẹp, nó không thay đổi, chứa một vài thông tin và đó là về nó. này:
CreditCard card = new CreditCard("4111-1111-1111-1111", "07/10");
if (card.isValid())
{
// do stuff
}
else
{
// don't do stuff
}
Cho đến nay rất tốt. isValid()
thực hiện một thuật toán kiểm tra chữ số trên số thẻ và trả về true/false.
Bây giờ, giả sử tôi muốn nâng cao hệ thống bằng cách xác thực ngày hết hạn so với thời gian hiện tại. Làm thế nào bạn sẽ đề nghị điều này được thực hiện mà không vi phạm đối tượng Value/Service object paradim? Tôi muốn lớp này tiếp tục là đơn vị có thể kiểm chứng được.
CreditCard
hiện có phụ thuộc, nhưng do cách tạo ra nó không thể được tiêm, do đó việc tiêm phụ thuộc bị loại bỏ.- Lớp
CreditCard
không nên được gọi ra để Singletons (tôi của vị trí đó truy cập toàn cầu tới một Singleton là xấu thực hành) - Đưa hành vi trên
CreditCardVerificationService.validateCard()
nghĩa là tất cả các mã hiện có phải được xem xét lại. Việc thực thi isValid() bị rò rỉ.
Tôi biết có những điều có thể được thực hiện để giải quyết vấn đề này, nhưng cách sạch nhất là gì?
Thú vị. Nó có vẻ tự nhiên với tôi rằng hành vi (xác nhận) nên sống với dữ liệu thay vì đối tượng CreditCard. –
Điều đó biến thế giới thực trên đầu của nó, mặc dù. Một thẻ tín dụng không có bất kỳ cách nào để xác nhận chính nó - giả mạo, thẻ hết hạn sống trong tự nhiên và không có ý tưởng nếu chúng là hợp lệ hay không. Nếu bạn gửi yêu cầu đến một bộ xử lý thanh toán, họ sẽ không hỏi bạn xem thẻ của bạn có hợp lệ hay không - hãy xác định bản thân và chỉ yêu cầu dữ liệu cần thiết để thực hiện điều đó. – expedient
@WW: Cũng Robert C. Martin "Chú Bob" nói về điều này khi mô tả Nguyên tắc Trách nhiệm duy nhất của SOLID trong ví dụ modem của mình (6 bài viết: http://www.objectmentor.com/resources/articles/srp.pdf). Tôi nghĩ rằng trong quá khứ CreditCard.Validate() sẽ được coi là thiết kế theo hướng đối tượng tốt nhưng xu hướng có vẻ là xa khỏi đó đối với nhiều lớp riêng biệt. Ngoài ra tôi đã hỏi một câu hỏi về điều này trên ProgrammersSE http://programmers.stackexchange.com/questions/77690/design-object-method-vs-separate-classs-method-which-takes-object-as-parameter – User