2009-09-15 33 views
5

Trong một số previous question một trong các ý kiến ​​từ Dr. Herbie về câu trả lời được chấp nhận là phương pháp của tôi đã thực hiện hai trách nhiệm .. đó là thay đổi dữ liệu và lưu dữ liệu.Cách tốt nhất để phân tách các mối quan tâm đối với mã này là gì?

Điều tôi đang cố gắng tìm ra là cách tốt nhất để phân tách các mối quan ngại này trong tình huống của tôi.

Tiến về với ví dụ của tôi về việc có một đối tượng chính sách được lấy thông qua NHibernate ....

Con đường tôi hiện đang thiết lập chính sách để ít vận động là như sau:

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 

//method in PolicyManager which has data access and update responsibility 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
    Update(policy); 
} 

Nếu Tôi đã phân chia trách nhiệm truy cập dữ liệu và cập nhật dữ liệu những gì sẽ là cách tốt nhất để đi về nó?

Là nó tốt hơn để có PolicyManager (đóng vai trò như cửa ngõ vào dao) quản lý nhà nước của các đối tượng chính sách:

Policy policy = new Policy(); 
policy.Status = Active; 

policyManager.Inactivate(policy); 
policyManager.Update(policy); 

//method in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    policy.Status = Inactive; 
} 

Hoặc có các đối tượng chính sách duy trì đó là trạng thái riêng và sau đó sử dụng lớp quản lý để lưu thông tin vào cơ sở dữ liệu:

Policy policy = new Policy(); 
policy.Status = Active; 

policy.Inactivate(); 

policyManager.Update(policy); 

//method in Policy 
public void Inactivate() 
{ 
    this.Status = Inactive; 
} 

Trả lời

1

Khi tiếp tục nhận xét ban đầu của tôi :) ... Hiện tại cược tốt nhất của bạn là tùy chọn thứ ba, nhưng nếu mọi thứ trở nên phức tạp hơn, bạn có thể sử dụng phương thức thứ hai, đồng thời thêm các phương thức mặt tiền để thực hiện các chuỗi được chỉ định trước:

Policy policy = new Policy(); 

policy.Status = Active; 

policyManager.InactivateAndUpdate(policy); 


//methods in PolicyManager 
public void Inactivate(Policy policy) 
{ 
    // possibly complex checks and validations might be put there in the future? ... 
    policy.Status = Inactive; 
} 

public void InactivateAndUpdate(Policy policy) 
{ 
    Inactivate(policy); 
    Update(policy); 
} 

các InactivateAndUpdate là một loại phương pháp mặt tiền, mà chỉ là có để làm cho mã gọi một gọn gàng chút, trong khi vẫn cho phép các phương pháp làm việc thực tế là mối quan tâm riêng biệt (loại vi phạm trách nhiệm duy nhất cho phương pháp , nhưng đôi khi bạn phải thực dụng!). Tôi cố tình đặt tên các phương thức như vậy theo kiểu X Y để làm nổi bật chúng như làm hai việc.

Phương thức InactivateAndUpdate sau đó giải phóng bạn để bắt đầu triển khai các mẫu chiến lược hoặc tách các phương thức triển khai thực tế làm đối tượng lệnh để xử lý động hoặc bất kỳ kiến ​​trúc nào khác có thể khả thi trong tương lai.

3

những gì tôi sẽ làm gì:

  • Tạo một kho lưu trữ và truy xuất Chính sách. (PolicyRepository)

  • Nếu bạn có logic phức tạp phải được thực hiện để kích hoạt/hủy kích hoạt một chính sách, bạn có thể tạo một Dịch vụ cho điều đó. Nếu dịch vụ đó cần truy cập vào cơ sở dữ liệu, thì bạn có thể chuyển một PolicyRepository cho nó, nếu cần thiết. Nếu không có logic phức tạp, và việc kích hoạt/hủy kích hoạt chính sách chỉ là vấn đề đặt cờ thành sai hoặc đúng hoặc chỉ thành viên của lớp chính sách có liên quan, thì tại sao 'Kích hoạt' không phải là thuộc tính đơn giản của Lớp chính sách mà bạn có thể đặt thành false/true? Tôi sẽ chỉ tạo một dịch vụ, nếu các đối tượng khác có liên quan, hoặc nếu yêu cầu truy cập DB để kích hoạt hoặc hủy kích hoạt một chính sách.

0

Nếu tình trạng này là một phần của tình trạng lớp Policy thì Policy cũng nên có phương pháp Inactivate - đó chỉ là đóng gói cơ bản. Ghép nhiều lớp trong một trách nhiệm duy nhất ít nhất là xấu như đưa ra một lớp nhiều trách nhiệm.

Ngoài ra, tình trạng có thể được coi metadata về các Policy, thuộc không đến Policy nhưng đến PolicyManager. Trong trường hợp đó, mặc dù, Policy không nên biết trạng thái riêng của nó cả.

1

Tôi chắc chắn sẽ đi với các tùy chọn thứ 3 vì những lý do mà bạn đề cập:

đối tượng chính sách duy trì nó là của riêng nhà nước và sau đó sử dụng lớp quản lý để lưu thông tin vào cơ sở dữ liệu

Ngoài ra, hãy xem Repository Pattern. Nó có thể thay thế PolicyManager của bạn.

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