Cecha (programowanie obiektowe)

Z Wikipedii, wolnej encyklopedii

Cecha (ang. trait) – mechanizm współdzielenia zachowania klas podobny do domieszek, pozwalający ominąć część ograniczeń pojedynczego dziedziczenia. Cechy zostały opracowane w Software Composition Group na Uniwersytecie w Bernie[1].

Problem[edytuj | edytuj kod]

W programowaniu obiektowym dwie klasy mogą współdzielić część funkcjonalności i implementacji wyłącznie wtedy, gdy wywodzą się ze wspólnej klasy bazowej (dziedziczenie). Większość języków programowania nie obsługuje wielokrotnego dziedziczenia po kilku klasach naraz z powodu powstających wtedy wielu patologii. Programiści tracą jednak dużą część przydatnych technik. Bardzo często potrzeba, aby używane w pewnym miejscu programu obiekty posiadały pewną funkcjonalność nawet, jeśli nie wywodzą się ze wspólnego rdzenia. Podstawowym sposobem rozwiązania tego problemu są interfejsy definiujące zestaw wymaganych metod, które klasa musi we własnym zakresie zaimplementować. W takim modelu klasa może dziedziczyć po jednej klasie bazowej oraz implementować dowolną liczbę interfejsów. Aby umożliwić niezależne od dziedziczenia wstrzykiwanie także implementacji, zaproponowane zostały dwa rozwiązania: bardziej skomplikowane domieszki oraz prostsze cechy.

Właściwości[edytuj | edytuj kod]

Cechy są jedynie zbiorem dodatkowego kodu (metody oraz atrybuty), który może zostać wstrzyknięty do wybranych klas na etapie kompilacji. W przeciwieństwie do domieszek, podczas wykonywania program nie ma pojęcia o istnieniu cech, dlatego nie można w locie sprawdzić czy obiekt przekazany do funkcji obsługuje określoną cechę[2]. Nie można także tworzyć obiektów cech.

Klasy mogą importować dowolną liczbę cech, lecz nie istnieje żaden mechanizm rozwiązywania konfliktów, gdy dwie cechy próbują dodać identyczną metodę różniącą się implementacją. Rozwiązanie konfliktu pozostawione jest programiście, który może zrezygnować z dołączenia jednej z cech, wybrać jedną z implementacji lub zaimportować jedną ze spornych metod pod inną nazwą.

Implementacja[edytuj | edytuj kod]

Cechy występują w języku Scala, PHP[3] (od wersji 5.4.0), implementacji Smalltalka o nazwie Squeak oraz w Perlu 6, gdzie noszą nazwę ról. Cechy są również istotnym elementem języka programowania Rust[4]. Zaimplementowano je także w postaci dodatkowej biblioteki rozszerzającej oryginalny język w Perlu 5 (biblioteka Moose) oraz JavaScript (biblioteka Joose). W Pythonie można z nich korzystać używając pakietów Traitsref[5] lub py3traits[6].

Przypisy[edytuj | edytuj kod]

  1. Nathanael Schärli, Stéphane Ducasse, Oscar Nierstrasz, Andrew Black: Traits: Composable Units of Behaviour. 2002-11-25. [dostęp 2010-01-04]. (ang.).
  2. Request for Comments: Horizontal Reuse for PHP. The PHP Group. [dostęp 2019-02-23]. (ang.).
  3. Traits. PHP Manual. [dostęp 2012-03-03]. (ang.).
  4. Abstraction without overhead: traits in Rust - The Rust Programming Language Blog [online], blog.rust-lang.org [dostęp 2015-11-29].
  5. Traits. Enthought Inc.. [dostęp 2019-02-23]. (ang.).
  6. Welcome to py3traits’s documentation!. [dostęp 2019-02-23]. (ang.).