2009-03-04 34 views
6

Phần mềm tôi sẽ xây dựng sẽ liên quan đến "ứng dụng" chuyển đổi giữa các trạng thái khác nhau rất nhiều. Một số nhiệm vụ có thể được thực hiện tùy thuộc vào trạng thái của một ứng dụng. Tôi đã suy nghĩ về việc sử dụng enum như tình trạng cácEnum vs bảng tra cứu vs phản ánh Enum vs mô hình nhà nước

public class Application 
{ 
    public int Id {get;set;} 
    public Status {get;set;} 
} 
public enum Status 
{ 
    [Description("New")]New = 1, [Description("Closed")]Closed = 2 
} 

Nhưng sau đó tôi nghĩ có lẽ đó là tốt để sử dụng bảng tra cứu trong cơ sở dữ liệu như tình trạng không được cập nhật/tái đặt hàng khá thường xuyên

table status (id int pk, desc string, sort_order int) 
table application (id int pk, status_id int fk) 

Trong tôi trường hợp tôi cần phải làm những việc như

if (application.Status == Status.New) 
{ //do something } 
else if (application.Status == Status.Closed) 
{ //do other things } 

Tôi nghĩ rằng trường hợp trên dễ thực hiện hơn với enum. Tuy nhiên khi nói đến việc cập nhật thứ tự sắp xếp trạng thái hoặc mô tả nó sẽ khá khó khăn.

Tôi có nên sử dụng phản chiếu để tự động tạo enum dựa trên các giá trị từ bảng tra cứu không? Hoặc tôi nên sử dụng mẫu trạng thái? Vấn đề tôi thấy với sự phản xạ enum là tác động hiệu suất. Và mô hình trạng thái có thể tạo ra rất nhiều mã dự phòng.

Bạn nghĩ sao? Cảm ơn trước!

Trả lời

3

Tôi muốn tạo một lớp Trạng thái chứa các khác biệt và gọi những thứ đó. Vì vậy, (bằng Python):

class StatusZero(object): 
    def call_me(self, app): 
     print 'Hello, from ' + app.name 
     return db.prepare_specific_status_zero_request() 


class StatusOne(object): 
    def call_me(self, app): 
     print 'Hi, from ' + app.name 
     return db.prepare_specific_status_one_request() 

states = { 'status_zero' : StatusZero(), 'status_one' : StatusOne() } 

class Application(object): 
    name = 'My App' 
    status = states['status_zero'] 

    def change_state(self, state): 
     status = state 

    def call_me(self): 
     state_key = self.status.call_me(self) 
     self.change_state(states[state_key]) 

Nhanh chóng, dễ giữ chức năng ngăn cách và với mẫu thừa kế hợp lý giữa các trạng thái bạn có thể chia sẻ các chức năng không khác nhau.

+0

làm thế nào để xử lý các u thu lấy từ db và dàn diễn viên đến đối tượng bit mà không có nếu tuyên bố khác như tôi đã đề cập trong câu trả lời 3? – Jeff

+0

Tôi đoán tôi khó có thể hiểu được vấn đề. Mỗi đối tượng Trạng thái có thể chứa bất kỳ mã nào bạn muốn - bao gồm các phôi có dây cứng nếu cần. Đối tượng Application có thể vẫn giữ nguyên; nó gửi các cuộc gọi khác với Trạng thái nội bộ. –

+0

vấn đề của tôi là làm thế nào để tránh tay viết nếu tuyên bố khác khi đúc bảng dữ liệu trở lại đối tượng trong trạng thái chính xác, trong ví dụ của bạn, làm thế nào để bạn cast hàng dữ liệu trở lại StatusZero hoặc StatusOne mà không có statment khác? – Jeff

7

Bạn không nên rắc mã của bạn với việc kiểm tra này ở khắp mọi nơi

if (application.Status == Status.New) 
{ //do something } 
else if (application.Status == Status.Closed) 
{ //do other things } 

Thay vào đó, sử dụng các mô hình nhà nước. Thay đổi trạng thái bất cứ khi nào chế độ của ứng dụng thay đổi và chuyển tiếp tất cả các cuộc gọi của bạn đến các phương thức của tiểu bang. Bạn sẽ có một mã sạch hơn và dễ bảo trì hơn.

Đối với việc thay đổi trạng thái, điều đó không có gì liên quan đến mẫu trạng thái. Vì vậy, bạn có thể sử dụng phương pháp nào là thanh lịch.

0

Sự hiểu biết của tôi là mẫu trạng thái khá tốt cho giao diện người dùng hoặc chỉ trong thực thi bộ nhớ, trong trường hợp của tôi khi truy xuất dữ liệu từ bảng ứng dụng, vẫn cần có câu lệnh khác để xác định đối tượng cần truyền.

public AbstractApplication convert_db_application_to_object(obj db_application) 
{ 
    AbstractApplication app; 
    if (db_application.Status == (int)Status.New) 
     app = application_factory.create(application_state_new); 
    else if(db_application.Status == (int)Status.Closed) 
     app = application_factory.create(application_state_closed); 

    return app; 
} 

tôi không coi đây là một giải pháp thanh lịch như tôi vẫn cần hoặc một enum hoặc tra cứu bảng để lưu các trạng ứng dụng vào cơ sở dữ liệu