2012-02-16 12 views
5

P. ej. en el desarrollo del controlador de Linux uno puede encontrar la macro container_of. En esencia, es el operador inverso al ->, produciendo el puntero a la estructura contenedora si obtienes un puntero a un miembro.Nombre real del patrón "contenedor_de"

Además del blog de Greg Kroah encontré este patrón en la implementación list y hash de Pintos.

+3

Solo para agregar a su lista, Windows tiene la macro 'CONTAINING_RECORD 'similar. No sé de un nombre genérico para el 'patrón'. –

+1

Cuando se utiliza para implementar estructuras de datos de contenedores, impulsar llama a esta técnica "contenedores intrusivos" en el mundo C++. Aunque container_of es más general y útil en otros contextos que para implementar estructuras de datos generales como listas y tablas hash. – nos

Respuesta

2

El verdadero nombre de este patrón es "container_of()." Intentar encajar este C-ismo en una taxonomía de patrón de diseño de Java o C++ es inútil. El punto no es encadenar la responsabilidad, o designar o delegar nada. Si debe pensar en estos términos, entonces es una "herencia generalizada desordenada". Si no tiene que pensar en estos términos, entonces es mucho menos complicado.

0

Yo diría que no es muy útil Chain Of Responsibility. La única razón por la que necesita un puntero a la estructura del contenedor principal es colocar la funcionalidad del contenedor primario al alcance de los elementos que contiene. Como tal, podría ser visto como un detalle de implementación requerido para permitir que una solicitud se filtre hasta la "cadena" hasta que se maneje en el "nivel" correcto.

Con una relación contenedor/contenido, ese nivel "correcto" es solo un nivel arriba, y el goteo no pasa por suficientes niveles (ya que hay un solo nivel) para generar mucho interés como un ejemplo ideal de el patrón. Aún así, las ideas generales detrás de Chain of Responsibility aún se mantienen; se realiza una solicitud en un punto de la cadena que no puede manejarlo, y se maneja en un punto diferente del cambio que puede.

Con una pequeña relación recipiente/contenido no genérica, el acoplamiento de esta cadena de dos enlaces puede ser bastante apretado. Por ejemplo, sus ejemplos carecen de un marco de manejo de "comando" genérico (dado que el conjunto de idiomas de comando es pequeño), y dicho marco generalmente requiere (para la seguridad del tipo) un Objeto de Comando/Mensaje. Eso es una gran cantidad de gastos generales, para una lista que simplemente quiere que sus elementos notifiquen directamente en el nivel del elemento que desean ser eliminados de la lista.

Y sí, there is a C2 pattern's page for it ... Si está de acuerdo con mi razonamiento.

Cuestiones relacionadas