2009-02-25 30 views
5

Có quy tắc hay về ngón tay cái hoặc thử nghiệm tôi có thể thực hiện để xác định xem một phương thức hoặc trường thuộc về một lớp không? Làm thế nào để xác định khi một thành viên không thuộc về?Có heuristic để xác định xem một phương pháp hoặc lĩnh vực thuộc về một lớp học?

Tôi thấy rằng trở ngại lớn nhất của tôi trong thiết kế hướng đối tượng là cố gắng tìm ra điều gì xảy ra ở đâu. Dường như có quá nhiều trường hợp câu trả lời là: "nó có thể đến đây hoặc ở đó".

Dưới đây là một ví dụ nhanh chóng của các loại điều tôi đang phải vật lộn với:

Public Class ITDepartment 

    Private _sysadmins As List(Of Employee) 
    Private _developers As List(Of Employee) 

    // properties, public stuff... 

    Private Sub AddSkillToGroup(ByVal emps As List(Of Employee), ByVal skill As Skill) 
     For Each e As Employee In emps 
      e.AddSkill(skill) 
     Next 
    End Sub 

End Class 

Đối tượng ITDepartment quản lý 2 nhóm Employees ... nhưng nó nên biết rằng Employees có kỹ năng? Một phương pháp như AddSkillToGroup có được di chuyển không?

EDIT:

Dường như sự đồng thuận vậy, đến nay là ITDepartment không nên biết về kỹ năng của nhân viên. Tôi sẽ đóng vai người bảo vệ của Ma Quỷ một chút để minh họa nơi sự nhầm lẫn của tôi xuất hiện.

ITDepartment bao gồm hai bộ sưu tập Nhân viên. Không phải nó có thể ủy thác cho những mặt hàng đó? Phương thức AddSkill vẫn thuộc về lớp Employee. ITDepartment chỉ đơn giản là hướng dẫn nhóm nhân viên của mình thêm một kỹ năng cho từng thành viên của nó.

+0

Bạn có yêu cầu NẾU bạn nên ủy quyền không? Câu trả lời luôn là "có". Hay bạn đang yêu cầu LÀM THẾ NÀO? Nếu có, vui lòng sửa câu hỏi của bạn. Hay bạn đang hỏi một số câu hỏi khác về phái đoàn? –

+0

Tôi tự hỏi liệu nó có ổn cho lớp ITDepartment để "tiếp cận" và ủy nhiệm cho lớp Employee qua Danh sách (Of Employee) mà nó bao gồm (giống như khi nó gọi e.AddSkill ở trên). –

Trả lời

3

Nhìn vào nguyên tắc SOLID. Những người sẽ cung cấp cho bạn hướng dẫn về nơi một phương pháp thuộc về.


Sửa

"nên không [ITDepartment] có thể uỷ thác cho những mục bộ sưu tập?"

"[nó]] cho lớp ITDepartment để" tiếp cận "và ủy quyền cho lớp nhân viên thông qua Danh sách (Nhân viên) mà nó bao gồm (giống như khi nó gọi e.AddSkill ở trên). "

Có.

Ủy quyền là cách hoạt động của chương trình OO. Bạn ủy quyền chi tiết cho Lớp có trách nhiệm duy nhất. Bạn Ủy quyền triển khai để bạn có thể phụ thuộc vào trừu tượng không triển khai.

BTW, AddSkillToGroup là riêng tư, điều này gây nhầm lẫn. Nó không che giấu một chi tiết thực hiện mà không có cơ hội thay đổi. Không có lý do cho việc này là riêng tư. [tư nhân thường được sử dụng quá mức và sử dụng không thích hợp. Rất, rất ít nên là riêng tư; và nó chỉ nên được khai báo riêng khi thật cần thiết.]

Vì việc triển khai đã được giao cho nhân viên, AddSkillToGroup không phải là chi tiết triển khai của lớp này.

+0

Riêng tư vì đó là chi tiết triển khai. Nó có thể là một phương thức "trợ giúp" cho một phương thức công khai được gọi là 'TrainEmployees()', bổ sung thêm kỹ năng và cấp chứng chỉ hoặc một thứ gì đó. Tôi không hiểu tại sao điều đó lại lạ lùng. –

+0

@ vg1890: riêng tư được sử dụng quá mức. Điều này không che giấu bất kỳ chi tiết triển khai nào có thể thay đổi và làm mất hiệu lực một số khách hàng. –

+0

@ S.Lott: không phải nó che giấu từ khách hàng thực tế là TrainEmployees() bao gồm thêm một kỹ năng và ngăn họ gọi trực tiếp AddSkill? –

4

Tôi muốn tạo List(Of Employee) thành lớp riêng của mình tại thời điểm này, để có thể có phương thức riêng AddSkill().

Tôi đoán bạn quyết định bằng mùi mã. Đặc biệt trong danh sách các đối số quá dài; với các vật khác. Bạn cũng có thể thử nó và xem liệu bạn có thể tạo ra nhiều thứ riêng tư hơn trước đây không.

Tìm hiểu các phương pháp hoặc tập hợp các phương thức & thành viên tạo thành một nhóm phụ mạch lạc trong một lớp - chúng chín muồi để di chuyển vào lớp riêng của chúng.

+0

Vâng, những gì anh ta nói. Hoặc là loại bỏ hoàn toàn chức năng đó vì nó quá nhỏ, hoặc tạo một lớp EmployeeCollection và thêm nó vào đó. Nó chắc chắn không liên quan gì đến lớp ITDepartment. – munificent

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