Pregunta

Estoy muy familiarizado con el patrón de Comando, pero todavía no entiendo la diferencia en teoría entre un Functor y un comando. En particular, estoy pensando en implementaciones de Java. Ambos son básicamente programación "verbos" representado como objetos. Sin embargo, en el caso de los functores, como he visto en algunos ejemplos, las implementaciones anónimas de clase interna parecen comunes. ¿Alguien puede aclararme esto amablemente?

¿Fue útil?

Solución

Un functor es un concepto de 'nivel de sintaxis': empaqueta el código en un objeto que se puede tratar sintácticamente como un puntero de función, es decir, se puede 'llamar' al poner la lista de parámetros entre paréntesis. En C ++, puede convertir una clase en un functor anulando el operador ().

Un comando en el patrón de comando es un objeto que empaqueta algunas funciones ejecutables, pero no es necesario que sea un functor. Por ejemplo, podría ser una clase que implementa una interfaz ICommand, permitiendo que su comando se ejecute llamando a Do ().

Otros consejos

Un functor es una implementación, una forma de hacer que un objeto se comporte como una función.

El 'Patrón de comando' es un patrón de diseño.
El functor es una forma de implementar el 'Patrón de comando'.

Aquí viene la respuesta del GOF :

  

Coplien describe cómo implementar   functores, objetos que son funciones,   en C ++ [Cop92]. El logra un grado   de transparencia en su uso por   sobrecargar el operador de llamada de función   (operador()). El patrón de comando es   diferente; se centra en mantener   un enlace entre un receptor y un   función (es decir, acción), no solo    mantener una función .

De la descripción de la página Apache Commons Functor :


Un functor es una función que puede manipularse como un objeto, o un objeto que representa una única función genérica.

Los fundadores apoyan y alientan una serie de potentes técnicas de programación que incluyen:

  • programación en un estilo funcional
  • funciones de orden superior
  • iteradores internos
  • reutilización y especialización a través de la composición en lugar de la herencia y la sobrecarga
  • genérico " devolución de llamada " o "punto de extensión" API
  • filtros genéricos " o API de predicados
  • muchos " conductuales " patrones de diseño, como Visitante, Estrategia, Cadena de responsabilidad, etc.

De acuerdo con la definición citada por GOF (Gang of Four) (por Comptrol), Functor y Command son dos patrones diferentes.

Como ya se dijo, Functor representa una clase que contiene un método de servicio, en otros términos: la responsabilidad principal de la clase functor es almacenar la lógica específica implementada en su propio método. Por lo tanto, podemos pensar en el functor cómo un contenedor para la lógica interna de su propio método. Históricamente, Functor nace porque en la especificación de Java no está presente la implementación y / o el concepto de 'puntero de función', que es muy útil en el contexto de devoluciones de llamada registradas (implementación específica para el patrón de observador).

El patrón de comando representa un patrón de diseño destinado a desacoplar una entidad Invoker de una entidad receptora. Se usa principalmente cuando se necesita para descuplar las acciones (generar los eventos) de los oyentes de la acción (piense en las GUI). Tiene un método responsable de la ejecución de una operación específica (dependiendo de la implementación de comando particular de su propia superclase) que se refiere a un receptor de objetos específico; en la definición indicada, el método de ejecución puede definirse como "no inteligente", de hecho, con una implementación inteligente podría ser para implementar la lógica operativa en lugar de delegarlo en un tercer objeto. Cuando tenemos un método de ejecución inteligente, estamos implementando un functor, y estamos poniendo el functor (implementación de subparte de comando específico) en el contexto del patrón de comando.

Espero que esto sea útil para usted.

Pienso en un functor como un componente del patrón de comando, que también involucra otra infraestructura como el invocador y los destinatarios del comando.

El patrón de Comando se usa en Java porque no tenemos cierres en Java. Functors es un intento de implementar cierres.

Un lenguaje con cierres no necesita el patrón de Comando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top