2012-02-16 19 views
5

Ví dụ: trong phát triển trình điều khiển Linux, bạn có thể tìm thấy macro container_of. Về bản chất, nó là toán tử đảo ngược đến một số ->, sinh ra con trỏ tới cấu trúc chứa nếu bạn có một con trỏ tới một thành viên.Tên thật của mẫu "container_of"

Bên cạnh blog của Greg Kroah tôi đã tìm thấy mẫu này trong việc thực hiện listhash của Pintos.

+3

Chỉ cần thêm vào danh sách của bạn, Windows có macro tương tự 'CONTAINING_RECORD'. Tôi không biết tên chung cho 'mẫu'. –

+1

Khi được sử dụng để triển khai cấu trúc dữ liệu vùng chứa, hãy tăng cường gọi kỹ thuật này là "thùng chứa xâm nhập" trong thế giới C++. Mặc dù container_of tổng quát hơn và hữu ích trong các ngữ cảnh khác hơn là triển khai các cấu trúc dữ liệu chung như danh sách và bảng băm. – nos

Trả lời

2

Tên thật của mẫu này là "container_of()". Cố gắng để phù hợp C-ism này vào một phân loại mẫu thiết kế Java hoặc C++ là vô ích. Vấn đề không phải là trách nhiệm chuỗi, hoặc chỉ định hoặc ủy quyền bất cứ điều gì. Nếu bạn phải suy nghĩ trong các điều khoản này thì đó là một "kế thừa tổng quát lộn xộn." Nếu bạn không phải suy nghĩ trong những điều khoản này thì nó sẽ ít lộn xộn hơn nhiều.

0

Tôi muốn nói đó là tính năng không thực sự nổi bật Chain Of Responsibility. Lý do duy nhất bạn cần một con trỏ quay trở lại cấu trúc vùng chứa cha mẹ của bạn là đặt chức năng vùng chứa mẹ trong phạm vi tiếp cận của các phần tử được chứa. Do đó, có thể được xem là chi tiết triển khai được yêu cầu để cho phép yêu cầu lừa "chuỗi" cho đến khi được xử lý ở cấp "chính xác".

Với mối quan hệ chứa/chứa, mức "chính xác" chỉ là một cấp và mức tăng lên không đủ thông qua (vì chỉ có một cấp) để tạo ra nhiều sở thích như một ví dụ lý tưởng về mô hình. Tuy nhiên, các ý tưởng chung đằng sau Chain of Responsibility vẫn giữ; một yêu cầu được thực hiện tại một điểm trong chuỗi mà không thể xử lý nó, và được xử lý tại một điểm khác nhau trong sự thay đổi có thể.

Với mối quan hệ chứa/không chứa chung nhỏ, khớp nối của chuỗi liên kết hai này có thể khá chặt chẽ. Ví dụ, các ví dụ của bạn thiếu khung xử lý "lệnh" chung (vì tập hợp ngôn ngữ lệnh là nhỏ), và khung như vậy thường yêu cầu (đối với an toàn kiểu) đối tượng Command/Message. Đó là rất nhiều chi phí, cho một danh sách mà chỉ muốn để cho nó các yếu tố trực tiếp thông báo ở cấp độ phần tử mà họ muốn được loại bỏ khỏi danh sách.

Và có, there is a C2 pattern's page for it ... Nếu bạn đồng ý với lý do của tôi.

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