czwartek, 1 grudnia 2011

Pusty interfejs?

Czym są interfejsy? Cytując za Wikipedią:
"In object-oriented languages the term "interface" is often used to define an abstract type that contains no data, but exposes behaviors defined as methods."
Istotnym fragmentem tego zdania jest: '[...] exposes behaviors defined as methods.', czyli interfejs definiuje pewne zachowania w postaci metod, których ciało należy zaimplementować w każdej klasie, która implementuje dany interfejs.
Dzięki temu możemy określić jakie zachowanie mają posiadać klasy.

Więc skoro interfejsy służą do deklarowania pewnej funkcjonalności implementujących je klas, to w takim wypadku, czy jest jakieś logiczne uzasadnienie, aby tworzyć puste interfejsy, które nie zapewniają żadnych określonych zachowań, a jedynie dają informacje o tym, że są implementowane?

Osobiście uważam, że tak. Kiedy? Jeżeli mamy jakieś logiczne uzasadnienie dla zgrupowania klas. Czasami może nam zależeć na otrzymaniu bądź przekazaniu obiektu klasy, która niekoniecznie dostarcza z góry określoną funkcjonalność, ale należy do pewnej rodziny. Przykład:
Mamy zaimplementować zewnętrzne API do naszego systemu np. magazynu. Decydujemy się na stworzenie fasady, za pomocą której użytkownik będzie komunikował się z naszym systemem. I tyle.
Jednak na etapie projektu okazuje się, że funkcjonalność coraz bardziej się rozrasta i dochodzimy do wniosku, że dostarczaną funkcjonalność jesteśmy w stanie rozbić na kolejne fasady. Funkcjonalność grupujemy na podstawie modeli, na których mają być wykonywane instrukcje, w naszym przypadku np. produkt i kontrahent.
Oczywiście obie fasady mogą dostarczać różną funkcjonalność, a w tym wypadku pozwolę sobie na założenie, że tak właśnie jest. Dodatkowo zależy nam, żeby dynamicznie można było dodawać instancje tych klas do fasady nadrzędnej (powodem może być np. współdzielenie niektórych funkcjonalności przez różne role). I tutaj z pomocą przychodzi nam właśnie pusty interfejs, który określa w pewien sposób 'rodzinę' klas.
Zdaję sobie również sprawę, że zastosowanie takiego rozwiązania musi być solidnie przemyślane i raczej powinno się go unikać, ale w niektórych przypadkach może się okazać przydatne.