2011-08-29 30 views
8

Thường thì tôi thấy cần phải thiết kế các đối tượng với chức năng có thể cấu hình.Cấu hình java/tham số truyền thiết kế

Để minh họa, giả sử tôi đang tạo một DateIterator. (Các) tùy chọn có thể định cấu hình có thể lặp lại khoảng thời gian đã đóng không [start, end] hoặc khoảng thời gian mở [start, end).


  • (1) Các, theo ý kiến ​​của tôi, giải pháp không có vẻ yêu kiều - chỉ vẻn vẹn có một tùy chọn cấu hình đúng/sai
new DateIterator(boolean openInterval); 
  • (2) Các typesafe enum cách - thường là một bit cồng kềnh
new DateIterator(Interval.OPEN_END); 
  • (3) Unconv entional nỗ lực - đẹp nhưng không quá thẳng về phía trước
new DateIterator().openEnd(); 
  • (4) Phương pháp kế thừa - thường quá kỹ thuật
new OpenEndedDateIterator(); 

Để này đi kèm một vài lựa chọn thay thế mà tôi xem xét kém , như cấu hình dựa trên số nguyên new DateIterator(Interval.OPEN_END); hoặc cấu hình dựa trên thuộc tính.

Có cách tiếp cận nào khác không? Bạn thích phương pháp nào?

Trả lời

6

Tôi muốn nói mô hình Builder có ý nghĩa ở đây:

DateIterator di = 
    DateIterator.builder() 
       .withStartDate(new Date()) 
       .withOpenEnd() 
       .build(); 

Bằng cách đó DateIterator thực tế của bạn có thể không thay đổi, trong khi xây dựng được trả về bởi DateIterator.builder() hiện các công việc cấu hình.

1

Trong khi không có câu trả lời tốt, và nó chủ yếu là một vấn đề của hương vị, tôi làm theo các nguyên tắc sau của ngón tay cái, với không gian rộng lớn cho trường hợp ngoại lệ để tránh qua kỹ thuật:

  1. Nếu cấu hình duy nhất mà bạn có là một "tham số", lấy một tập hợp cố định và thay đổi hành vi (như trong ví dụ của bạn), đi với các lớp con. Trong khi nó có thể được over-thiết kế, nếu nhiều phương pháp trong lớp học của bạn bắt đầu với một "if (this.parameter == x) ... else nếu (this.parameter == y) .." nó sẽ làm cho mã không đọc được.
  2. Nếu tham số của bạn không phải là bộ cố định, nhưng là chuỗi hoặc số và bạn CẦN nó để lớp hoạt động đúng cách, hãy đặt nó trong hàm tạo, nếu không bắt buộc tôi thích số giải pháp (3), cố gắng độc đáo:)
  3. Nếu bạn có nhiều tham số trong một tập hợp cố định (như START_OPEN_ENDED và STOP_OPEN_ENDED), việc tạo các lớp con có thể có nghĩa là tạo một lớp con cho mỗi hoán vị. Trong trường hợp đó xem xét đóng gói. Ví dụ (tôi sẽ không làm điều đó trong trường hợp cụ thể này, nhưng đó là một ví dụ tốt), tạo một lớp DateComparator đơn, với một lớp con để mở kết thúc và đóng gói một DateComparator để bắt đầu và một cho kết thúc, chỉ có một DateIterator.

Một lần nữa, đây là quy tắc mà tôi sử dụng, không bắt buộc và thường tôi thấy mình không tôn trọng nguyên văn.

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