• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

dependency injection - prosty przykład

Object Storage Arubacloud
0 głosów
293 wizyt
pytanie zadane 20 stycznia 2019 w PHP przez niezalogowany

Hej, strasznie nurtuje mnie temat dependency injection i staram się go dobrze przyswoić, stworzyłem mini program do generowania raportów.
https://gitlab.com/raptoor2/dependency-injection-practice 

Mógłbyś na niego zerknąć i powiedzieć czy coś robie nie tak?
Np implementacja zwykłej metody do wyciągania danych w klasie abstrakcyjnej - czy to błąd?
Implementacja metody makeRaport() dla klas generujących odpowiednie raporty.

W index.php szybką podmianką możemy zmienić to jaki raport dostajemy.

Jeżeli jest coś co mógłbym zrobić inaczej - lepiej to bardzo prosze o wytknięcie błędu, pozdrawiam :)

Całość odpalana z konsoli.

2 odpowiedzi

+1 głos
odpowiedź 21 stycznia 2019 przez HaKIM Szeryf (87,590 p.)

Jest masa rzeczy do których można się przyczepić!

First of all - vendor'a nie dodajemy do naszych repozytoria.

Aby to naprawić:

touch .gitignore
echo "/vendor/" >> .gitignore

git rm -r --cached vendor/

git add .
git commit -m "No need for vendor"

Przejdźmy do App\RaportGenerator:

W konstruktorze nie powinna znajdować się ta linijka:

        echo $generator->makeRaport();

Wzmian powinieneś dodać do RaportGenerator metodę:

public function makeRaport()
    {
        $this->generator->makeRaport();
    }

Tak swoją drogą to nie "raport" a "report", ale będę trzymał się Twojej konwencji z czystego lenistwa.

Czas na App\Abstra\AbstractGenerator

Uważam, że nazwa warstwy Abstra jest komiczna. Zaoszczędziłeś jedną setną milisekundy na ucięciu 2 liter? Nie piszesz w Assemblerze - możesz podawać pełne nazwy t.j. App\Abstract\AbstractGenerator.

Kolejna sprawa - Korzystasz z App\Abstra\AbstractGenerator, a w przestrzeni App\  znajduje się kolejny AbstractGenerator co jest cholernie dezorientujące.

Znowu - W __construct nie powinno znaleźć się $this->getData();. Konstruktor służy do konstruowania obiektu, nie zaoszczędzenia 1 linijki kodu dla wywołania metody.

Czyli dostajemy taki kod:

abstract class AbstractGenerator
{
    abstract public function makeRaport();

    protected function getData()
    {
        return Array(
            Array(
                'id' => 1,
                'name' => 'Masło',
                'price' => 5.00,
                'weight' => 0.1,
                'count' => 25,
            ),
            Array(
                'id' => 3,
                'name' => 'Chleb',
                'price' => 2.35,
                'weight' => 1,
                'count' => 16,
            ),
            Array(
                'id' => 6,
                'name' => 'Twaróg',
                'price' => 1.70,
                'weight' => 0.4,
                'count' => 25,
            ),
            Array(
                'id' => 7,
                'name' => 'Mleko',
                'price' => 1.40,
                'weight' => 1,
                'count' => 7,
            ),
        );
    }
}

No i ja na Tw. miejscu korzystałbym z nowego zapisu tablic - [].

Czas na App\JsonGenerator:

Po co Ci ten protected $raport?

Nie możesz po prostu:

    public function makeRaport()
    {
        $raport = json_encode($this->getData());

        echo "Tworzę raport Json\n";
        echo $raport."\n";
    }

To samo tyczy się reszty implementacji App\Abstra\AbstarctGenerator.

Czas na App\PlainTextGenerator:

W metodach nie korzystamy z print i echo. Korzystamy z return!

Następnie wyświetlamy sobie za pomocą print zwracaną wartość metody.

Przykład: print makeRaport();

Czas na App\XMLGenerator:

Zadeklarowana zmienna $res nie jest nigdzie używana. Dodatkowo, kod jest b. złożony i sam aby za nim nadążyć skorzystałeś z komentarzy. Lwią część logiki przeniósłbym do metod pomocniczych t.j.

private function doSomethingExplicitlyForTheClass() {}

No i na koniec, bo dopijam już moją poranną kawę, korzystaj z dobrodziejstw PHP 7 i używaj RETURN TYPE DECLARATIONS wraz z dopiskiem:

<?php

declare(strict_types=1);

dla każdego pliku PHP.

Ja sobie ustawiłem IDE aby mi tworzył templatkę klasy już z takim zapisem; jeśli nie korzystasz z IDE spróbuj wyrobić sobie nawyk dopisywania tej linii. Możesz podejść do tego w taki sposób, jakby każdy plik PHP musiał zaczynać się właśnie:

declare(strict_types=1);

Kubek z kawą pusty - zwijam się. :p

komentarz 21 stycznia 2019 przez niezalogowany
Poszedłem za Twoimi radami i nieco poprawiłem kod, póki co poza declare(strict_types=1);

Jezelichodzi o słówka Abstra zamiast Abstract to zrobiłem to dlatego, że phpStorm podkreślał mi słowo "Abstract" jak zarezerwowane i doradzał abym go nie używam jeżeli nie jest to klasa lub metoda abstrakcyjna.
komentarz 21 stycznia 2019 przez HaKIM Szeryf (87,590 p.)

Super!

Jezelichodzi o słówka Abstra zamiast Abstract to zrobiłem to dlatego, że phpStorm podkreślał mi słowo "Abstract" jak zarezerwowane i doradzał abym go nie używam jeżeli nie jest to klasa lub metoda abstrakcyjna.

http://php.net/manual/en/language.namespaces.definition.php#92212 - Rzeczywiście. Nawet sam sprawdziłem i błąd występuje.

W takim wypadku zmieniłbym namespace na App\Abstraction.

Albo jeszcze lepiej! AbstractGenerator znajdowałby się w przestrzeni App\ a jego implementacje w App\Generator.

src/
    AbstractGenerator.php
        Generator/
            XMLGenerator
            JsonGenerator
            PlainTextGenerator

Nie będziesz miał tak zawalonego src/ masą implementacji.

komentarz 21 stycznia 2019 przez niezalogowany
Mam jeszcze jedno pytanie apropo typów skalarnych.

Co w sytuacji kiedy funkcja może zwrócić dwie rózne wartosci? np Fałsz albo tablicę?

Czy w takiej sytuacji nie deklarujemy typu skalarnego czy można to jakoś uwzględnić w deklaracji typu funkcji?
komentarz 21 stycznia 2019 przez HaKIM Szeryf (87,590 p.)

Co w sytuacji kiedy funkcja może zwrócić dwie rózne wartosci? np Fałsz albo tablicę?

Należy przemyśleć nasz kod jeszcze raz. Serio.

Albo Twój kod robi za dużo, albo robi to w zły sposób.

Jeżeli dobrze się domyślam co chcesz osiągnąć zamiast false or array zwróć null or array.

Zapis:

public function findAll(): ?array {}

Czy w takiej sytuacji nie deklarujemy typu skalarnego czy można to jakoś uwzględnić w deklaracji typu funkcji?

Możesz niedeklarować zwracanego typu.

function foo() {}

Będzie to wtedy oznaczało, że ta funkcja zwraca dowolony typ.

Możesz też skorzystać z phpdoca:

/**
  * @return bool|array
  */
function foo() {}

Na poziomie parsera nie da to za dużo, ale chociaż coś.

0 głosów
odpowiedź 21 stycznia 2019 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)
Dobrze zaimplementowałeś mechanizm DI. Bardzo dobrze, że zastosowałeś warstwę abstrakcji.

Nie mam do czego się doczepić :)

Podobne pytania

0 głosów
1 odpowiedź 357 wizyt
pytanie zadane 20 stycznia 2019 w PHP przez niezalogowany
0 głosów
3 odpowiedzi 264 wizyt
pytanie zadane 14 września 2018 w Java przez Pablo93 Użytkownik (800 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 22 czerwca 2019 w PHP przez niezalogowany

92,624 zapytań

141,482 odpowiedzi

319,824 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...