Schema interfaccia marcatore - Marker interface pattern

Il pattern di interfaccia marker è un pattern di progettazione in informatica , utilizzato con linguaggi che forniscono informazioni di tipo runtime sugli oggetti. Fornisce un mezzo per associare i metadati a una classe in cui il linguaggio non ha un supporto esplicito per tali metadati.

Per utilizzare questo modello, una classe implementa un'interfaccia marker (chiamata anche interfaccia di tagging ) e metodi che interagiscono con le istanze di quella classe verificano l'esistenza dell'interfaccia. Mentre una tipica interfaccia funzionalità specifica (sotto forma di dichiarazioni di metodi) che una classe di attuazione deve sostenere, un bisogno un'interfaccia marcatore non farlo. La semplice presenza di tale interfaccia indica un comportamento specifico da parte della classe di attuazione. Le interfacce ibride, che agiscono sia come indicatori che specificano i metodi richiesti, sono possibili ma possono creare confusione se utilizzate in modo improprio.

Un esempio dell'applicazione delle interfacce marker dal linguaggio di programmazione Java è l' Serializableinterfaccia. Una classe implementa questa interfaccia per indicare che i suoi membri dati non transitori possono essere scritti in un file ObjectOutputStream. Il ObjectOutputStreammetodo privato writeObject0(Object,boolean)contiene una serie di instanceoftest per determinare la scrivibilità, uno dei quali cerca l' Serializableinterfaccia. Se uno di questi test fallisce, il metodo genera un NotSerializableException.

Critica

Un grosso problema con le interfacce marker è che un'interfaccia definisce un contratto per l'implementazione delle classi e quel contratto viene ereditato da tutte le sottoclassi. Ciò significa che non è possibile "disinstallare" un marker. Nell'esempio dato, se crei una sottoclasse che non vuoi serializzare (forse perché dipende dallo stato transitorio), devi ricorrere al lancio esplicito NotSerializableException(per ObjectOutputStreamdocumenti)

Un'altra soluzione è che la lingua supporti direttamente i metadati :

  • Sia .NET Framework che Java (a partire da Java 5 (1.5)) forniscono supporto per tali metadati. In .NET, sono chiamati "attributi personalizzati" , in Java sono chiamati " annotazioni " . Nonostante il nome diverso, sono concettualmente la stessa cosa. Possono essere definiti su classi, variabili membro, metodi e parametri del metodo ed è possibile accedervi utilizzando reflection .
  • In Python , il termine "interfaccia marker" è comune in Zope e Plone . Le interfacce sono dichiarate come metadati e le sottoclassi possono essere utilizzate implementsOnlyper dichiarare che non implementano tutto dalle loro super classi.

Guarda anche

  • Marcatori di design per un'espansione di questo modello.
  • Joshua Bloch, "Effective Java (Second edition)," Item 37: Usa interfacce marker per definire i tipi, pagina 179 (Terza edizione: Item 41, page 191).

Riferimenti