Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

10 Stron V  « < 4 5 6 7 8 > »   
Closed TopicStart new topic
> Kod doskonały vs rzeczywistość
com
post
Post #101





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


Pyton_000 Wtedy już to nie jest klasa abstrakcyjna, co z tego że dopiszesz sobie słówko abstract i kod zadziała jak to jest niezgodne ze sztuka. Wiem ze tak się czasem robi ale to nagięcie zasady jej istnienia.

http://php.pl/Wortal/Artykuly/PHP/Podstawy...ne-i-interfejsy

Opisany prze Ciebie przypadek owszem jest ale:
Cytat
Klasa abstrakcyjna w Javie nie musi posiadać metod czysto wirtualnych aby być abstrakcyjną, jednak takie użycie klasy abstrakcyjnej określa klasę jako nieinstancjowalną i jest rzadziej spotykane.


Ten post edytował com 14.01.2017, 13:52:40
Go to the top of the page
+Quote Post
Pyton_000
post
Post #102





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Jest klasa abstrakcyjna bo nadal nie możesz zrobić z niej instancji. Owszem debilne jest to rozwiązanie że nie musi mieć metod ale jest. Jest i działa. Ba nawet coś takiego zadziała:

  1. abstract class Test {
  2.  
  3. static public function goon() {
  4. echo 'ok';
  5. }
  6. }
  7. Test::goon();


Ten post edytował Pyton_000 14.01.2017, 13:57:54
Go to the top of the page
+Quote Post
com
post
Post #103





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


owszem zgadzam się z Tobą, ale lepiej tego unikać (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Pyton_000
post
Post #104





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Uważaj nie zgadzaj się tak publicznie bo wykorzystają to przeciwko Tobie (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
daro0
post
Post #105





Grupa: Zarejestrowani
Postów: 88
Pomógł: 12
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----


No dobra a weźmy takie coś:

  1. class UploaderImage extends Uploader
  2. {
  3. public function __construct($files, $path)
  4. {
  5. parent::construct($files, $path);
  6. // możliwe dodatkowe operacje
  7. }
  8.  
  9. public function execute()
  10. {
  11. // robi upload tego co jest w $_FILES, tutaj wyżej $files
  12. // do wynikowego pliku określonego przez $path jako obrazek
  13. }
  14. }


  1. class UploaderVideo extends Uploader
  2. {
  3. public function __construct($files, $path)
  4. {
  5. parent::construct($files, $path);
  6. }
  7.  
  8. public function execute()
  9. {
  10. // robi upload tego co jest w $_FILES, tutaj wyżej $files
  11. // do wynikowego pliku określonego przez $path jako wideo
  12. }
  13. }


a)

  1. abstract class Uploader
  2. {
  3. protected $files;
  4. protected $path;
  5.  
  6. public static function factory($name, $files, $path)
  7. {
  8. $class = 'Uploader' . ucfirst($name);
  9. return new $class($files, $path);
  10. }
  11.  
  12. public function __construct($files, $path)
  13. {
  14. $this->files = $files;
  15. $this->path = $path;
  16. }
  17.  
  18. abstract public function execute();
  19. }


vs.

(IMG:style_emoticons/default/cool.gif)

  1. class Uploader
  2. {
  3. protected $files;
  4. protected $path;
  5.  
  6. public static function factory($name, $files, $path)
  7. {
  8. $class = 'Uploader' . ucfirst($name);
  9. return new $class($files, $path);
  10. }
  11.  
  12. public function __construct($files, $path)
  13. {
  14. $this->files = $files;
  15. $this->path = $path;
  16. }
  17.  
  18. }


no i w końcu

  1. define('DOCROOT', realpath(dirname(__FILE__) . '/..').DIRECTORY_SEPARATOR);
  2.  
  3. // upload zdjęć
  4. $files = $_FILES['image'];
  5. $path = DOCROOT . 'uploads/images/test.png';
  6.  
  7. $result = Uploader::factory('Image', $files, $path)
  8. ->execute();
  9.  
  10.  
  11. // upload wideo
  12. $files = $_FILES['video'];
  13. $path = DOCROOT . 'uploads/videos/test.mp4';
  14.  
  15. $result = Uploader::factory('Video', $files, $path)
  16. ->execute();


który z przypadków a) albo (IMG:style_emoticons/default/cool.gif) jest właściwy (zgodny ze sztuką)? Tutaj zakładam że każdy z uploaderów ma tak samo nazywającą się metodę execute.

Ten post edytował daro0 14.01.2017, 15:29:14
Go to the top of the page
+Quote Post
Omenomn
post
Post #106





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 4.02.2014

Ostrzeżenie: (20%)
X----


Cytat
Tam masz interfejs wiec zapisujesz do czegokolwiek co implementuje ten interfejs. Przecież nie zrobię Ci gotowca, ja tylko wskazałem drogę która masz iść, Zmiana kodowania,nazwy itd to będą kolejne dekoratory, które sobie dopiszesz w miarę potrzeb.


Zdecyduj się czy zmiana nazwy i kodowania mają być wstrzykiwane, czy dodawane jako dekoratory, bo wcześniej pisałeś, żeby je wstrzykiwać i ciekawe jak zdecydujesz w klasie Upload, którą metodę użyjesz ze wstrzykniętego obiektu, skoro masz tam 5 metod, co użyjesz wszystkich, czy jednej, a jak będziesz chciał użyć innej, to będziesz edytował klasę Upload? Jaki to ma sens?

Cytat
Upload to klasa bazowa, a SessionStorage wgl nie ma znaczenia dla dekoratora. Bo to jest zależność wstrzykiwana do Upload, dlatego możesz wstawić dowolny storage jaki sobie wymarzysz, warunek jest tylko taki musi implementować zdefiniowany interfejs.


Ma znaczenie, bo musisz za każdym razem wrzucić do UploadImage coś co implementuje interfejs z kontruktora, a nie zawsze jest taka potrzeba.
Cytat
Owszem klasa abstrakcyjna może posiadać definicje jakiś wspólnych metod ale musi posiadać co najmniej jedną metodę abstrakcyjną, żeby można było ja nazwać klasa abstrakcyjna, inaczej to jest zwykła klasa.
To są podstawy programowania obiektowego.


Klasa abstrakcyjna ma to do siebie, że oprócz metod abstrakcyjnych, które się w niej dodaje, nie daje możliwości stworzenia z niej bezpośrednio obiektu.
Dopiero z klasy dziedziczącej po klasie abstrakcyjnej, można stworzyć obiekt. Dlatego właśnie klasy abstrakcyjne w moim rozwiązaniu nie posiadają konstruktorów, a gotowe metody, które funkcjonują dopiero po odpowiednim zdefiniowaniu konstruktorów klas dziedziczących. Więc nie chodzi o to:
Cytat
Pyton_000 Wtedy już to nie jest klasa abstrakcyjna, co z tego że dopiszesz sobie słówko abstract i kod zadziała jak to jest niezgodne ze sztuka. Wiem ze tak się czasem robi ale to nagięcie zasady jej istnienia.

żeby dopisać słówko abstract, tylko, żeby nie można było stworzyć z niej obiektu, bo bez konstruktora jest bezużyteczna. Mam nadzieję, że wyjaśniłem.

Cytat
Jest klasa abstrakcyjna bo nadal nie możesz zrobić z niej instancji. Owszem debilne jest to rozwiązanie że nie musi mieć metod ale jest

Zwykła klasa też nie musi mieć metod i co to też jest debilne?

Na koniec chcę dodać, że ten kod jest łatwiejszy do zrozumienia, ale trudniejszy do rozbudowy, dodasz parę rzeczy i zrobi się bagno.

Ten post edytował Omenomn 14.01.2017, 16:59:36
Go to the top of the page
+Quote Post
daro0
post
Post #107





Grupa: Zarejestrowani
Postów: 88
Pomógł: 12
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----


No rozpacz.

Omenomn

1. Czemu ciągle upierasz się przy swoich racjach i nie dasz sobie wytłumaczyć jak to dobrze (i praktycznie) jako to wydaje mi się com tutaj przedstawił rozwiązanie problemu?

2. Jak długo i przy jakich projektach siedzisz i czy jest to praca zespołowa czy też samodzielna?

3. Ja pracuję samodzielnie i te sprawy związane z elastycznością i rozszerzalnością rozumiem inaczej, ze względu na specyficzną architekturę frameworka i np. ten CFS. Akurat jestem w trakcie tworzenia pewnego serwisu (i to nie małego) i pomimo tego że kod (gdybym Ci pokazał choć fragmenty) to w Twoim mniemaniu byłby syfem, to ja w tym syfie bardzo dobrze się odnajduję i nie mam żadnych problemów z rozszerzaniem czy refaktoryzacją. (IMG:style_emoticons/default/smile.gif) Co nie znaczy że Tobie albo komu innemu by się pracowało dobrze.

4. Do tego samego problemu są różne podejścia. Przejrzyj sobie jak ten Upload można robić przy użyciu wszystkich znanych frameworków PHP, w Wordpressie czy innych rozwiązaniach. Co FW to specyficzne podejście które nie każdemu pasuje (co też widać często po tym hejcie po Laravelu (IMG:style_emoticons/default/smile.gif)

5. Ciekawe jak wygląda praca w zespole gdzie każdy upiera się przy swoich racjach i ile może trwać realizacja projektu, który przy zgraniu można by zrealizować np. w 3 miesiące? O ile w ogóle się powiedzie. I nie chodzi mi tu tylko o backend ale np. ktoś jest frontendowcem a ty robisz w backendzie ale są pewne niezgodności bo upieracie się przy swoich rozwiązaniach (IMG:style_emoticons/default/smile.gif)

Ten post edytował daro0 14.01.2017, 16:42:29
Go to the top of the page
+Quote Post
com
post
Post #108





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


Cytat
Zdecyduj się czy zmiana nazwy i kodowania mają być wstrzykiwane, czy dodawane jako dekoratory, bo wcześniej pisałeś, żeby je wstrzykiwać i ciekawe jak zdecydujesz w klasie Upload, którą metodę użyjesz ze wstrzykniętego obiektu, skoro masz tam 5 metod, co użyjesz wszystkich, czy jednej, a jak będziesz chciał użyć innej, to będziesz edytował klasę Upload? Jaki to ma sens?


Niczego nie miałbym edytować bo jako parametr ma interfejs a nie implementacje, wiec ta klasa ma dowolna definicje, zgodna jedynie z interfejsem po którym dziedziczy, ale dałem Ci potem przykład, ze równie dobrze te zależności mogą być dekoratorami bo zmieniają oryginalny obiekt.

Cytat
Ma znaczenie, bo musisz za każdym razem wrzucić do UploadImage coś co implementuje interfejs z kontruktora, a nie zawsze jest taka potrzeba.


Daj mi przypadek kiedy upload nie potrzebuje zapisać pliku, nie ma takiego.

Cytat
Klasa abstrakcyjna ma to do siebie, że oprócz metod abstrakcyjnych, które się w niej dodaje, nie daje możliwości stworzenia z niej bezpośrednio obiektu.
Dopiero z klasy dziedziczącej po klasie abstrakcyjnej, można stworzyć obiekt. Dlatego właśnie klasy abstrakcyjne w moim rozwiązaniu nie posiadają konstruktorów, a gotowe metody, które funkcjonują dopiero po odpowiednim zdefiniowaniu konstruktorów klas dziedziczących. Więc nie chodzi o to:


A kto mi zabroni zrobić konstruktor klasy abstrakcyjnej :
http://ideone.com/VcUReV

Cytat
żeby dopisać słówko abstract, tylko, żeby nie można było stworzyć z niej obiektu, bo bez konstruktora jest bezużyteczna. Mam nadzieję, że wyjaśniłem.


Wiem czemu to zastosowałeś, ale nie jest to dobre podejście. Każda klasa ma konstruktor nie ważne jakie słówko sobie przed nią postawisz. Bo jest coś takiego jak konstruktor domyślny, który nie musi być zdefiniowany jawnie i tu kłania się brak podstaw php (IMG:style_emoticons/default/wink.gif) Dlatego tez tworząc singleton musisz
Cytat
The constructor __construct() is declared as protected to prevent creating a new instance outside of the class via the new operator.


Cytat
Na koniec chcę dodać, że ten kod jest łatwiejszy do zrozumienia, ale trudniejszy do rozbudowy, dodasz parę rzeczy i zrobi się bagno, po za tym jeżeli przekazujesz pomiędzy dekoratorami plik bezpośrednio z requesta, to nie możesz zmienić mu nazwy, ani przeedytować go w żaden sposób, więc nadal jest to uproszczone rozwiązanie czysto teoretyczne.


Poproszę choć jeden przykład, w którym miejscu (IMG:style_emoticons/default/smile.gif)

daro0 zły przykład bo oba są poprawne, bo klasa abstrakcyjna daje nam tylko informacje o tym, że potomek potrzebuje jeszcze metody execute i ma to sens, bo unikniemy pomyłek, ale nie jest to wymagane, ale masz rację lepiej jak obiekt o to dba. Tylko, ze jak ktoś napisze to tak jak w przypadku b, to pamiętając o tym, ze ta klasa ma mieć te metodę tez zadziała, tylko poco ma to pamiętać.

Cytat
Zwykła klasa też nie musi mieć metod i co to też jest debilne?


Nie, przykład wprost z jednego z moich projektów, nigdzie w definicji klasy nie masz powiedziane, ze ona ma mieć jakieś metody. Inaczej jest z klasa abstrakcyjna, która ma mieć co najmniej jedną metodę czysto wirtualna/abstrakcyjną.

  1. class Services
  2. {
  3. const KERNEL_COMMAND_EXTENSION_REGISTRY = 'proton.common.command.extension_registry';
  4. const KERNEL_COMMAND_HANDLER_MAP = 'proton.common.command.handler_map';
  5. const KERNEL_SERVICE_LOCATOR = 'proton.common.service.locator';
  6. const KERNEL_TRANSACTION_FACTORY = 'proton.common.transaction.factory';
  7. }


Ten post edytował com 14.01.2017, 17:53:33
Go to the top of the page
+Quote Post
Omenomn
post
Post #109





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 4.02.2014

Ostrzeżenie: (20%)
X----


Cytat
Daj mi przypadek kiedy upload nie potrzebuje zapisać pliku, nie ma takiego.

Mówię o wrzucaniu do Upload obiektu klasy SessionStorage. Może nie być potrzeby zapisu do sesji i co wtedy?
Po za tym metoda save() z Upload wygląda tak:
  1. public function save(File $file)
  2. {
  3. $fileName = $file->getName();
  4. if($this->storage->has($fileName))
  5. {
  6. $this->storage->remove($fileName);
  7. }
  8. $this->storage->set($fileName, [
  9. 'file' => $file
  10. ]);
  11. }

Co z resztą metod klasy SessionStorage?

Cytat
A kto mi zabroni zrobić konstruktor klasy abstrakcyjne

Nikt, ale co to ma do rzeczy? Ty stwierdziłeś, że równie dobrze to mogła by być zwykła klasa, a nie mogła by być, bo była by bezużyteczna.

Cytat
Wiem czemu to zastosowałeś, ale nie jest to dobre podejście. Każda klasa ma konstruktor nie ważne jakie słówko sobie przed nią postawisz. Bo jest coś takiego jak konstruktor domyślny, który nie musi być zdefiniowany jawnie i tu kłania się brak podstaw php.


Chyba dalej nie rozumiesz dlaczego użyłem klasy abstrakcyjnej, a nie zwykłej. Co z tego, że konstruktor jest domyślnie definiowany, skoro jest pusty?
Zobacz sobie co dodaję w klasach dziedziczących po ClientMakerAbstract w folderze makerClients to może w końcu pojmiesz.

Nie chce mi się marnować energii i nerwów na tą dyskusje już.

Ten post edytował Omenomn 14.01.2017, 17:59:42
Go to the top of the page
+Quote Post
com
post
Post #110





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


Cytat
Mówię o wrzucaniu do Upload obiektu klasy SessionStorage. Może nie być potrzeby zapisu do sesji i co wtedy?


No to do innego storage wtedy go zapiszesz, SessionStorage to tylko przykład. nigdzie nie powiedziałem ze wgl kiedykolwiek użyjesz go w tym miejscu. W Twoim systemie w miejsce SessionStorage wstawisz sobie FileStorage i wtedy zapiszesz te obrazki do pliku, a nie do sesji je wrzucisz.

Cytat
Co z resztą metod klasy SessionStorage?


Ale co Cie one wgl interesują, są żebyś mógł wykonać dowolne operacje na tym obiekcie. A nie tylko to co akurat w tym miejscu potrzebujesz, w innym może się okazać, że potrzebujesz inne.
Zajrzyj sobie do implementacji dowolnego obiektu typu Storage to będziesz wiedział czemu one tam są.

Cytat
Chyba dalej nie rozumiesz dlaczego użyłem klasy abstrakcyjnej, a nie zwykłej. Co z tego, że konstruktor jest domyślnie definiowany, skoro jest pusty?
Zobacz sobie co dodaję w klasach dziedziczących po ClientMakerAbstract w folderze makerClients to może w końcu pojmiesz.


Rozumiem, po to żeby w 8 miejscach mieć dostęp do tych samych metod i właściwości. Ale wystarczyło by ze byś miał w jednym a te klasę wstrzyknął jako zależność.

Cytat
Nikt, ale co to ma do rzeczy? Ty stwierdziłeś, że równie dobrze to mogła by być zwykła klasa, a nie mogła by być, bo była by bezużyteczna.


Nie była by bo ona się u Ciebie nie zmienia, nawet jak tworzysz jej dziecko. Wiec równie dobrze mogła by istnieć bez niego i tez by to działało tak samo jak działa teraz.

Cały twój kod w makerClients to kulawe Proxy, kolejny wzorzec który miał nim być ale nie jest bo nie wyszedł (IMG:style_emoticons/default/wink.gif)
https://github.com/domnikl/DesignPatternsPH...tructural/Proxy

Ten post edytował com 14.01.2017, 18:15:01
Go to the top of the page
+Quote Post
Omenomn
post
Post #111





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 4.02.2014

Ostrzeżenie: (20%)
X----


com, zastanów się człowieku co Ty w ogóle mówisz, bo tą Twoją przemądrzałą gadką o klasach abstrakcyjnych negujesz praktyki stosowane we frameworkach klasy Laravela.
Może napisz swój framework na wyższym poziomie niż Symfony i Laravel, a później neguj stosowane w nim praktyki.
Klasa abstrakcyjna w Laravel odpowiedzialna za requesty:
  1. <?php
  2.  
  3. namespace App\Http\Requests;
  4.  
  5. use Illuminate\Foundation\Http\FormRequest;
  6.  
  7. abstract class Request extends FormRequest
  8. {
  9. //
  10. }
  11.  


Skoro takie kwestie negujesz, to jak mógłbym Cię słuchać w innych?
Go to the top of the page
+Quote Post
viking
post
Post #112





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

Ostrzeżenie: (0%)
-----


A kto powiedział że Laravel jest dobrze napisany? Jak wygląda HTTP messaging definiują PSR-7 i draft PSR-17. I patrzysz chyba na jakiś stary kod bo obecnie class FormRequest extends Request implements ValidatesWhenResolved
Go to the top of the page
+Quote Post
com
post
Post #113





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


Omenomn Coś długo trwało zanim coś wymyśliłeś, ale pierwsze pytanie skąd wgl ten kod masz, bo ja tam nigdzie w źródle laravel nie widzę takiej klasy. A poza tym coś Ty niby udowodnił nie pokazując kodu tej klasy abstrakcyjnej.

Cytat
negujesz praktyki stosowane we frameworkach klasy Laravela


Akurat Laravel to ma parę błędów w architekturze. Co sprawiło, że w Polsce bardziej ceni się Symfony. Na szczęście obecnie można już nie używać Fasad, i zastąpić Eloquent - Doctrine.

Ten post edytował com 23.01.2017, 12:39:28
Go to the top of the page
+Quote Post
Omenomn
post
Post #114





Grupa: Zarejestrowani
Postów: 77
Pomógł: 0
Dołączył: 4.02.2014

Ostrzeżenie: (20%)
X----


Ta klasa abstrakcyjna nie ma kodu, jest pusta, co zaprzecza całej gadaninie coma i pythona na temat klas abstrakcyjnych.

Folder App\Http\Request\Request.php - Laravel 5.2.

Napisz coś lepszego i wtedy się wymądrzaj, bo jak na razie wolę czerpać wzorce z Laravel niż słuchać przemądrzałego gościa, który jakby pewnie pokazał jakiś kod projektu, to by była taka sieka, że głowa boli.
Go to the top of the page
+Quote Post
kapslokk
post
Post #115





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


(IMG:http://x3.wykop.pl/cdn/c3201142/comment_uce5mt2Kik5EXF5ODi0IQUkerCwHZYF9.jpg)
Myślisz, że takie obrazki wzięły się znikąd?

Ten post edytował kapslokk 24.01.2017, 08:41:54
Go to the top of the page
+Quote Post
Pyton_000
post
Post #116





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

Ostrzeżenie: (0%)
-----


Cytat(Omenomn @ 24.01.2017, 08:36:26 ) *
Ta klasa abstrakcyjna nie ma kodu, jest pusta, co zaprzecza całej gadaninie coma i pythona na temat klas abstrakcyjnych.


Po primo to nie "pythona". Szanujmy się.
Po secundo to zacytuj mi moją wypowiedź w które powiedziałem że klasa abstrakcyjna nie może być pusta.
Go to the top of the page
+Quote Post
mrc
post
Post #117





Grupa: Zarejestrowani
Postów: 160
Pomógł: 27
Dołączył: 22.09.2008
Skąd: Tarnów

Ostrzeżenie: (0%)
-----


@Omenomn

Uparty jesteś, niestety nie w tą stronę co trzeba. Jak za kilka lat przeczytasz swoje posty, to wstyd Ci się zrobi (IMG:style_emoticons/default/smile.gif)

Wzorców projektowych nie powinieneś brać ani z Laravela, ani z Symfony. Wzorce projektowe po prostu są. Były przed Laravelem i przed Symfony. Ty po prostu zamykasz się co do jednego oczywistego i najwspanialszego frameworka.

Laravel, mimo że zaczyna być frameworkiem od całego web, zaczynając od backendowego mvc po front, dalej jest tylko Laravelem. Za kilka lat może znudzić Cię webmasterka (bo na dłuższą metę jest nudna). Będziesz szukał pewnie programowania innych rzeczy. W czym Ci tu pomoże wzór Laravela? W niczym. Miałem kiedyś krótki epizod z chłopakiem, który znał odrobinę języków microsoftowych. Kodowaliśmy chwilę w php. Zrobił sporą sieczkę i tłumaczył jeszcze, że tak się robi, bo te języki które zna tak działały. Oczywiście, wymyślał coś na około mvc, byle by nie mvc. Projektu nie udało się postawić, bo chłopak nie umiał sobie poradzić ze swoim tworem w nowych warunkach (web).

Może w chwili obecnej, kiedy pracujesz jako programista Laravel w firmie, jest Ci dobrze z tym co robisz i jak robisz. Życie i selekcja naturalna na pewno pokażą Ci, jak daleki jesteś od ideału developera.

PS. Sam kiedyś byłem bojówkarzem. PHP był dla mnie najlepszym językiem, a Java i języki kompilowane to zło. Perspektywa czasu mi pokazuje, że po prostu głupi byłem (IMG:style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
com
post
Post #118





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


Omenomn sorry ale to Tobie się wydaje, że wiesz wszystko najlepiej. Ja tylko podałem Ci definicje klasy abstrakcyjnej, która znajdziesz wszędzie. Jakbyś pisał w językach typu c++ to byś wtedy ją zapewne dobrze znał. A co do kodu wspaniałego frameworka, spójrz na to co się z tą klasa która nie miała sensu dzisiaj stało. Dziś jej już nie ma. A do każdej klasy możną sobie dopisać abstract, ale to nie znaczy, że to czyni każdą klasę abstrakcyjną.


A jak się chwile zastanowić, to co ona niby dawała, no nic bo wystarczyło by rozszerzać FormRequest. Ale wierz sobie dalej, że Taylor Otwell, nie może się mylić, chociaż jak sobie poczytasz historie jego i Laravel, to jak już mówiłem są tam pewne błędy w architekturze i jedyne rozwiązanie to nie używać tego, czego przykładem może być chociażby Eloquent, który implementuje Active record, to też wzorzec, ale nie jest on dobrym pomysłem.

Jednakże myślę, że już dalsza dyskusja nie ma sensu, bo stworzyłeś swój kod "doskonały" i próbujesz go obronić ja to rozumiem, jednakże jest on daleki od ideału i każdy Ci to powie, ja też wcale nie twierdze, ze moja implementacja to jedyna słuszna.

Ten post edytował com 24.01.2017, 10:35:48
Go to the top of the page
+Quote Post
daro0
post
Post #119





Grupa: Zarejestrowani
Postów: 88
Pomógł: 12
Dołączył: 17.09.2014
Skąd: Krasnystaw

Ostrzeżenie: (0%)
-----


Aż do takich wniosków typu czy tam są błędy to bym nie dochodził. AR czy tam Singleton są uważane co prawda za przestarzałe, jednak z AR prawdę mówiąc dość wygodnie się pracuje, zwłaszcza dzięki tym relacjom has many, has one, belongs to. Dodatkowo mogę sobie np. w prosty sposób np. zaimplementować filtry, czyli np. automatyczny hash hasła przy zapisie danych do modelu User, również walidacje danych. Jasne że się można przyczepić do niezgodności z SRP ale to już inna sprawa. Bo podejrzewam że gdybym się zastanawiał nad tym wszystkim, to projekt który mam skończyć w jakimś określonym terminie to bym skończył znacznie później, zaliczając przy tym sporą obsuwę.

Ale to jest pryszcz. Wystarczy sobie porównać L 4.2 vs. L.5.3 żeby dojść do tego jak duże są między nimi różnice i jakie to ma przełożenie na praktykę. I tylko jestem ciekaw jak będzie wyglądać v. 6.x Laravela, bo znowu mogą być takie zmiany, że już port nie będzie taki prosty choć na dzień dzisiejszy L 5.3 można uważać za OK.
Go to the top of the page
+Quote Post
com
post
Post #120





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

Ostrzeżenie: (0%)
-----


Zanim zaczniesz rzucać następnym razem nie słuszne oskarżenia to się zastanów:

Chciałeś kod "frameworka", samego kodu udostępnić nie mogę bo jest to zamknięte oprogramowanie, ale mogę dać światło na strukturę:

(IMG:http://i68.tinypic.com/1414h0j.png)

Użycie:
(IMG:http://i68.tinypic.com/35217vm.png)

Wcale nie potrzebuje Laravela czy Symfony, żeby pisać dobry czysty kod, który można wykorzystać w wielu projektach, a te frameworki wręcz w tym przeszkadzają, bo już z góry narzucają jedyną słuszną implementacje zgodną z ideą twórców.

Framework taki jak Laravel czy Symfony też mam, ale nie mam takiego community jak one, wiec się nie rozwija, bo nie mam na to czasu. Powstał tylko dlatego, że te wielkie nie maja w pełni uporządkowanego api i pewien balast ciągną za sobą z wersji na wersję, dlatego, że nie mogą zrobić nagle bc breaka, co zdarza się jednak w Laravelu, za co jest krytykowany. Przykład ta klasa abstrakcyjna była do 5.2, dziś już nie ma. Dodatkowo powstał on z myślą o php 7, a w nowych projektach gdzie używam tego co jest powyżej target mam na 7.1, wiec wykorzystuje tam to co w nowej wersji najlepsze. Na chwile obecną te duże natomiast mogą tylko wspierać 7, ale nie używać, bo okres zakończenia rozwoju php 5 minął dopiero na początku tego roku, ale został przesunięty do wydania z przed pięciu dni.

A wsparcie to jest problem, przykład doctrine/common:
lib/Doctrine/Common/Persistence/ObjectRepository.php

Jest to interfejs, który ma jedną z metod, o takiej definicji:
  1. public function findOneBy(array $criteria);

Wszytko ładnie ale doctrine od ładnych paru wersji ma już implementacje taką:
  1. findOneBy(array $criteria, array $orderBy = null)

Niestety PhpStorm nie widzi tego, bo interfejs nie ma drugiego parametru i nie podpowie, a co więcej podkreśli jako błąd, choć kod będzie działać
Jest to jednak nie do ruszenia, cytując:
Cytat
we have our hands tied on basically anything that involves changing interfaces


daro0 Ja się zgadzam może i to się podobać, choć ja osobiście używałem w jednym projekcie i bardzo szybko uznałem, że nie jest to droga, która chce iść. Ale powiem Ci, że to co uważasz za zalety u konkurencji z data mapperem można zrobić w podobny sposób równie szybko.

Ten post edytował com 24.01.2017, 17:44:19
Go to the top of the page
+Quote Post

10 Stron V  « < 4 5 6 7 8 > » 
Closed TopicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 8.01.2026 - 10:02