Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przybliżenie zasady SRP
Forum PHP.pl > Forum > PHP > Object-oriented programming
Szymciosek
Witam,
prosiłbym o podanie przykładu np na klasie logowania lub obsługi użytkowników (logowanie, rejestracja, walidacja, usuwanie itd).
Jak to rozbić wg. zasady SRP?
Szukam na internecie różnych wątków na ten temat, ale nie bardzo mi to podchodzi i pomyślałem, że może tu mi pomożecie pokazując to na przykładzie bardziej życiowym.

Pozdrawiam
Szymon
!*!
A co to jest SPR?
Szymciosek
SRP - Single Responsibility Principle

Nie pisałem tego, bo myślałem, że ktoś wie.
!*!
Nie słyszałem, choć ma to nawet sens o ile ktoś lubi się rozdrabniać. Uważam że jeśli Twoja klasa ma więcej niż 300 linijek kodu, to robisz coś źle, ale to tylko moje zdanie i całkowicie się z nim zgadzam wink.gif

Wpisałem w google "Single Responsibility Principle" i wyskoczyło kilka sensownych artów z wyjaśnieniem nawet po polsku.
http://sprawnainzynieriaoprogramowania.blo...-principle.html (jest też 2 część)
http://przemyslawczatrowski.com/2010/07/15...ple-w-praktyce/

Pytanie, dlaczego chcesz to stosować i czy w Twojej aplikacji się to przyda?
nospor
Cytat
SRP - Single Responsibility Principle

Nie pisałem tego, bo myślałem, że ktoś wie.

SRP - Secure Remote Password
smile.gif

Tak więc na przyszłość wyjaśniaj od razu czego dokładnie szukasz, bo skróty mogą mieć różne znaczenia.
Szymciosek
Czy stosować to inna sprawa, po prostu chodzi o wyczucie pisania klasy wg. tejże zasady.
Co klasa obsługi użytkownika np. UserManager może zawierać w sobie, a co już będzie za dużo itd?
Crozin
Logowanie, rejestracja, walidacja czy bliżej nieokreślone usuwanie to już mocno złożone operacje, które niejednokrotnie wymagają współpracy dziesiątek różnego rodzaju obiektów - tak więc raczej nikt nie będzie tutaj wpisywał tak sporego przykładu.

Chcesz trzymać się zasady pojedynczej odpowiedzialności? Odpowiedz sobie na pytanie za co odpowiedzalny jest dany obiekt/klasa - jeżeli użyjesz w odpowiedzi "i", "lub", "albo", "oraz" czy czegoś w tym stylu, najprawdopodobniej nie trzymasz się tej zasady.

Cytat
Co klasa obsługi użytkownika np. UserManager może zawierać w sobie, a co już będzie za dużo itd?
Może zawierać w sobie dużo różnych rzeczy. Przyrostek "manager" nie mówi kompletnie nic.
Szymciosek
Czyli wg. Twojej teorii Crozin, klasa, która będzie obierała dane z formularza, następnie te dane sprawdzała z danymi z bazy i na koniec w przypadku zgodności tworzyła sesję, w której będę trzymał informację o zalogowaniu jest przykładem na poziomie zasady pojedynczej odpowiedzialności?
Dalej: Logowania i rejestracja w takim przypadku są osobnymi klasami, które działają na podobnej zasadzie, czyli pobranie danych z formularza, walidacja itd?

Jeszcze gdzieś wyczytałem na jakimś blogu w wątku o SRP, że klasa taka powinna współpracować z formularzem, że jak zmieniam np ilość pól czy nazwę pola w formularzu, to powinno to współgrać z klasą np. Login. Czy dobrze to rozumiem, że zanim rozpocznę pracę z klasą Login, powinienem jej przekazać dane dotyczące formularza tj. jakie pola posiada żeby później zmienić to tylko w liniach $obj->addElement('username')?
http://sebastian-malaca.blogspot.com/2013/...onsibility.html tutaj jest ten przykład.

Kolejne pytanie jakie mi się nasuwa, to czy mogę bezpośrednio z formularz uruchomić klasę Login? Sterowanie całością mam w index.php, gdzie na podstawie url ładowane są potrzebne klasy, ale zastanawia mnie czy taką drogą mogę odebrać dane z index.php, który zostanie przeładowany (zostanie załadowany login.php) w login.php i czy takie rozwiązanie jest dobre i bezpieczne?

mam teraz coś w tym stylu:
index.php
  1. ...
  2. <body>
  3. <?php
  4. //tutaj sprawdzam czy jest sesja, jesli nie, to uruchamiam widok login.html
  5. include_once 'login.html'; // ogólnie ładowane w ten sposób będą widoki w zależności od podstrony //tutaj jest formularz logowania zawierający pola username oraz password, który posiada przekierowanie na www.xxx.pl/login i wtedy jest uruchamiana klasa Login
  6. ?>
  7. </body>
  8. ...


klasa Login.php lub LoginController mogłaby wtedy wyglądać jakoś tak?
  1. class Login
  2. {
  3. public function __construct()
  4. {
  5. //pobranie danych z $_POST
  6. // $this->username = $_POST['username']; questionmark.gif
  7. $this->validate();
  8. }
  9.  
  10. private function validate()
  11. {
  12. //sprawdzenie pobranych wyżej danych z danymi z bazy
  13. //jakis if, ktory porówna dane
  14. }
  15.  
  16. private function doLogin()
  17. {
  18. //stworzenie sesji, jesli validate na to pozwala
  19. }
  20. }



EDIT:
Pisząc tego posta doszedłem do wniosku, że mogę przesłać dane z formularza do klasy Login.php, ale zostaje jeszcze kwestia czy jest to dobre i bezpieczne?
Crozin
Cytat
Czyli wg. Twojej teorii Crozin, klasa, która będzie obierała dane z formularza, następnie te dane sprawdzała z danymi z bazy i na koniec w przypadku zgodności tworzyła sesję, w której będę trzymał informację o zalogowaniu jest przykładem na poziomie zasady pojedynczej odpowiedzialności?
Napisałem, że jeżeli jesteś wstanie wymienić kilka zadań stawianych przed obiektem to "jest źle". Tutaj podałeś cały szereg zadań i pytasz się "czy tak jest dobrze". Nie, tak nie jest dobrze.
Szymciosek
Tylko czy jest sens rozbijać taką klasę? Przecież wszystkie te metody są ze sobą połączone.
!*!
Odpowiedz sobie na pytanie czy jest Ci to w ogóle potrzebne. IMO jest to sztuka dla sztuki.
Jeśli myślisz na poważnie o OOP, to zrezygnuj z czegoś takiego:

  1. <?php
  2. //tutaj sprawdzam czy jest sesja, jesli nie, to uruchamiam widok login.html
  3. include_once 'login.html'; // ogólnie ładowane w ten sposób będą widoki w zależności od podstrony //tutaj jest formularz logowania zawierający pola username oraz password, który posiada przekierowanie na www.xxx.pl/login i wtedy jest uruchamiana klasa Login
  4. ?>


To jest źle. I jeśli uczysz się o OOP, to zabrałeś się nieco od złej strony. Przeczytaj cały wątek http://pl.wikibooks.org/wiki/PHP/Czym_jest...ie_obiektowe%3F jak to opanujesz, zaimplementuj MVC (lub cokolwiek co jest jego odłamem) i dopiero później kombinuj jaki wzorzec wybrać.
Teraz jak to zaimplementujesz, to w którymś momencie stwierdzisz że to głupota i będziesz musiał przepisać 90% kodu.

A jeśli już mówimy o rozbiciu odpowiedzialności, to Login, Rejestracja i Walidacja są osobnymi klasami, czyli na przykładzie:

  1. class Login
  2. {
  3. public function __construct()
  4. {
  5. //pobranie danych z $_POST
  6. // $this->username = $_POST['username'];
  7.  
  8. }
  9.  
  10. private function next()
  11. {
  12. $v = new Validation();
  13. $v -> addValid($this->username);
  14. if($v->ok) // jesli walidacja jest poprawna
  15. {
  16. return true;
  17. }
  18. return false;
  19. }
  20.  
  21. public function costam()
  22. {
  23. if($this->next()) {return true} //jesli metoda next() zwraca true to znaczy że mozna sie zalogowac itd.
  24. }
  25. }
  26.  
  27. $l = new Login;
  28. if($l->costam())
  29. {
  30. // moge sie zalgoowac
  31. }
  32. else
  33. {
  34. // wyswietl bledy formularza
  35. }
LSM
Wszystkie zasady jak SRP, prawo Demeter itp. oczywiście są super jednak należy do nich dążyć, a nie bezwzględnie ich przestrzegać. Często nie ma takiej potrzeby. Nie ma co na siłę wdrażać wszystkich fajnych zasad, bo można sobie pofolgować i w ekstremalnym przypadku SRP - jedna klasa będzie zawierać tylko jedną metodę. Także spokojnie z tymi wytycznymi. ;-) Każdy sam powinien znać moment aby powiedzieć: stop, dalej nie refaktoryzuję!
Szymciosek
Już to zrozumiałem i wiem, że wiele przychodzi z czasem czyt. w trakcie pisania kodu, gdzie w końcu dostrzegasz jakieś zależności między A i B i możesz sobie to zrobić inaczej, prościej.
pyro
!*!, ja rozumiem, że to miał być tylko orientacyjny punkt odniesienia, ale ten kod co podałeś to zwykła maniana, a początkującym to nie służy, więc może na następny raz jakiś lepszy przykład?

// ADD

A nie. Ty po prostu najzwyczajniej w świecie klepiesz bzdury.

Cytat(!*! @ 28.01.2013, 17:11:21 ) *
Nie słyszałem, choć ma to nawet sens o ile ktoś lubi się rozdrabniać. Uważam że jeśli Twoja klasa ma więcej niż 300 linijek kodu, to robisz coś źle, ale to tylko moje zdanie i całkowicie się z nim zgadzam ;)

!*!
pyro - dużo wniosłeś do tematu, rozumiem że śnieg za oknem, ale mimo wszytko jest już koniec marca, nie stycznia.
A teraz to uzasadnij, skoro już zacząłeś. Miałem tu napisać cały mechanizm? Jeśli Ty upychasz wszytko w jednym pliku, który ma po kilka tysięcy linijek kodu, to Twoja sprawa smile.gif co zresztą zaznaczyłem.
pyro
Cytat(!*! @ 26.03.2013, 14:51:32 ) *
pyro - dużo wniosłeś do tematu, rozumiem że śnieg za oknem, ale mimo wszytko jest już koniec marca, nie stycznia.
A teraz to uzasadnij, skoro już zacząłeś. Miałem tu napisać cały mechanizm?


Dobrze, uzasadnię. Po pierwsze nie mówię o napisaniu całego mechanizmu. Mówię że kod, który przedstawiłeś tutaj w tym temacie jest beznadziejny, a nie kod którego nie ma lub jeszcze nie ma.

Przykładowe błędy:
1. Odwoływanie się do danych w konstruktorze, brak możliwości ich ustawiania.
2. Brak jakiejkolwiek hermetyzacji.
3. Nic nie mówiące nazwy, a wręcz mylące (przypomina to metody Iteratora)
4. Wielokrotne tworzenie tego samego obiektu wewnątrz jednej metody.
5. Nieprawidłowa (nieprawidłowa to pojęcie względne - po prostu słaba) implementacja walidacji
6. Niepotrzebna zależnośc od innych klas.


To tylko przykładowe błędy dla tych 30 linijek kodu.

Cytat(!*! @ 26.03.2013, 14:51:32 ) *
Jeśli Ty upychasz wszytko w jednym pliku, który ma po kilka tysięcy linijek kodu, to Twoja sprawa smile.gif co zresztą zaznaczyłem.


Równie dobrze mogłeś powiedzieć, że jestem chamem, bo kupuję zbożowe batoniki za 1,20zł zamiast za 1,00zł. Widzisz, żebym gdzieś coś wspominał o pakowaniu kilku tysięcy linijek kodu do jednego pliku? Bo ja nie za bardzo. Wyraziłeś się dośc precyzyjnie - "więcej niż 300 linijek" kodu i nie, nie brałem tego dosłownie, że już 305 linijek to źle. Prawidłowość i funkcjonalność klasy nie ma w ogóle nic wspólnego z ilością kodu w niej zawartego, ale od implementacji kodu. Istnieje ogrom plików tworzonych przez profesjonalistów (mówię o takich z prawdziwego zdarzenia), których klasy sięgają grubo ponad 1000 linijek. Przykład: Twig (od twórcy Symfony) albo nawet Symfony. W obu istnieje wiele plików, których ilośc kodu to ponad 1000 linijek. Przecież to kilkukrotnie ponad Twoją granicę! Czyli wszyscy Ci programiści są tacy beznadziejni sad.gif ?
Szymciosek
Możesz napisać taki mały pliczek biorąc pod uwagę błędy, które wytknąłeś? Czyli te 6 punktów.
!*!
pyro = cham! a nawet burżuj kupujący batoniki za 1,20zł! tongue.gif

Cytat
Przykładowe błędy:
1. Odwoływanie się do danych w konstruktorze, brak możliwości ich ustawiania.
2. Brak jakiejkolwiek hermetyzacji.
3. Nic nie mówiące nazwy, a wręcz mylące (przypomina to metody Iteratora)
4. Wielokrotne tworzenie tego samego obiektu wewnątrz jednej metody.
5. Nieprawidłowa (nieprawidłowa to pojęcie względne - po prostu słaba) implementacja walidacji
6. Niepotrzebna zależnośc od innych klas.


1. Nie uwierzysz, ale nie o to chodziło
2. patrz punkt 1
3. tu się zgodzę, sam nie wiem co mną kierowało, zdarza się.
4. to nie błąd, choć można by to upchnąć w zmiennej, jak tak bardzo Cie to razi, tym bardziej że nie odwołujesz sie w Loginie w nieskończenie wiele razy.
5. to już tylko Twoje zdanie.
6. patrz punkt 5

Cytat
Czyli wszyscy Ci programiści są tacy beznadziejni ?

W dużym skrócie... Tak. Choć to ni jak ma się do tematu... A jeśli uznasz, że uznałem ich za beznadziejnych, to przeczytaj jeszcze raz pierwszą część zdania wink.gif

Cytat
Możesz napisać taki mały pliczek biorąc pod uwagę błędy, które wytknąłeś? Czyli te 6 punktów.

Dobry pomysł.
Pyro odnieś się do tematu, popraw mój kod lub napisz własny. Tylko ładnie, bo po kilku miesiącach przyjdzie ktoś z batonikami za 1,60zł i będzie dym.
pyro
Cytat(!*! @ 26.03.2013, 16:09:54 ) *
1. Nie uwierzysz, ale nie o to chodziło
2. patrz punkt 1


Zdaje sobie sprawę, że nie o to chodziło, dlatego mój pierwszy post wyglądał dokładnie tak:

Cytat(pyro)
!*!, ja rozumiem, że to miał być tylko orientacyjny punkt odniesienia, ale ten kod co podałeś to zwykła maniana, a początkującym to nie służy, więc może na następny raz jakiś lepszy przykład?


Ale skoro widzę, że nie rozumiesz tych prostych słów, sformułuję to inaczej:

Ktoś zadał pytanie propo OOP, bo go nie do końca rozumie, inaczej by chyba nie było pytania. Chyba trudno się z tym nie zgodzić? Ty podajesz swój prototyp, który jest błędny z w/w powodów. Ja sobie zdaję z tego sprawę, że to miał być wzór, ale ktoś mający z tym problemy widząc takie coś może zapożyczyć te błędne rzeczy w swoim kodzie. A Ty nigdzie nie napisałeś w komenatarzach nic w stylu "Nie powinieneś tak robić", "to tylko wzór, ale normalnie powinieneś zrobić to tak i tak" itp, więc ktoś może uznać, że takie praktyki są dobre, a nie są. Chciałbym Ci przypomnieć, że pisałeś tego posta dla innych (bo nie jedna osoba zajrzy do tego tematu), a nie dla siebie. No chyba że prowadzisz monolog... smile.gif

Cytat(!*!)
4. to nie błąd, choć można by to upchnąć w zmiennej, jak tak bardzo Cie to razi, tym bardziej że nie odwołujesz sie w Loginie w nieskończenie wiele razy.


To jest błąd. To coś jak napisanie czegoś w stylu:

  1. // ŹLE
  2. $aArr = array_fill(0, 10000, '!*! robi podstawowe błędy programistyczne!');
  3. for($i=0; $i < count($aArr); $i++)
  4. {
  5. echo $aArr[$i].PHP_EOL;
  6. }


zamiast:

  1. // DOBRZE
  2. $aArr = array_fill(0, 10000, '!*! robi podstawowe błędy programistyczne!');
  3. $iArrCount = count($aArr);
  4. for($i=0; $i < $iArrCount; $i++)
  5. {
  6. echo $aArr[$i].PHP_EOL;
  7. }


Cytat
5. to już tylko Twoje zdanie.
6. patrz punkt 5


Nie. To nie jest Tylko moje zdanie. To wbrew zasadom OOP. Polecam Tobie lekturę do poduszki "Rusz głową! Wzorce projektowe", gdzie są poruszane nie tylko wzorce projektowe, ale także zasady dobrej implementacji kodu, a to co Ty uważasz za moją opinię jest tam uznane za błąd. No chyba, że masz zamiar dodać również tych programistów do Twojej listy "kiepskich programistów" smile.gif .

Przykładowa sensowna implementacja poniżej, bo nie wiem czy się zmieści w jednym poście:
!*!
Cytat
Zdaje sobie sprawę, że nie o to chodziło, dlatego mój pierwszy post wyglądał dokładnie tak:

Chodziło o to że wypisałeś "błędy" które nie miały sensu, a odniosłem się do punktów jakie wymieniłeś, już rozumiesz?

  1. To jest błąd. To coś jak napisanie czegoś w stylu:

Kompletnie nie trafiony przykład, szczególnie że w przypadku Loginu nie ma to znaczenia, chyba że piszesz jakieś kompletne bzdury, odwołując się więcej niż raz, do metody. Weź poprawkę na to, że cały czas mowa o klasie Login.
pyro
Pisane z palca, więc mogłem się gdzieś pomylić (literówka, błąd logiczny), ale chodzi o zamysł:

  1. <?php
  2.  
  3. // FRAGMENT kodu rejestracji
  4.  
  5. interface Validator {
  6. public function validate($mVar);
  7. }
  8.  
  9. class EmailValidator implements Validator {
  10. public function validate($mVar) {
  11. return (bool)filter_var($mVar, FILTER_VALIDATE_EMAIL);
  12. }
  13. }
  14.  
  15. class PasswordValidator implements Validator {
  16. public function validate($mVar) {
  17. return (bool)(strlen($mVar) > 8 && strlen($mVar) < 30);
  18. }
  19. }
  20.  
  21. class Registration {
  22.  
  23. private $rConn;
  24. private $_aValidators = array();
  25. private $_aRegisterData = array();
  26. private $aErrorCodes = array();
  27.  
  28. // ZAŁOŻENIE - skrypt opiera się na MySQLi
  29. public function __construct(mysqli $rConn) {
  30. $this->rConn = $rConn;
  31. }
  32.  
  33. public function __get($sName) {
  34. return $this->_aRegisterData[$sName];
  35. }
  36.  
  37. public function __set($sName, $mValue) {
  38. $this->_aRegisterData[$sName] = $mValue;
  39. }
  40.  
  41. public function addValidator(Validator $oValidator, $sDataName) {
  42. $this->_aValidators[$sDataName] = $oValidator;
  43. }
  44.  
  45. public function isError() {
  46. return !empty($this->aErrorCodes);
  47. }
  48.  
  49. public function getErrorCodes() {
  50. return $this->aErrorCodes;
  51. }
  52.  
  53. public function proccess() {
  54. $sQuery = '';
  55.  
  56. foreach($this->_aRegisterData as $sKey => $mSingleVar) {
  57. if(isset($this->_aValidators[$sKey]) && $this->_aValidators[$sKey]->validate($mSingleVar))
  58. {
  59. // $sQuery .= .....
  60. }
  61. else
  62. {
  63. $this->aErrorCodes[] = $sKey;
  64. }
  65. }
  66.  
  67. // Tutaj można by dodać inne rzeczy, czy naprzykład nie podano za dużo danych do danych rejestracji
  68.  
  69. if(!$this->isError())
  70. {
  71. // $this->rConn->query() ......
  72. }
  73.  
  74. // Należałoby też zrobić jakieś dalsze sprawdzanie błędów itp.
  75.  
  76. }
  77.  
  78. }
  79.  
  80. // $conn zdefiniowane gdzieś tam wcześniej
  81. $oRegistration = new Registration($rConn);
  82.  
  83. $oRegistration->addValidator(new EmailValidator(), 'email');
  84. $oRegistration->addValidator(new PasswordValidator(), 'password');
  85.  
  86. // Przykładowa propozycja na użycie innych klas (Request)
  87.  
  88. $oRequest = Request::getInstance();
  89. $oRegistration->email = $oRequest->post('email');
  90. $oRegistration->password = $oRequest->post('password');
  91. $oRegistration->proccess();
  92.  
  93. if($oRegistration->isError())
  94. {
  95. foreach($oRegistration->getErrorCodes() as $sErrorCode)
  96. {
  97. // Klasa pobierająca dane na podstawie języka (Lang). W końcu skrypt międzynarodowy :)
  98. $oLang = Lang::getInstance();
  99. echo $oLang->get('registration_error_'.$sErrorCode).PHP_EOL;
  100. }
  101. }
  102.  
  103. ?>


Cytat(!*! @ 26.03.2013, 17:58:43 ) *
Kompletnie nie trafiony przykład, szczególnie że w przypadku Loginu nie ma to znaczenia, chyba że piszesz jakieś kompletne bzdury, odwołując się więcej niż raz, do metody. Weź poprawkę na to, że cały czas mowa o klasie Login.


I dalej nie rozumiesz, że nie pisałes tego kodu ani dla siebie, ani dla mnie. Tu jest mowa o klasie Login, a ktoś kto to zobaczy zastosuje to gdzieś indziej i wyjdzie coś w stylu trafionego przykładu, który podałem.
!*!
Cytat(pyro @ 26.03.2013, 18:07:10 ) *
I dalej nie rozumiesz, że nie pisałes tego kodu ani dla siebie, ani dla mnie. Tu jest mowa o klasie Login, a ktoś kto to zobaczy zastosuje to gdzieś indziej i wyjdzie coś w stylu trafionego przykładu, który podałem.

A zrozumiałeś w ogóle sens tego tematu i kontekst w jakim pojawił się ten kod, jak i sugestie innych?
Równie dobrze można by się przyczepić o to, że nie stosujesz standardu PSR, uczysz złych praktyk pisania kodu z czasów PHP4.
Nie napisałeś jeszcze dlaczego styl z tamtego przykładu jest "zły", a Twój "dobry".
pyro
Cytat(!*! @ 26.03.2013, 18:25:33 ) *
A zrozumiałeś w ogóle sens tego tematu i kontekst w jakim pojawił się ten kod, jak i sugestie innych?


Tak. Autor pyta o zasadę SRP. Twój kod nie do końca zgodny z tą zasadą (patrz pkt. 2,4,5). Jeżeli sam nie zaczaiłeś jeszcze o co w tym chodzi (bo sam zresztą w pierwszym swoim poście nawet nie wiedziałeś o co chodzi), to zapraszam tutaj: http://bit.ly/YyNwlw i przeczytanie więcej niż jednej linijki.

Poza tym nie rozumiesz cały czas celu mojego upomnienia Ciebie, mimo że wyjaśniałem to już dwa razy na dwa różne sposoby. Powtórzę po raz trzeci i ostatni (znowu na inny sposób ), a jeżeli nawet teraz nie zrozumiesz, to ja już nie wiem jak mam to osiągnąć. Więc jeżeli tym razem znowu nie zrozumiesz, to ja już nie wiem jak Ci to wytłumaczyć ;) :

Nie chodzi mi o to, że temat jest o "pomidorach, a Ty o pomarańczach". Chodzi mi o to, że próbując coś wyjaśnić i podając kod dodatkowo zawarłeś w nim kilka nieprawidłowych rzeczy (patrz błędy), które ktoś nieznający się w temacie i widząc ten kod mógłby zaadaptować i stosować w przyszłości. Bo skąd miałby wiedzieć, że takie rozwiązanie jest złe czy dobre? Gdybym się nie odezwał to pewnie by tak się stało i potem na forum w przedszkolu powstawałyby nowe tematy. To miało być po prostu upomnienie na przyszłość, a zrobiła się niezła dyskusja smile.gif .

Właściwie to nie oczekiwałem żadnej dalszej odpowiedzi. Chodziło mi tylko o rozwagę na przyszłość zanim zrobisz coś po raz kolejny w stylu: "Dla przykładu zaimplementuję sobie tutaj zupełnie blędnie i bezsensownie Singleton, ale nie o tym temat, więc mi wolno". I tu Cię uprzedzę - nie, nie twierdzę, że coś takiego zrobisz, to tylko przykład.

Cytat(!*!)
Równie dobrze można by się przyczepić o to, że nie stosujesz standardu PSR, uczysz złych praktyk pisania kodu z czasów PHP4.


Jeżeli odnosisz się tymi słowami do kodu, który podałem, to jest to kompletna bzdura.
!*!
pyro - właśnie cały dowcip polega na tym, że zrozumiałem o czym piszesz za pierwszym razem smile.gif
Sęk w tym, że większość została wyjaśniona, Szymciosek pytał o jedno, to dostał odpowiedź (przy okazji i ja się czegoś nowego nauczyłem, a co nawet zostało wcześniej odnotowane), nawet później napisał że już to rozpracował.

LSM nie wiedzieć czemu, odkopał temat ze stycznia, o którym nawet nie pamiętałem, a Ty się do niego odwołujesz po jakimś czasie, bo coś Ci nie pasuje (w niektórych kwestiach słusznie), ale to wygląda tak, jakby miś miał pretensje że śnieg leży, a on chce wiosnę.

Cytat
Jeżeli odnosisz się tymi słowami do kodu, który podałem, to jest to kompletna bzdura.

Tak, odnoszę się do kodu który napisałeś wyżej, bo niby do jakiego? Ale jak chcesz o tym podyskutować, to na PW, lub poproś moderatora o przeniesienie do HP, bo się robi burdel.

Z mojej strony EOT, bo od początku rozmawiamy na temat wyższości świąt.
pyro
Cytat(!*! @ 26.03.2013, 19:10:48 ) *
pyro - właśnie cały dowcip polega na tym, że zrozumiałem o czym piszesz za pierwszym razem smile.gif
Sęk w tym, że większość została wyjaśniona, Szymciosek pytał o jedno, to dostał odpowiedź (przy okazji i ja się czegoś nowego nauczyłem, a co nawet zostało wcześniej odnotowane), nawet później napisał że już to rozpracował.


Ale jest dodatkowy sęk, że cechą otwartego forum jest to, że każdy może zajrzeć do tego tematu, a nie tylko Ty i Szymciosek. Gdybym słyszał was dwóch rozmawiających na ten temat na ulicy albo na czacie, to wtedy w ogóle bym się nie wtrącał.

Cytat(!*! @ 26.03.2013, 19:10:48 ) *
LSM nie wiedzieć czemu, odkopał temat ze stycznia, o którym nawet nie pamiętałem, a Ty się do niego odwołujesz po jakimś czasie, bo coś Ci nie pasuje (w niektórych kwestiach słusznie), ale to wygląda tak, jakby miś miał pretensje że śnieg leży, a on chce wiosnę.


Nie. Mam pretensje tylko do tego co szczegółowo opisałem i nic więcej (ani nie mniej) smile.gif .

Cytat(!*! @ 26.03.2013, 19:10:48 ) *
Tak, odnoszę się do kodu który napisałeś wyżej, bo niby do jakiego? Ale jak chcesz o tym podyskutować, to na PW, lub poproś moderatora o przeniesienie do HP, bo się robi burdel.


Tyle że różni nas to, że ja szczegółowo opisałem co w Twoim kodzie jest nie tak, a Ty o moim zupełnie nic.

Cytat(!*! @ 26.03.2013, 19:10:48 ) *
Z mojej strony EOT, bo od początku rozmawiamy na temat wyższości świąt.


No to propo świąt życzę Wesołego Jajka, a dziewczynom jajek.

Tym optymistycznym akcentem chyba można zakończyć temat.

Pozdrawiam.
Szymciosek
Też tak myślę, wzajemnie życzę wam Wesołego Jajka.

Przede mną pewnie jeszcze długo droga do załapania pewnych rzeczy, a wy się nie musicie kłócić, wiecie swoje tongue.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.