Wzorzec projektowy metoda wytwórcza - najprzydatniejszy ze wzorców.

แชร์
ฝัง
  • เผยแพร่เมื่อ 2 ธ.ค. 2024

ความคิดเห็น • 10

  • @DevEnv-pl
    @DevEnv-pl  3 ปีที่แล้ว +1

    Alternatywą dla kodu z 4:48 oraz 4:52 są te fragmenty kodu: gist.github.com/bartlomiejmichalski/9b96c98189dce36b7eeb584aeb612ab7

  • @marcinjuranek4473
    @marcinjuranek4473 3 ปีที่แล้ว +1

    Dobry film, obejrzałem trzy razy. Musiałem przemyśleć jak pozbyć się problemu z konstruktorami w moim projekcie.

  • @XivaGamer
    @XivaGamer 3 ปีที่แล้ว +7

    okej, materiał zawarty jest w porządku
    ale takie suche gadanie do kamery nie jest wcale dobrym materiałem dydaktycznym
    mózg potrzebuje na coś patrzeć, w tym przypadku powinien być pokazywany kod, ale nie tak abstrakcyjny jak go pokazałeś, przykłady, bez nich cięzko jest pochłaniać wiedze

    • @DevEnv-pl
      @DevEnv-pl  3 ปีที่แล้ว +5

      Dzięki za komentarz. Faktycznie dla niektórych ta forma może nie być wystarczająca do zrozumienia wzorca, dlatego stworzyliśmy też drugi film pokazujący mniej abstrakcyjne problemy w zakresie refaktoryzacji. th-cam.com/video/dXgpFzHOmVA/w-d-xo.html
      Jako że ludzie mają różne style uczenia oraz potrzebują innych form, staramy się tworzyć różne materiały, używając różnych form dydaktycznych, pamiętając przy tym, by filmy nie były dłuższe, niż powinny, bo długość filmu oraz ilość różnych rzeczy, jakie omawiamy, może także być przytłaczająca.

  • @patrykbaszak
    @patrykbaszak 3 ปีที่แล้ว

    Nic nie zrozumiałem. Być może to kwestia tego, że programuję w PHP? W każdym razie obejrzę to jeszcze raz i jeśli nagle załapię to dodam komentarz.

    • @DevEnv-pl
      @DevEnv-pl  3 ปีที่แล้ว +2

      Dzięki wielkie za komentarz. To nie jest kwestia tego, że piszesz w PHP. Tam też występują mechanizmy, takie jak obiekty i konstruktory, które powinny pozwolić użyć wzorca. Pozwól, że dopytam bo chciałbym zrozumieć co mógłbym zrobić lepiej.
      Czy kod jest nieczytelny, czy domena jest dziwna? W jaki sposób tworzysz obiekty? Czy spotkałeś się kiedyś z sytuacjami omówionymi w filmie, że musiałeś zmieniać wiele miejsc bo dodałeś 1 parametr w konstruktorze? Musiałeś zmieniać całą klasę by wprowadzić zmianę w budowanie obiektu?
      Czy możesz napisać coś więcej, to ja spróbuję to wyjaśnić w komentarzu. Z góry dziękuję Ci poświęcony czas, pomoże mi to tworzyć lepszą treść.

    • @patrykbaszak
      @patrykbaszak 3 ปีที่แล้ว +2

      ​@@DevEnv-pl no to, oglądam właśnie trzeci raz, aby móc stosownie odpowiedzieć i dochodząc do kolejnych fragmentów podaję, co jest dla mnie niezrozumiałe:
      - 0:25 - jeśli dodaję kolejny parametr, to mogę go zrobić opcjonalnym z defaultową wartością, a jeśli jest wymagany, to siłą rzeczy w różnych częściach aplikacji prawdopodobnie może przyjąć różne wartości, także i tak muszę przeskoczyć przez całą aplikację.
      - 0:35 - jeśli parametr pobieram z konfiguracji indywidualnie dla danego zasobu, no to znowu i tak muszę obskoczyć wszystkie konstruktory, z kolei, jeśli parametr jest określony dla grupy zasobów, to przecież stosuję klasę pośrednią dla określonego typu zasobów, która sama doda ten parametr i zwróci właściwy obiekt (czyżby o to w tym chodziło?).
      - 1:10 - czym jest dla Ciebie byt? Jeśli obiektem, szkoda, że nie zostałeś przy takim nazewnictwie, bo zaczęło mi to mieszać w głowie.
      - 1:22 - stabilny, ok; gotowy do użycia? No ok; zgodny z regułami domenowymi? Odnosisz się do domen w postaci klas prezentujących jak obiekt ma wyglądać?
      - 2:04 - słowo strategia ponownie mnie zmyliło, gdyż wdrażam się w wzorzec projektowy, który ma jakieś swoje strategie, a tu przykład klasy z tym słowem kluczowym, na ekranie krócej niż byłem w stanie dokładnie zapoznać się z tym co jest w kodzie.
      - 3:09 - przykład z zamiataniem kurzu pod dywan nietrafiony, chyba, przynajmniej moje obecne zrozumienie problemu, który wzorzec ma rozwiązać mówi mi, że nie ma analogii, z drugim zdaniem nie mogę się zgodzić. W PHP mam metodę __construct(), w innych językach to metoda o tej samej nazwie co klasa, itd. No to teraz szukajmy indywidualnych nazw konstruktorów, jakie sobie ludzie wymyślili w projekcie, tak z pół roku temu. Chyba, że ponownie źle zrozumiałe intencję i nie tego dotyczyło stwierdzenie.
      - 4:02 - chyba właśnie załapałem. Utworzyć klasę, która na podstawie metody statycznej 'createSth' zwraca mi docelowy obiekt. Chyba stosowany w CQRS do wywoływania handlerów i przydatny, gdy chcę utrzymać jeden obiekt końcowy do łączenia się z bazą danych.
      W każdym razie, dopiero za trzecim razem i zapewne dlatego, że naprawdę było to dla mnie coś nowego z punktu widzenia nazewnictwa, ale nic odkrywczego z punktu widzenia praktyki. Wydaję mi się, że jednak trochę skomplikowałeś w miejscach, które Ci powyżej podałem i stąd całe utrudnienie w zrozumieniu tego przeze mnie. :/

    • @DevEnv-pl
      @DevEnv-pl  3 ปีที่แล้ว +6

      @@patrykbaszak Dzięki za odpowiedź 😊 Za poświęcony czas 😊 Spróbuje wytłumaczyć kilka spraw:
      - Jeśli dodasz dodatkowy parametr do konstruktora i jest on wszędzie wymagany to musisz zmienić wszystkie miejsca. Jeśli faktycznie jest parametr opcjonalny to bez żadnego problemu możesz sobie to ułatwić.
      Teraz wyobraź sobie, że pierwszy nowy parametr to wartość pobierana z bazy danych nr 1, a drugi parametr z pliku, który następnie może zostać przetworzony przez jakąś metodę.
      Masz teraz wybór znaleźć wszystkie wywołania konstruktora i dodać te kilka linijek w każdym miejscu. To jest oczywiście duplikacja. I jak będzie błąd, lub kolejna potrzeba zmiany to znowu znajdujesz wszystkie miejsca i ...
      Alternatywa to właśnie metoda wytwórcza, czyli przeniesienie wszystkich rzeczy związanych z wytwarzanie do jednej metody i wywoływanie jej w tych miejscach. Niektóre z tych rzeczy nie muszą być widoczne dla czegoś co tego używa.
      To jest po prostu przeniesienie i zamknięcie odpowiedzialności do osobnego miejsca. Metody. Więcej o tym czemu to jest ważne wspominam w filmie o single responsibility principle.
      - Czym jest byt? Używamy byt by nie mówić, że to klasa, funkcja, metoda czy struktura. Dlatego, że to o czym mówię aplikuje się do różnych języków i różnych paradygmatów.
      Przepraszam, jeśli ten zabieg namieszał Ci w głowię.
      - Zgodność z regułami domenowymi, czyli regułami biznesowymi.
      - Metoda wytwórcza może tworzyć różne rzeczy. W tym także obiekty, które są strategiami, komendami lub innymi wzorcami. Tutaj wzorzec strategia nie był tak bardzo istotny jak intencja, która realizuje metoda wytwórcza.
      Więcej omawiam i pokazuję tutaj w ramach refaktoryzacji: th-cam.com/video/uA_hZzw0Kl0/w-d-xo.html
      - Zamiatanie pod dywan odnosi się do ukrywania odpowiedzialności obiektu jaką jest wytwarzanie innego obiektu. Często jak analizujemy co robi dana klasa zapominamy, że proces tworzenia nowych obiektów może być osobną odpowiedzialnością.
      Konstruktory w większości języków mają taką samą nazwę jak klasa. W przypadku PHP jak je deklarujesz to używasz słowa kluczowego __construct.
      Jak je używasz, czyli tworzysz nowy obiekt to wykorzystujesz operator new, następnie musisz użyć nazwy klasy np.: new Car();
      I teraz jeśli jedna klasa służyłaby to reprezentowania kilku różnych typów, różniących się tylko polami. Przykład:
      new Employee(EmployeeType.CEO, new CEOStrategy());
      new Employee(EmployeeType.Sales, new SalesStrategy());
      Patrząc na powyższe dwie linijki można domyśleć się, że tworzymy dwie różne rzeczy. Można spróbować je nazwać używając właśnie metody wytwórczej.
      Employee CreateCEO() {return new Employee(EmployeeType.CEO, new CEOStrategy()); }
      Employee CreateSale() {return new Employee(EmployeeType.Sales, new SalesStrategy()); }
      Od tego momentu jak chcemy stworzyć CEO to używamy metody CreateCEO(). Jak np. zmieni się sposób tworzenia CEO to można to zrobić bez wiedzy wywołujących. Chyba, że coś od nich będziemy potrzebować 😊
      I nie szukamy indywidualnych nazw konstruktorów tylko tworzymy metody wytwórcze.
      Naprawdę jestem Ci wdzięczny za poświęcony czas. Doceniam to 😊
      Kilka z tych rzeczy pozwolę sobie zaadresować w niedzielnym filmie, gdzie pokaże refaktoryzację do tego wzorca 😊

  • @adamklepacz6322
    @adamklepacz6322 3 ปีที่แล้ว +1

    Nic nie zrozumiałem, może dlatego że programuje zawodowo dopiero od 4 lat i zajmuje się front-endem?

    • @MX-ul5ps
      @MX-ul5ps 2 ปีที่แล้ว

      problemem jest to że tłumaczenie tutaj opiera się na innym wzorcu