Współdzielenie zachowania pomiędzy komendami

0

Cześć,

W projekcie opartym na cms potrzebuję utworzyć kilka klas dziedziczących po klasie z frameworka.
Każda z nowo utworzonych klas będzie posiadała wspólny zestaw metod.
Metody te będą korzystały z pola, które jest zdefiniowane w trait, użytym w bazowej klasie cms (klasa, którą chcę rozszerzyć).
Mogę to osiągnąć na trzy sposoby.
Która z opcji jest najlepsza i dlaczego?

  1. Utworzenie dodatkowej klasy w hierarchii, która zawiera wymagane funkcje.
    Odwołanie do pola z trait użytego w klasie bazowej jest możliwe, dzięki jego wykorzystaniu w klasie z której dziedziczymy.

Schemat z dodatkową klasą pochodną.
Legenda:

A - klasa główna [CMS]
B - klasa bazowa, dziedzicząca po A [CMS]
X - trait, który jest używany w klasie B [CMS]

C - dodatkowa klasa w hierarchii, której działanie jest opisane w tytule tego punktu
D, E, F - klasy dziedziczące po klasie C

W trait X mamy zdefiniowane pole, dzięki czemu w klasie C mogę użyć tego pola w nowo dodanej metodzie a następnie wywołać tą funkcję w pochodnych klasach (D, E i F).

  1. Stworzenie traita, który przechowuje potrzebne funkcje.
    Zostanie on użyty w każdej z klas dziedziczących po bazowej klasie.
    Odwołanie do pola z trait użytego w klasie bazowej jest możliwe, dzięki wcześniejszemu zdefiniowaniu tego pola w tymże trait.

Schemat z wykorzystaniem trait.
Legenda:

A - klasa główna [CMS]
B - klasa bazowa, dziedzicząca po A [CMS]
X - trait, który jest używany w klasie B [CMS]

C, D, E - klasy dziedziczące po klasie B
Y - trait, którego działanie jest opisane w tytule tego punktu

W trait Y odwołuję się do pola z trait X w nowo dodanej metodzie a następnie wywołuję tą funkcję w klasach, w których trait został użyty (C, D i E).

  1. Ostatnim pomysłem jest utworzenie nowego traita, który dziedziczy po trait z cms.
    Na koniec wykorzystuję rozszerzonego traita w nowo dodanych klas (czyli coś podobnego jak w pkt. 2).
0

Wg mnie jest to zbyt przekombinowany sposób. Czy mógłbyś wyjaśnić po pierwsze o jakim frameworku mówisz?

Kolejna sprawa, to skupiłeś się na aspektach technicznych, a ja nadal nie wiem czemu to ma służyć. Opisz dokładnie czemu ma służyć to rozwiązanie (o jakich klasach z frameworka mowisz)

Czemu uparłeś się na traity? Nie lepiej wstrzykiwać coś w konstruktorze/metodzie?

Jak odpiszesz na to, to dopiero będe się zastanawiał czy to ma sens i może Ci coś ciekawego poradzę. BTW długo programujesz w PHP?

0

@axelbest:

  1. Framework: https://getgrav.org/

  2. Potrzebuję zastosować to rozwiązanie w celu:
    a) napisania komend konsolowych, które będą zawierały dodatkowe wyróżnienia w wyniku ich wywołania (w zależności od osiągniętego rezultatu)
    b) wykorzystania klasy https://github.com/getgrav/grav/blob/develop/system/src/Grav/Common/Language/Language.php, która posłuży mi do translacji komunikatów, żeby ją pobrać muszę się dostać do instancji głównej klasy Grava, przykład tutaj: https://github.com/getgrav/grav/blob/3b7921b698fb8e4409958e68b7650bdbbb8588d6/system/src/Grav/Common/Page/Medium/AbstractMedia.php#L333

  3. Nie uparłem się na traity, jedynie próbuję bazować na tym co udostępnia CMS:

O ile pkt. 2a jestem w stanie ograć za pomocą: https://symfony.com/doc/current/console/style.html#defining-your-own-styles to dla reszty funkcjonalności nie znalazłem póki co lepszych sposobów od tych, które opisałem w pierwszym poście (logika rozróżniająca wyjściowe formatowanie w zależności od wyniku komendy + tłumaczenia komunikatów).

Z PHP pracuję od 3 lat.

2

@Wiara czyni cuda: Po pierwsze, to ja bym się nie uciekał do dziedziczenia chyba że nie miałbym żadnego innego sposobu, a nawet wtedy ograniczyłbym to do minimum - a u Ciebie to wygląda jakbyś chciał na tym oprzeć całe swoje rozwiązanie - zły pomysł. Dziedziczenie to najciaśniejsza relacja jaką możesz sobie stworzyć w oprogramowaniu, i raczej ma same wady.

Sądząc po przykładzie to to nie wygląda jakby cała Twoja rodzina musiała po tej klasie dziedziczyć, wystarczyłaby jedna.

1 użytkowników online, w tym zalogowanych: 0, gości: 1