Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl


smentek
Napisane: 30.08.2011, 20:30:25





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Cytat
"W którymś tematcie o OOP było napisane, że całkiem rozsądne jest robienie takich kontenerów-obiektów zawierających dane. Są tam zmienne, settery i gettery. Czy jednak to jest zło i należy to zmienić ?"


Ale taki obiekt który ma tylko dane + gettery i settery jest jak lodówka która nie mrozi albo auto które nie jeździ. Niewiele różni się od tablicy albo zbioru luźnych zmiennych.

Zależy czym ma być ten obiekt.Tu są dwie strony medalu:

1. Getery i setery są konwencją która pozwala na pewnego rodzaju "rozpoznawalny" interfejs dostępu do danych obiektu. Dzięki czemu łatwiej zaprzęgnąć do pracy zewnętrzną bibliotekę tak aby współdziałała z twoimi obiektami. Np chcesz wprowadzić zapis obiektów do bazy danych. Zamiast pisać własny kod który to obsługuje korzystasz z Doctrine2. Albo chcesz przeprowadzać inicjalizację przez kontener IoC. Jakikolwiek nie był by to mechanizm musi jakoś obsługiwać twoje obiekty, zrobi to dzięki getterom i setterom które umieścisz w swoim obiekcie. (To nie musi być zewnętrzny system to moze byc system który sam chcesz napisac) I to jest dobre prawidłowe wykorzystanie get i set.

2. Getery i setery mogą też stać się 'protezami' dla programisty który nie potrafi zaplanować dobrze kodu i zamiast prosić obiekt aby ten coś dla niego wykonał co chwile używa get i set aby cos z obiektu wyciągnąć albo cos do niego wrzucic.

Czyli zamiast


  1. $kucharz = new Kucharz(array($skladnik, $skladnik))
  2. $pizza = $kucharz->robPizze('Roma')


piszesz

  1.  
  2. $pizza = new Pizza();
  3. $pizza->setSkladnik1($skladnik);
  4. $pizza->setSkladnik2($skladnik);
  5. $kucharz = new Kucharz()
  6. $kucharz->setPizzaName('Roma')
  7. $kucharz->setPizza($pizza);
  8. $pizza = $kucharz->getPizza($pizza);


I to jest złe stosowanie get i set. Jezeli wprowadzasz get i set do swojego systemu nie wiedząc DOKLADNIE do czego jest ci to potrzebne to już zrobiłeś błąd.
  Forum: Object-oriented programming · Podgląd postu: #895161 · Odpowiedzi: 17 · Wyświetleń: 2 524

smentek
Napisane: 28.08.2011, 12:42:34





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Cytat
Zakładając, że chcę napisać klasę do logowania/rejestracji, jak powinienem to rozdzielić ? Osobna klasa do rejestracji i logowania, czy np. ogólnie klasa która będzie odpowiadała za te czynności ?


Im mniejsze czyli bardziej rozdrobnione obiekty tym lepszy system. Z drugiej strony jeżeli ma to być prosty system to nie ma sensu sztucznie go komplikować, tak że możesz rejestracje i logowanie zrobić w jednym obiekcie, tylko niech to nie będzie ten sam obiekt który reprezentuje użytkownika. Może 'UserAuthorisation'?

Cytat
Bo w zasadzie taką klasą miała być klasa UserManager, w niej miały znajdować się rejestracja, logowanie, wylogowywanie, usuwanie userów itp. Czy jest to prawidłowe założenie ?


Tak ale nazwa tego obiektu nie mówi o tym co obiekt robi.

Cytat
@smentek
Ta klasa byłaby w części aplikacyjnej tak ? A Character i CharacterManager to już część biznesowa tak?


Charakter jest biznesowy. A CharacterManager to obiekt, który powinien zostać podzielony na tyle obiektów ile widzisz 'problemów' do rozwiązania z wiązanych z obiektem Character. Każdy nowy kontekst wprowadza nowe obiekty.

Jeżeli chodzi o sam obiekt Character. Nawrzucałeś do niego różnych zmiennych które ci przyszły do głowy a które nie mają jakiegokolwiek uzasadnienia. Obiekt Character to nie jest prawdziwy obiekt w rozumieniu OOP. Od tablicy różni go tylko forma zapisu.

Przykładowo $_speed. Czym jest speed? Prędkość z którą porusza się byt w danym momencie czy maksymalna prędkość z którą może się poruszać? Prędkość to jest coś względnego. Względem czego liczysz prędkość? Jeżeli nie masz tego czegoś to może i sama speed powinna na razie zniknąć? Może prędkość nie powinna być zmienną tylko wynikać z relacji obiektów, tak jak w świecie rzeczywistym?

  Forum: Object-oriented programming · Podgląd postu: #894297 · Odpowiedzi: 17 · Wyświetleń: 2 524

smentek
Napisane: 28.08.2011, 10:01:51





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Cytat
Prawdę mówiąc nie wiem czy złapałem o co chodzi wink.gif


Chodzi mi o to ze program mozna koncepcyjnie podzielić na:

- Cześć APLIKACYJNA, która jest "wspólna" dla większości systemów www. Do tego wchodzi np. autoryzacja. (twoje logowanie) obsługa sesji, jakaś implementacja MVC (lub prostszy mechanizm zamiast MVC). Routingu.

Tej części nie wymyślaj od nowa użyj jakiegoś frameworku.

- Część BIZNESOWĄ która jest unikalna dla danego systemu. Jeżeli piszesz system do obsługi pizzerii to to będą obiekty Kucharz, Klient, Pizza, Składnik, Pizzy, Kelner, etc. (z palca pisze).

Skup się na tej części biznesowej a pierwszą znajdziesz w gotowych rozwiązaniach. Obie warstwy powinny zajmować się różnymi rzeczami. To znaczy obiekt Kucharz nie powinien implementować logowania ani zapisu danych dobazy, nawet jeżeli koncepcyjnie użytkownik będący kucharzem może się logować.

Obiekt Kucharz może za to przyjmować w konstruktorze obiekty Składaniki Pizzy oraz posiadać metodę makePizza() która zwraca Pizze.

Poćwicz sobie tworzenie systemów składających się z małych obiektów które rozwiązują tego typu problemy.

Bez tej umiejętności będziesz jak papuga która klepie bezmyślnie kod według koncepcji wymyślonych przez innych, których to koncepcji nawet nie rozumie, ale sam nie będziesz potrafił zaprojektować nawet prostego systemu...
  Forum: Object-oriented programming · Podgląd postu: #894251 · Odpowiedzi: 17 · Wyświetleń: 2 524

smentek
Napisane: 27.08.2011, 21:23:05





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Cytat
1. Głowne - czy ten kod jest zgodny z OOP ?


To czy jakiś obiekt ma sens, czyli czy powinien istnieć czy nie, nie wynika bezpośrednio z tego że program jest OOP tylko z dziedziny problemu który program rozwiązuje. Ale jeżeli hurtowo nazywasz swoje obiekty "manager" to coś może być nie tak. Zbyt ogólna nazwa sugeruje że obiekt robi zbyt wiele rzeczy lub że sam nie wiesz co ma robić.

Cytat
Czy metoda Logon() powinna być w klasie UserManager czy w osobnej np. Login


Moja propozycja: Olej całkowicie logowanie. Skup się na problemie który twój program ma rozwiązywać.

Cytat
tworzenie obiektu User a potem przekazywanie go do UserManager w celu obróbki itp jest prawidłowe ? Czy w klasie UserManager powinna być metoda tworząca obiekt User ? (to tyczy się również klas Character i CharacterManager)


Staramy się wstrzykiwać obiekty w inne obiekty a nie inicjalizować jedne w drugich. Oczywiście inicjalizacja musi gdzieś nastąpić. Także to że przekazujesz usera do innego obiektu jest ok, pytanie tyko czy wiesz do czego ma słuzyc manager?
  Forum: Object-oriented programming · Podgląd postu: #894136 · Odpowiedzi: 17 · Wyświetleń: 2 524

smentek
Napisane: 24.04.2011, 13:42:03





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Cytat(Jazi @ 24.04.2011, 14:35:33 ) *
Co znaczy "przy KAŻDYM request" ?


Przy każdym pobraniu z serwera strony przez użytkownika, który zainicjalizował wcześniej sesję i teraz wysyła jej identyfikator. Request = żądanie obsługi poprzez HTTP.
  Forum: PHP · Podgląd postu: #857987 · Odpowiedzi: 8 · Wyświetleń: 2 436

smentek
Napisane: 22.09.2010, 21:56:18





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Osobiście nie używam sfguard, to jest zbyt prosty system i nie nadaje się do bardziej zaawansowanych zastosowań w firmie mamy własny plugin także oparty o rbac ale z dodatkowymi ograniczeniami dostępu, cachowaniem, dostępem z panelu itd.

Myślę że w którejś z ebookow na http://www.symfony-project.org/doc/1_4/ na bank znajdziesz przyklady użycia sfguard + dokumentacja samego pluginu. Twoje pytania są zbyt obszerne aby sensownie na nie odpowiedzieć.
  Forum: Frameworki · Podgląd postu: #792117 · Odpowiedzi: 1 · Wyświetleń: 804

smentek
Napisane: 18.09.2010, 15:38:13





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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


Cytat
wiec co polecasz? jak sie tego obiektowego uczyc? robie tego jobeeta i poki co to raczej kapuje, wiec az tak zle nie jest


Jak mówił tata wielbłąd do małego wielbłądka, pracuj, pracuj a garb ci sam wyrośnie...

Nie potrzebujesz dużego pojęcia na temat programowania obiektowego aby zacząć programować w jakimkolwiek frameworku o ile ma on dobrą dokumentację a symfony ją ma.
  Forum: Frameworki · Podgląd postu: #790817 · Odpowiedzi: 5 · Wyświetleń: 1 239

smentek
Napisane: 3.05.2010, 20:45:14





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Inicjalizujesz sesję ale nie ustawiasz niczego pod identyfikatorem 'mySession'. Brakue Ci czegoś jak:

  1. $_SESSION['mySession'] = 'cokolwiek';


To chyba nie jest dział na tego typu pytania...
  Forum: PHP · Podgląd postu: #742769 · Odpowiedzi: 4 · Wyświetleń: 812

smentek
Napisane: 26.03.2010, 22:21:44





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Twój identyfikator musi składac się z 2 części które skonkatanujesz (złączysz) w jedno.
A wzór jest taki:

identyfikator = część unikalna + szum

Implementacja:

identyfikator = primary_key + md5( salt + primary_key )

gdzie:
salt = ciąg znaków (tajny) pobierany np. z pliku konfiguracyjnego systemu.
primary_key = autkoinkrementowany klucz (najlepiej primary key) tworzony automatycznie przez bazę podczas dodawania nowego rekordu
+ = znak konkatanacji

Wynika z tego że potrzebujesz 2 pingów do bazy jeden żeby stworzyć rekord i uzyskać nowy id (primary key)
drugi żey zpisac do bazy utworzyony identyfikator.

Można by to uprościc i primary_key zamienić na microtime(). Wtedy jednak bezpieczeństwo systemu wiążemy z zegarem systemowym.

Ale wszystko to teoria... Jeżeli strona jest dostępna publicznie to tego typu zabezpieczenie nie jest żadnym zabezpieczeniem. Jeżeli chcesz mieć zabezpieczone zasoby to dostęp musi być po zalogowaniu, dla konkretnych użytkowników.
  Forum: PHP · Podgląd postu: #729553 · Odpowiedzi: 9 · Wyświetleń: 2 050

smentek
Napisane: 23.12.2009, 01:33:57





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

Metoda unset() poszukaj w manualu phpa. Tylko dlaczego miałbyś usuwać indeksy tablicy? Wybierz to co cie interesuje a pustymi indeksami się nie przejmuj.
  Forum: PHP · Podgląd postu: #694240 · Odpowiedzi: 7 · Wyświetleń: 9 333

smentek
Napisane: 1.07.2009, 22:25:40





Grupa: Zarejestrowani
Postów: 130
Dołączył: 7.04.2003

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

1. W javascript nie ma czegos takiego jak klasa. To co w swoim programie nazywasz klasą, jest funkcją (która jest także obiektem). A co do zasłoniętej metody, proponuje przerobic kod na taką modłę:

  1. <?php
  2. var Pane = function(){ // <---Przy tym zapisie widac wyraznie, ze Pane to nie zadna klasa a obiekt :)
  3.    this.costam = 'xxx';
  4.    this.ooo = 'ababa';
  5.    this.close = function(){
  6.        alert('zamykam' + this.costam)
  7.    }
  8.    
  9.    
  10. };
  11.  
  12. var PaneLog = function(){
  13.    //Po odkomentowniu zmienna o wartości yyy 'wyjdzie na wierzch'
  14.    //this.costam = 'yyy';
  15.    this.close = function(){
  16.        alert('closing' + this.costam)
  17.  
  18.    }
  19. }
  20.  
  21.  
  22. var myPane = new Pane();
  23. myPane.close();
  24.  
  25. //wskaźnik this z obiektu PaneLog będzie od tego momentu wskazywac na obiekt Pane
  26. PaneLog.prototype = new Pane();
  27.  
  28. var myPaneLog = new PaneLog();
  29. myPaneLog.close();
  30. ?>


2. Co do drugiego błędu, zgaduje że w danym momencie pod zmienną this.jquery nie ma wartości która odnosiła by sie do obiektu
jQuery. Tak jak w przykładzie poniżej. W wiekszości przypadków używasz this.jquery do budowy selectora tak więc nigdy nie wygeneruje to błędów (co najwyżej elementy drzewa DOM nie zostaną znalezione).

  1. <?php
  2. $(document).ready(function(){
  3.    var smiec = 'bzdury';          // <-- łancuch znaków
  4.    var element = $('#usmiech2'); // <-- obiekt jQuery
  5.    
  6.    element.remove();
  7.    smiec.remove();
  8. });
  9. ?>


Fakt że this.jquery jest zmienną obiektu wydaje mi się złym rozwiązaniem. Obiekt powinien zawierać to co jest jego częścią składową this.jquery jest tu 'ciałem obcym' smile.gif

Musisz myśleć bardziej globalnie.
Programuj swoje obiekty tak jak by cała warstwa wizualna wogóle nie istniała zajmuj się nią na samym końcu. Np metoda do usunięcia czegos:

  1. <?php
  2. ... //jestsmy w obiekcie    
  3.    this.id; //Parametr id identyfikuje nam obiekt.
  4.    this.close = function(){
  5.        //Tutaj kod który usunie element + jakieś inne działania na innych obiektach z tym zwiazane
  6.  
  7.            ....
  8.  
  9.        //Wyrzucamy nasz element z drzewa DOM (przestaje byc widoczny)
  10.        $('#' + this.id).remove();
  11.  
  12. ... //i dalej nastepne metody obiektu
  13.    }
  14. ?>


Parametr this.id to praktycznie wszystko co jest potrzebne aby odnaleźć interesujący nas węzeł drzewa DOM i zmienić wygląd strony. Mając go możemy użyc jQuery czy innej biblioteki. aby zmienić ten fragment strony, który przedstawia nasz obiekt smile.gif.
  Forum: JavaScript · Podgląd postu: #628354 · Odpowiedzi: 1 · Wyświetleń: 2 114


New Posts  Nowe odpowiedzi
No New Posts  Brak nowych odpowiedzi
Hot topic  Popularny temat (Nowe)
No new  Popularny temat (Brak nowych)
Poll  Sonda (Nowe)
No new votes  Sonda (Brak nowych)
Closed  Zamknięty temat
Moved  Przeniesiony temat
 

RSS Wersja Lo-Fi Aktualny czas: 2.05.2024 - 21:13