Domanda

Conosco molto bene il modello di comando, ma non capisco ancora la differenza in teoria tra un Functor e un comando. In particolare, sto pensando alle implementazioni Java. Entrambi fondamentalmente stanno programmando "verbi" rappresentato come oggetti. Tuttavia, nel caso dei funzioni, come ho visto da alcuni esempi, le implementazioni anonime della classe interna sembrano comuni. Qualcuno può chiarirmi bene?

È stato utile?

Soluzione

Un functor è un concetto di "livello di sintassi" - impacca il codice in un oggetto che può essere trattato sintatticamente come un puntatore a una funzione - cioè può essere "chiamato" mettendo l'elenco dei parametri tra parentesi dopo di esso. In C ++ potresti rendere una classe un funzione sostituendo l'operatore ().

Un comando nel modello di comando è un oggetto che impacchetta alcune funzionalità eseguibili, ma non è necessario che sia un funzione. Ad esempio, potrebbe essere una classe che implementa un'interfaccia ICommand, consentendo l'esecuzione del suo comando chiamando Do ().

Altri suggerimenti

Un functor è un'implementazione, un modo per far comportare un oggetto come una funzione.

Il 'modello di comando' è un modello di progettazione.
Il functor è un modo per implementare il "Command Pattern".

Ecco la risposta dal GOF :

  

Coplien descrive come implementare   funzione, oggetti che sono funzioni,   in C ++ [Cop92]. Raggiunge una laurea   di trasparenza nel loro uso da parte di   sovraccarico dell'operatore di chiamata di funzione   (operatore()). Il modello di comando è   diverso; il suo focus è sul mantenimento   un legame tra un ricevitore e a   funzione (cioè azione), non solo    mantenimento di una funzione .

Dalla descrizione della Apache Commons Functor :


Un functor è una funzione che può essere manipolata come un oggetto o un oggetto che rappresenta una singola funzione generica.

I sostenitori supportano e incoraggiano una serie di potenti tecniche di programmazione tra cui:

  • programmazione in stile funzionale
  • funzioni di ordine superiore
  • iteratori interni
  • riutilizzo e specializzazione attraverso la composizione piuttosto che l'eredità e il sovraccarico
  • generico " callback " o "punto di estensione" API
  • filtri " generici " o API predicate
  • molti " comportamentali " modelli di progettazione come Visitatore, Strategia, Catena di responsabilità, ecc.

Secondo la definizione citata da GOF (Gang of Four) (di Comptrol), Functor e Command sono due diversi pattern.

Come già detto, Functor rappresenta una Classe contenente un metodo di servizio, in altri termini: la responsabilità principale per la classe functor è di memorizzare la logica specifica implementata nel proprio metodo. Quindi, possiamo pensare al funzione come un contenitore per la logica interna del proprio metodo. Storicamente, Functor nasce perché nella specifica Java non è presente l'implementazione e / o il concetto di "puntatore a funzione", che è molto utile nel contesto di callback registrati (implementazione specifica per il modello di osservatore).

Il modello di comando rappresenta un modello di progettazione volto a disaccoppiare un'entità Invocatore da un'entità destinatario. Viene utilizzato principalmente quando è necessario per separare le azioni (generando gli eventi) dai listener di azioni (si pensi alle GUI). Ha un metodo responsabile per l'esecuzione di un'operazione specifica (a seconda dell'implementazione del comando particolare dalla propria superclasse) che si riferisce a un ricevitore oggetto specifico; nella definizione dichiarata, il metodo di esecuzione può essere definito come "non intelligente", infatti con un'implementazione intelligente potrebbe essere esso stesso a implementare la logica operativa invece di delegarla a un terzo oggetto. Quando disponiamo di un metodo di esecuzione intelligente, stiamo implementando un functor e inseriamo il functor (implementazione specifica della sottoparte del comando) nel contesto del modello di comando.

Spero che questo ti sia utile.

Penso che un funzione sia un componente del modello di comando, che coinvolge anche altre infrastrutture come l'invocatore e i destinatari del comando.

Il modello di comando viene utilizzato in Java perché non abbiamo chiusure in Java. Functors è un tentativo di implementare chiusure.

Una lingua con chiusure non ha bisogno del modello di comando.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top