Rozhraní značky (návrhový vzor)

Marker interface , marker ( angl.  marker interface pattern ) je návrhový vzor používaný v programovacích jazycích s kontrolou typu runtime . Šablona poskytuje možnost přidružit metadata (rozhraní) ke třídě, i když v jazyce neexistuje žádná explicitní podpora metadat.

Pro použití tohoto modelu třída implementuje rozhraní [1] ("označené rozhraním") a metody interagující s třídou kontrolují přítomnost rozhraní. Na rozdíl od běžného rozhraní , které definuje funkčnost (ve formě deklarací metod a vlastností), kterou musí implementovaná třída objektů mít, je důležitá skutečnost, že třída má značku. Značka je pouze znakem přítomnosti určitého chování v objektech třídy označené značkou. Samozřejmě jsou možná "smíšená" rozhraní, ale při neopatrném použití mohou způsobit zmatek.

Příkladem použití značek rozhraní v programovacím jazyce Java je rozhraní Serializable. Třída musí implementovat toto rozhraní, aby naznačila, že jeho instance lze zapisovat do ObjectOutputStream. Třída ObjectOutputStreammá veřejnou metodu writeObject(), která obsahuje řadu instanceofkontrol zapisovatelnosti, z nichž jednou je rozhraní Serializable. Pokud selže celá série kontrol, metoda vyvolá výjimku NotSerializableException.

Dalším příkladem je rozhraní INamingContainer , které je definováno v .NET Framework . INamingContainerdefinuje ovládací prvek kontejneru, který vytvoří nový identifikátor jmenného prostoru v hierarchii ovládacích prvků Page. [2] . Jakýkoli ovládací prvek, který implementuje toto rozhraní, vytvoří nový jmenný prostor, který zajistí, že všechna ID atributů podřízených ovládacích prvků budou v celé aplikaci jedinečná. Při navrhování ovládacích prvků podle šablony musíte implementovat toto rozhraní, abyste předešli konfliktům pojmenování na stránce.

Aplikace

Třída Repeaterje ovládací prvek seznamu vázaný na data, který je definován v rozhraní .NET Framework ( ASP.net ). Tento prvek umožňuje vytvořit označení opakováním zadaného vzoru pro každý prvek seznamu. Aby se předešlo konfliktům v názvech, je třída označena rozhraním INamingContainer.

veřejné rozhraní INamingContainer { } public class Control : IComponent , ... { ... internal bool IsBindingContainer { get { return (( toto je INamingContainer ) && !( toto je INonBindingContainer )); } } ... } public class opakovač : Control , INamingContainer { ... }

Na základě vlastnosti přidá IsBindingContainer runtimeRepeater během generování stránky nový jmenný prostor k identifikátorům ovládacích prvků, které jsou v ovládacím prvku .

Výhody

Výhodou použití značky je, že v jazycích, které nepodporují metadata , lze přidat další informace o chování třídy. Zároveň například v některých jazycích trvá extrahování informací z metadat déle, což při častém používání ovlivní výkon. Takže v jazyce C# můžete porovnat výkon konstrukce (a zkontrolovat, zda je podporováno nějaké chování nebo funkce), když je použito rozhraní značky:

ovládání je INamingContainer

a konstrukce pomocí atributů a reflexního mechanismu :

ovládání . Gettype (). IsDefined ( typeof ( NamingContainerAttrubute ), false )

Kromě toho některé jazyky (například Java používající knihovny ASM, Javasistanebo podobné ; a další jazyky[ co? ] ) umožňují vytvářet nebo generovat třídy (a rozhraní) dynamickým označováním tříd rozhraním značek za běhu . Atributy nebo metadata jsou obvykle spojeny s třídami v době kompilace , takže je nemožné později změnit jejich chování.

Nevýhody

Jedním z hlavních problémů markeru je to, že rozhraní definuje smlouvu o implementaci tříd a že smlouvu zdědí všechny podtřídy. To znamená, že pomocí značky nemůžete "vrátit zpět další implementace". Pokud ve výše uvedeném příkladu vytvoříte podtřídu a nechcete ji serializovat (možná proto, že to závisí na částečné implementaci), musíte explicitně vyvolat výjimku NotSerializableException(podle dokumentace ObjectOutputStream).

Řešením popsaného problému je podpora metadat přímo v syntaxi jazyka:

  • Jazyky jako .NET framework a Java (od Java 5 (1.5)) mají podporu pro taková metadata. V .NET se nazývají „ vlastní atributy “, v Javě se nazývají „ anotace “. Navzdory jejich různým jménům jsou koncepčně ekvivalentní, lze je definovat na třídách, proměnných, metodách a parametrech metod a lze k nim přistupovat pomocí reflexe .
  • V Pythonu termín _  rozhraní markerů se používá v architektuře komponent Zope (Zope Component Architecture, ZCA) a v redakčním systému Plone postaveném na jejím základě . V ZCA lze značkami označit nejen třídy, ale i jednotlivé objekty. [3]

Viz také

  • Designové značky shrnují tento vzor.

Poznámky

  1. Bloch, Joshua. Položka 37: Použijte rozhraní značek k definování typů // Effective Java (Second edition)  (neopr.) . - Addison-Wesley , 2008. - S. 179. - ISBN 978-0-321-35668-0 .
  2. INamingContainer - rozhraní (System.Web.UI) . Získáno 22. listopadu 2013. Archivováno z originálu 1. září 2013.
  3. Dokumentace BlueBream v1.0b4, výukový program

Literatura

  • Joshua Bloch, "Effective Java (Second edition)", Položka 37: Použijte rozhraní značek k definování typů, strana 179.