Fajny odcinek, dobrze prowadzony :) Będę zaglądał częściej pomimo że z PHP nie mam do czynienia a z Angularem to i tak wiedza jest ogólna, chcę więcej ! :D
Cześć, jestem kolegą po fachu ale siedzę w iOS native. Powiem Tobie, że też myślałem o zbudowaniu kursu.. ale nie mam tak pozytywnego vibe'u jak Ty. Bardzo przyjemny kurs i dobrze poprowadzony, merytorycznie. Powodzenia i trzymam kciuki :) !
Zdradzę Ci tajemnicę, popatrz na moje pierwsze filmiki 🫣 Są serio straszne, a niektóre zostały nawet usunięte, bo się ich wstydziłem… To trochę jak z programowaniem - nie da się zacząć od SOLIDa, musisz napisać 💩-kod, a potem to jakoś wychodzi lepiej i lepiej! I tego Ci życzę! Bo jednym z największych moich błędów było czekanie na to aż będę wystarczająco dobry. To błąd. Nigdy nie będę 🤪 Pochwal się co takiego chciałbyś umieścić w swoim kursie 🔥 A jeśli chcesz parę porad o tym jak zacząć, to polecam też swój kurs startupu: lenkowski.net/produkt/kurs-startupu-dla-programistow/ bez tych narzędzi które tam opisałem, nie byłoby tego kanału 😅
Jak się patrzy na te pętle to aż się proszą o współbieżność której w php niestety brak... Wszystko super, tylko czy jest sens bindować tyle interfejsów? Jakby rozumiem OCP i rzeczywiście nie trzeba ruszać ich od środka dzięki temu, ale czy nie robi to nam na taką skalę scope creepu? Chyba nie widziałem pod koniec providera, wszystkie klasy zewnetrzne również zostały zbindowane? Niedawno gdzie indziej widziałem też wydzielenie funkcji z modeli do traitów: GetterTrait, RelationTrait, itd. wprowadza to pewien porzadek jak funkcji w modelu musi być dużo. Jednak czy trait nie powinien być też reużywalny? Co o tym myślisz?:)
Widać ze php się zmieniło od wersji 5 której używałem, ale te type hinty nadal zabawkowe, np przy zwracaniu array bez podania array czego, chociaż w php chyba różne typy mogły być jednocześnie w tablicy, co tez jest problematyczne
Przydal by sie strict type w clasach skoro używasz składni php > 7.0 (widze 8.3) + zgrupowanie parametrów funkcji/metod w VO/DTO ;). Mozna by bylo jeszcze dodac sniffer do dev w pakietach composeta i prosty make by np. odpalac ecs oraz testy na local docker ;). Można jeszcze dodac git hoock by z automatyzowac prace z git flow ;), itd, itp.
@@adamwadokowski5565 dlatego planuję zrobić jeszcze odcinek o STUPIDzie :) z naciskiem na P jak Premature Optimization 😅 choć brak typowania to zuoooo 😂
Bardzo fajnie opowiedziane. :) "Jak programują seniorzy?" ? Piszą testy :P A tak na poważnie, mam pytanie, bo twój kod jest trochę nie zgodny z PSR. Dokładnie mam na myśli nazwy Interfejsów. (abstractClass, ClassInterface, ClassTriat) Jakie masz zdanie na temat konwencji nazewnictwa ? Sposób który pokazałeś dla mnie jest osobiście jak najbardziej w porządku i sam często korzystam z niego choć nie jest zgodny z PSR. Również często widzie, że duże frameworki również odchodzą z stosowania konwencji z PSR na taką jak ty pokazałeś.
Tutaj testy nie były pokazane… choć były w tle 😅 Co do tych nazw, nie mam zdania. Często stosowałem konwencje z pistfixem Contract, ale czy tego potrzebujemy? To zależy. Moim zdaniem PSR to źródło prawdy, ale zasady są również po to, by je świadomie łamać, jeśli tego potrzebujemy.
A no i warto jeszcze dodać, że tutaj jest to zrobione celowo - bo mowa przecież o abstrakcji, a więc także chowaniu rzeczy za interfejsem… który nie musi jawnie mówić o sobie „interfesjs”
fajny przykład. ja bym funkcje prywatne już wyciągał w samym kontrolerze i potem z nich zrobił usługi. dlaczego ten przykład nie ma testów jednostkowych? przecież łatwiej jest refaktoryzować jak się ma bezpośredni feedback z testów
Magia ekranu 😅 Testy oczywiście były… ale istnieje coś takiego jak przeładowanie kognitywne. Dla Ciebie to by było proste, dla innych mogło by być trudniejsze… Nie refaktoryzowałbym tego na złej warstwie. Jeśli ktoś ma decydować o użyciu tej czy innej implementacji szczegółu, to jednak usługa, nie kontroler. Na tym polega właśnie abstrakcja 😉
@@lenkowski-net nie ma warstwy złej czy dobrej i polemizowałbym w tym wypadku na czym polega abstrakcja. nie ma większego znaczenia w sumie czy ja sobie wszystko wytnę w kontrolerze, czy w usłudze jeśli wiem co robię. jedno jest pewne. gruby kontroler to zło
Mogę polecić kurs SOLIDa, który właśnie uruchomiłem. Jest tam mowa o wzorcach, np. strategii Dobre materiały o wzorcach projektowych znajdziesz na refactoring.guru
Mam swoich faworytów, jak Laravel czy Symfony, ale framework jak framework… Jeśli piszesz zgodnie z SOLIDem i tworzysz kod który ma mały poziom couplingu, to można to robić też bez frameworka… Yii2 to rozwiązanie z którym pracowałem przez kilka minut, więc nie znam szczegółowych „mankamentów”
pracowałem z Yii2. korzysta z Active Record co samo z siebie nie jest zgodne z SOLID. jak nie masz wyjścia to pracujesz z tym co masz. można trochę zdecouplować ten kod. framework jest tylko nardzędziem
@@lenkowski-net zależnie od zaawansowania zespołu można próbować różnych podejść. moja preferowana opcja to wyciągnąć framework jako narzędzie do obsługi wejścia i wyjścia na zewnątrz i wrzucenie logiki biznesowej i modelu domeny na przykład w architekturę cebuli. podmiana frameworka albo podbicie wersji i jej testowanie staje się w ten sposób prostsze. a usunięcie starej wersji albo starego frameworka jest właściwie formalnością kiedy wszystko działa. framework webowy to tylko detal implementacyjny obsługujący request i zwracający response
Dobry materiał w większości się zgadzam, wyniesienie logiki na zewnątrz controllera na plus, rozbicie na metody na plus, lecz wszystko na osobne klasy.. hmm z tym mam zawsze pewne obawy. Ilość plików do utrzymania rośnie gigantycznie przy zlożonych aplikacjach a jak widać te klasy będą jak funkcje, kilkulinijkowe użyte tylko raz w jednym miejscu. Ja obecnie rozbijam na osobne klasy tylko w przypadku użycia tego samego kodu w kilku miejscach by sie nie dublować.
Zdradzę Ci tajemnicę, to było celowo, bo następny film będzie o architekturze pipes and filters 🔥 Natomiast masz mądre obawy, bo jak to w IT bywa - to zależy 😅
Refaktor bez testow integracyjnych czy funkcjonalnych?. Widać ze sporo dłubaleś w legacy ;) "coz złego moze się stać" xD. Tak czy siak jak nie ma testów to za wsze sa one na czerwono xD. W tedy failuja pipeline CI/CD xD
Bardzo przyjemnie się słucha, opowiadasz z taką pasją, pełen profesjonalizm!
Dzięki Adrian, to bardzo miłe 😍
Fajny odcinek, dobrze prowadzony :) Będę zaglądał częściej pomimo że z PHP nie mam do czynienia a z Angularem to i tak wiedza jest ogólna, chcę więcej ! :D
Dzięki - daj znać o czym byś chętnie posłuchał 😎
Cześć, jestem kolegą po fachu ale siedzę w iOS native. Powiem Tobie, że też myślałem o zbudowaniu kursu.. ale nie mam tak pozytywnego vibe'u jak Ty. Bardzo przyjemny kurs i dobrze poprowadzony, merytorycznie. Powodzenia i trzymam kciuki :) !
Zdradzę Ci tajemnicę, popatrz na moje pierwsze filmiki 🫣
Są serio straszne, a niektóre zostały nawet usunięte, bo się ich wstydziłem…
To trochę jak z programowaniem - nie da się zacząć od SOLIDa, musisz napisać 💩-kod, a potem to jakoś wychodzi lepiej i lepiej!
I tego Ci życzę! Bo jednym z największych moich błędów było czekanie na to aż będę wystarczająco dobry. To błąd. Nigdy nie będę 🤪
Pochwal się co takiego chciałbyś umieścić w swoim kursie 🔥
A jeśli chcesz parę porad o tym jak zacząć, to polecam też swój kurs startupu: lenkowski.net/produkt/kurs-startupu-dla-programistow/ bez tych narzędzi które tam opisałem, nie byłoby tego kanału 😅
dzięki @@lenkowski-net ! :) pomyślę o tym z tej perspektywy. może faktycznie powinienem zacząć od jakiegoś naprawdę małego MVP :D
@@chesterman18g polecam kanał na TH-cam - w końcu znaleźć wartościowych odbiorców - choćby takich jak Ty, wcale nie jest łatwo! :)
Jak się patrzy na te pętle to aż się proszą o współbieżność której w php niestety brak...
Wszystko super, tylko czy jest sens bindować tyle interfejsów? Jakby rozumiem OCP i rzeczywiście nie trzeba ruszać ich od środka dzięki temu, ale czy nie robi to nam na taką skalę scope creepu? Chyba nie widziałem pod koniec providera, wszystkie klasy zewnetrzne również zostały zbindowane?
Niedawno gdzie indziej widziałem też wydzielenie funkcji z modeli do traitów: GetterTrait, RelationTrait, itd. wprowadza to pewien porzadek jak funkcji w modelu musi być dużo. Jednak czy trait nie powinien być też reużywalny? Co o tym myślisz?:)
Myślę że to opowieść na zupełnie inną historię 😉
Widać ze php się zmieniło od wersji 5 której używałem, ale te type hinty nadal zabawkowe, np przy zwracaniu array bez podania array czego, chociaż w php chyba różne typy mogły być jednocześnie w tablicy, co tez jest problematyczne
Zdecydowanie, przydało by się i to i typehint do callable
Fajne!
Dziękuję ❤️
Przydal by sie strict type w clasach skoro używasz składni php > 7.0 (widze 8.3) + zgrupowanie parametrów funkcji/metod w VO/DTO ;). Mozna by bylo jeszcze dodac sniffer do dev w pakietach composeta i prosty make by np. odpalac ecs oraz testy na local docker ;). Można jeszcze dodac git hoock by z automatyzowac prace z git flow ;), itd, itp.
O panie, zawsze by się „coś przydało”. 😂
To jest nie kończąca się historia xD
@@adamwadokowski5565 dlatego planuję zrobić jeszcze odcinek o STUPIDzie :) z naciskiem na P jak Premature Optimization 😅 choć brak typowania to zuoooo 😂
4:55 "Schludnie choć nasrane" ;)
😂 dokładnie
Bardzo fajnie opowiedziane. :) "Jak programują seniorzy?" ? Piszą testy :P A tak na poważnie, mam pytanie, bo twój kod jest trochę nie zgodny z PSR. Dokładnie mam na myśli nazwy Interfejsów. (abstractClass, ClassInterface, ClassTriat)
Jakie masz zdanie na temat konwencji nazewnictwa ? Sposób który pokazałeś dla mnie jest osobiście jak najbardziej w porządku i sam często korzystam z niego choć nie jest zgodny z PSR. Również często widzie, że duże frameworki również odchodzą z stosowania konwencji z PSR na taką jak ty pokazałeś.
Tutaj testy nie były pokazane… choć były w tle 😅
Co do tych nazw, nie mam zdania. Często stosowałem konwencje z pistfixem Contract, ale czy tego potrzebujemy? To zależy.
Moim zdaniem PSR to źródło prawdy, ale zasady są również po to, by je świadomie łamać, jeśli tego potrzebujemy.
A no i warto jeszcze dodać, że tutaj jest to zrobione celowo - bo mowa przecież o abstrakcji, a więc także chowaniu rzeczy za interfejsem… który nie musi jawnie mówić o sobie „interfesjs”
fajny przykład. ja bym funkcje prywatne już wyciągał w samym kontrolerze i potem z nich zrobił usługi. dlaczego ten przykład nie ma testów jednostkowych? przecież łatwiej jest refaktoryzować jak się ma bezpośredni feedback z testów
Magia ekranu 😅
Testy oczywiście były… ale istnieje coś takiego jak przeładowanie kognitywne. Dla Ciebie to by było proste, dla innych mogło by być trudniejsze…
Nie refaktoryzowałbym tego na złej warstwie. Jeśli ktoś ma decydować o użyciu tej czy innej implementacji szczegółu, to jednak usługa, nie kontroler. Na tym polega właśnie abstrakcja 😉
@@lenkowski-net nie ma warstwy złej czy dobrej i polemizowałbym w tym wypadku na czym polega abstrakcja. nie ma większego znaczenia w sumie czy ja sobie wszystko wytnę w kontrolerze, czy w usłudze jeśli wiem co robię. jedno jest pewne. gruby kontroler to zło
To prawda. Ja wolę nie w kontrolerze, z powodów z których powiedziałem. Ale to nie jest 0:1 i zależy… więc moim zdaniem obaj mamy rację. Cheers!
Fajny materiał, Czy masz albo możesz zrobić lub polecić kurs o wzorcach projektowych w PHP?
Mogę polecić kurs SOLIDa, który właśnie uruchomiłem. Jest tam mowa o wzorcach, np. strategii
Dobre materiały o wzorcach projektowych znajdziesz na refactoring.guru
Co sadzisz o Yii2 PHP-Framework?
Mam swoich faworytów, jak Laravel czy Symfony, ale framework jak framework…
Jeśli piszesz zgodnie z SOLIDem i tworzysz kod który ma mały poziom couplingu, to można to robić też bez frameworka…
Yii2 to rozwiązanie z którym pracowałem przez kilka minut, więc nie znam szczegółowych „mankamentów”
pracowałem z Yii2. korzysta z Active Record co samo z siebie nie jest zgodne z SOLID. jak nie masz wyjścia to pracujesz z tym co masz. można trochę zdecouplować ten kod. framework jest tylko nardzędziem
@@mariuszszot583 Laravel ma ten sam problem… proste, ok, ale coupling na framework jest spory…
@@lenkowski-net zależnie od zaawansowania zespołu można próbować różnych podejść. moja preferowana opcja to wyciągnąć framework jako narzędzie do obsługi wejścia i wyjścia na zewnątrz i wrzucenie logiki biznesowej i modelu domeny na przykład w architekturę cebuli. podmiana frameworka albo podbicie wersji i jej testowanie staje się w ten sposób prostsze. a usunięcie starej wersji albo starego frameworka jest właściwie formalnością kiedy wszystko działa. framework webowy to tylko detal implementacyjny obsługujący request i zwracający response
Dobry materiał w większości się zgadzam, wyniesienie logiki na zewnątrz controllera na plus, rozbicie na metody na plus, lecz wszystko na osobne klasy.. hmm z tym mam zawsze pewne obawy. Ilość plików do utrzymania rośnie gigantycznie przy zlożonych aplikacjach a jak widać te klasy będą jak funkcje, kilkulinijkowe użyte tylko raz w jednym miejscu. Ja obecnie rozbijam na osobne klasy tylko w przypadku użycia tego samego kodu w kilku miejscach by sie nie dublować.
Zdradzę Ci tajemnicę, to było celowo, bo następny film będzie o architekturze pipes and filters 🔥
Natomiast masz mądre obawy, bo jak to w IT bywa - to zależy 😅
Refaktor bez testow integracyjnych czy funkcjonalnych?. Widać ze sporo dłubaleś w legacy ;) "coz złego moze się stać" xD. Tak czy siak jak nie ma testów to za wsze sa one na czerwono xD. W tedy failuja pipeline CI/CD xD
Bez testów nie podchodź 😂
Zobacz sobie filmik o TDD 🔥
Wiesio rządzi :)
Panie, my ze szfagrem to takie kody piszemy... xD