Marker Interface

marker

Chcemy zaznaczyć, że klasa możemy być użyta w jakiś sposób, jednocześnie nie definiując żadnych metod, które klasa miałaby implementować.

Może się wydawać, że takie coś nie powinno mieć miejsca, bo zawsze chcemy wykonać logikę która została zaimplementowana dzięki kontraktowi zwanemu interfejsem. Przykładami, że jednak czasem tak bywa są INamingContainer w ASP.NET oraz Serializable w Javie.

Mój przykład z życia

private bool CanBeDragged(IEnumerable<IContent> contents)
{
  return contents.All(c => {
    return c is CampaignSliderBlock;
  });
}

W tym przypadku jesteśmy uzależnieni od sprawdzania jednej klasy (jej drzewka dziedziczenia). Czasem jest to bardzo duże ograniczenie, bo nie zawsze dziedziczenie jest tym co ma sens w naszej dziedzinie (w tym przypadku jest akuart zbędne). Moglibyśmy zmienić kod aby zamiast sprawdzania klasy CampaignSliderBlock sprawdzał czy listę typów – IEnumerable<Type>. Byłoby to mniej czytelne. Czasem nawet nie mamy wpływu na ten kod (bo część kodu to biblioteka poza naszą kontrolą, albo są inne względy nie pozwalające tego zrobić.

Użycie Marker Interface

public interface IDraggable { }
private bool CanBeDraggedTo(IEnumerable<IContent> contents)
{
  return contents.All(c => {
    return c is IDraggable;
  });
}

Gdy przykładowe klasy RoyalSliderBlock oraz ArticleAdBlock, nie mają żadnego wspólnego przodka i nie chcemy go też szukać na siłę to proste wydaje się:

class CampaignSliderBlock : IDraggable
{
}

class ArticleAdBlock : IDraggable
{
}

Krytyka a pragmatyzm

Natknąłem się na wiki na zarzuty przeciwko temu wzorcowi (ja bym tego nawet tak szumnie nie nazywał, ot coś prostego).

Znakomitą odpowiedź luźno związaną z pytaniem znalazłem na Stack Overflow – What is the purpose of a marker interface?. Ktoś zarzucił, że .NET Design Guideliness odradzają ich używanie. Odpowiedź jest genialna, a streściłbym ją do:

Jeśli nie budujesz frameworku, z którego korzystają miliony ludzi to sięgaj po rozwiązania proste, przyjemne i utrzymywalne.

Advertisements
Ten wpis został opublikowany w kategorii Programowanie i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

2 odpowiedzi na „Marker Interface

  1. Łukasz K. pisze:

    Popieram to rozwiązanie. Jest banalne i mega szybkie.

    Kiedyś potrzebowałem oznaczyć kilka klas/stron w ASP.NET (zależnie od tego co robiłem w klasie bazowej). Pierwsze co przyszło mi do głowy, to atrybut. Jednak jest to rozwiązanie przekombinowane. Koniec końców wykorzystałem Marker Interface, a problem znacząco się uprościł.

Możliwość komentowania jest wyłączona.