2008-09-26 33 views
6

là gì (nếu có) các giả định ngụ ý hoặc hạn chế và sự khác biệt về thiết kế như:Câu hỏi về mẫu cấu trúc lớp. Tôi nên chọn gì?

A) này:

class SampleClass1 
{ 
    IWorker workerA; 
    IWorker workerB; 

    void setWorkerA(IWorker w); 
    void setWorkerB(IWorker w); 
    WorkResult doWork(); 
} 

B) so với này:

class SampleClass2 
{ 
    WorkResult doWork(IWorker workerA, IWorker workerB); 
} 

Tôi biết nó phụ thuộc vào dự án cụ thể nhưng nếu lớp trên là một phần của một khung nhỏ? Lớp đầu tiên có thể duy trì trạng thái và tách các bước tự nhiên hơn nhưng lớp thứ hai đảm bảo "giao tiếp thời gian thực" với người gọi bên ngoài tự nhiên hơn vì Công nhân được truyền mỗi khi doWork() được gọi.

Có bất kỳ đề nghị sử dụng hoặc thực hành chung nào hướng dẫn lựa chọn giữa hai cách trên không? Cảm ơn.

Trả lời

5

Trong tùy chọn (A) bạn đang tạo cái được gọi là đối tượng hàm hoặc hàm Functor, đây là mẫu thiết kế là well documented.

Hai ưu điểm chính là:

  • Các nhân viên có thể được thiết lập bởi ở một nơi và sau đó các đối tượng sử dụng ở những nơi khác
  • Các đối tượng có thể duy trì trạng thái giữa các cuộc gọi

Ngoài ra nếu bạn đang sử dụng một khung tiêm phụ thuộc (Spring, Guice etc ...) functor có thể được tự động khởi tạo và tiêm bất cứ nơi nào cần thiết.

Đối tượng chức năng được sử dụng rộng rãi trong thư viện, ví dụ: Mẫu Chuẩn Thư viện C++

0

Một Lựa Chọn:

IWorker lớp:

tĩnh WorkResult DoWork (Iworker một, Iworker b);

1

Nếu có nhiều hơn một phương pháp phụ thuộc vào IWorker a và b IWorker, tôi nói làm mẫu A.

Nếu chỉ DoWork() sử dụng cả IWorker a và b IWorker, sau đó làm mẫu B.

Cũng , mục đích thực sự của SampleClass của bạn là gì? doWork trông giống như một phương thức tiện ích mroe hơn bất cứ thứ gì khác.

1

A) là thiết kế kém vì nó cho phép đối tượng bị lỗi (một hoặc cả hai lớp nhân viên có thể chưa được đặt).

B) có thể tốt. Làm cho nó tĩnh mặc dù nếu bạn không phụ thuộc vào trạng thái bên trong của SampleClass2

+0

Tôi nghĩ trong ví dụ cơ bản này, chúng ta không thể gọi A là thiết kế tồi vì nó chỉ là đại diện của một cấu trúc lớp, không thực sự là lớp thực tế. Ngoài ra, doWork có thể ném một ngoại lệ nếu nó không có một thể hiện của cả hai lớp, có thể chấp nhận được. – scubabbl

+0

Tôi hiểu câu hỏi là câu hỏi thiết kế. Và các lớp như A) là IMHO điển hình cho các lớp học tạo ra nhiều vấn đề khi được sử dụng trong các phần khác của mã. Chúng có thể trong suốt đối với nhà thiết kế của lớp gốc, nhưng là điểm thất bại điển hình khi được người khác sử dụng. – Thorsten79

0

Cách tiếp cận IMO thứ 2 có vẻ tốt hơn, nó yêu cầu người gọi sử dụng ít mã hơn để thực hiện tác vụ. Cách tiếp cận thứ 2 ít bị lỗi hơn, người gọi không cần phải lo lắng rằng đối tượng có thể không được khởi tạo hoàn toàn.

0

Thay vì xác định WorkDelegate (hoặc một giao diện có một phương thức doWork đơn lẻ) mà chỉ cần trả về WorkResult và cho phép các lớp riêng xác định cách chúng triển khai? Bằng cách này, bạn không tự giới hạn mình với các quyết định sớm.

6

SampleClass1

  • tôi có thể cần để duy trì trạng thái của người lao động giữa DoWork
  • tôi có thể cần năng lực để thiết lập Công nhân riêng rẽ. (doWork with 1 and 2, sau đó với 2 và 3)
  • Tôi muốn duy trì công nhân bởi vì nó có thể được dự kiến ​​chạy doWork nhiều lần trên cùng một công nhân.
  • Tôi không phải là lớp tiện ích. Một ví dụ của tôi là quan trọng.

SampleClass2

  • Hãy cho tôi hai người lao động và tôi sẽ làm việc với họ.
  • Tôi không quan tâm họ là ai và tôi không muốn duy trì chúng.
  • Đó là công việc của người khác để duy trì bất kỳ sự ghép nối nào giữa người lao động.
  • Tôi có thể có nhiều hơn một lớp tiện ích. Có lẽ tôi chỉ có thể tĩnh.
2

Một tùy chọn khác, một biến thể của trường hợp A, là như sau:

 
class SampleClass3 
{ 
    SampleClass3(IWorker workerA, IWorker workerB); 
    WorkResult doWork(); 
} 

Ưu điểm:

  • Đó là khó khăn hơn để làm cho đối tượng khiếm khuyết, kể từ khi bạn được yêu cầu cung cấp tất cả các công nhân cần thiết vào thời điểm xây dựng (ngược lại với trường hợp A).

  • Bạn vẫn có thể mang trạng thái bên trong SampleClass3 và/hoặc một trong các công nhân. (Điều này là không thể trong trường hợp B.)

Nhược điểm:

  • Bạn phải có tất cả các nhân viên của bạn sẵn sàng trước khi bạn xây dựng SampleClass3, thay vì có thể cung cấp cho họ sau này. Tất nhiên, bạn cũng có thể cung cấp cho người định cư để họ có thể thay đổi sau này.