Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jakie metody w klasie News - jak ma to współgrać?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Joachim Peters
Witam,

jestem po lekturze naprawdę wielu tematów na tym forum, w okręg moich zainteresowań weszła także książka "PHP5 Obiekty, wzorce, narzędzia".
Mimo to mam problem co do ułożenia odpowiedniej klasy. Moje problemy:

1. Czy w klasie np. do obsługi newsów powinna znajdować się metoda do wyświetlania konkretnego newsa/newsów jeżeli nie stosuje ścisłego MVC (chce napisać stronę zintegrowaną z innym skryptem od którego będę używał kilka klas i funkcji, m.in. do wyświetlania w przeglądarce html)? Jeżeli nie to powinienem zrobić dla niej osobną funkcję (bez klasy)?

2. Idąc dalej przykładem klasy do obsługi newsów chciałbym zapytać czy lepiej definiować ID newsa już w konstruktorze czy ustalać go manualnie przez metodę np. setId()?

3. Czy opłaca się stworzyć osobną metodę do dodawania elementów do tablicy z danymi newsa (np. addParam($key, $value)winksmiley.jpg, czy wyjdzie na to samo (w sensie obiektowym) przekazując pełną tablicę prosto do metody np. update()?

Poniżej zarys klasy:
  1. <?php
  2. class News {
  3. private $newsId  = 0;
  4. private $params = array();
  5.  
  6. public function setId($id) { } // Ustawia id newsa na którym chcemy operować
  7. public function submit() { } // Jeżeli newsId > 0 to aktualizuje, jeśli odwrotnie to tworzy nowy rekord
  8. private function insert() { }
  9. private function update() { }
  10. public function delete() { }
  11. public function addParam($key, $value) { } // Dodaje parametry typu nazwa newsa, autor, treść, źródło do tablicy danych
  12. public function print() { } // Wyświetla newsa, jeżeli ustaliliśmy Id do wyświetla wybrany news, jeżeli nie to
     wszystkie
  13. private function printSpecific() { } 
  14. private function printAll($perPage) { }
  15. }
  16. ?>


Jest tu sens OOP? Co zmienić aby było lepiej?

Pozdrawiam i z góry serdecznie dziękuje za wyjaśnienia!
LBO
Generalnie to zależy od ciebie, ale jeżeli obiekt News reprezentuję jednego newsa to nie widzę zastrzeżeń, żeby było to w konstruktorze - będzie bardziej czytelnie.

  1. <?php
  2. $news = new News($id); // wygląda przystępniej niż..
  3.  
  4. $news = news News();
  5. $news->setId($id); // .. to, praawda?
  6.  
  7. // Ewentualnie możesz postawić na czytelność metod...
  8.  
  9. $news = news News();
  10. $news->getById($id); // identyczne jak w drugim przykładzie, ale czytelniejsze.
  11.  
  12. // .. a nawet tak
  13.  
  14. $news_2 = News::getById(2); // metoda statyczna, zwraca obiekt News
  15.  
  16. // czy
  17.  
  18. $news = News::getAllByPage($page, $per_page); // zwraca tablicę obiektów News, które zostały wypełnione danymi zewnętrznie
  19. ?>


Możesz nawet stosować hybrydy, czyli jeżeli sam tworzysz News to $id w konstruktorze ( i tam wyciągasz dane z bazy), a jak chcesz kilka to tworzysz metodę, która zwraca tobie tablicę obiektów News (ale nie wywołujesz ich tam, przez $id w konstruktorze, tylko wyciągasz dane jednym zapytaniem w tej metodzie i "manualnie" te obiekty wypełniasz).
terabit
@LBO
takie pytanko winksmiley.jpg

czy jest jakas roznica miedzy

Cytat
$news = news News();
$news->getById($id); // identyczne jak w drugim przykładzie, ale czytelniejsze.


a tym
Cytat
$news_2 = News::getById(2); // metoda statyczna, zwraca obiekt News


czy po prostu jak kto woli winksmiley.jpg
LBO
Jest różnica, bo w metodach statycznych opakowujesz Managera. Kod jest bardziej przejrzysty jak dla mnie.
To są niewielkie różnice w wydajności, ale do tych operacji, które nie są związane z żadną konkretną instancją, lepiej zaprząc statyczną część klasy.
Sedziwoj
Ogólnie chyba
  1. <?php
  2. $news_2 = NewsPeer::getById(2);
  3. ?>
wykorzystanie DAO i AR ;] Czy jakoś tak to szło, mi się zawsze pojęcia mieszają.
Black-Berry
Po co te klasy statyczne? Mi się na przykąłd cały kod strony ze strukturą, kategoriami i jakimś tam menu generuje w 50ms. Dojdę moze do 100ms ale to i tak nic nie zmienia bo złożoność obliczeniowa zawsze będzie rzędu On czyli liniowa. Co one własciwie dają ? (w sensie wydajnościowym)
Sedziwoj
@Black-Berry
A co daje podejście obiektowe, przecież to też jest gorsze wydajnościowo niż strukturalny kod ;]
Zwiększa czytelność i elastyczność kodu, zasada że klasy i ich obiekty mają jedno konkretne zadanie, po to się rozbija na funkcjonalność. Klasa News ma się zając konkretną aktualnością, nie obchodzi jej skąd się wzięła, czy jest częścią większego zbiory.
LBO
Cytat(Sedziwoj @ 2.09.2008, 00:35:38 ) *
Ogólnie chyba
  1. <?php
  2. $news_2 = NewsPeer::getById(2);
  3. ?>
wykorzystanie DAO i AR ;] Czy jakoś tak to szło, mi się zawsze pojęcia mieszają.


Można i tak (Propel-way), ale czy przy tak niewielkim zastosowaniu trzeba rozbijać to na dwie klasy na tabelę?

Cytat(Black-Berry @ 2.09.2008, 00:45:47 ) *
Po co te klasy statyczne? Mi się na przykąłd cały kod strony ze strukturą, kategoriami i jakimś tam menu generuje w 50ms. Dojdę moze do 100ms ale to i tak nic nie zmienia bo złożoność obliczeniowa zawsze będzie rzędu On czyli liniowa. Co one własciwie dają ? (w sensie wydajnościowym)


Może nie dają nic, ale są bardziej czytelne? Po co tworzyć obiekt, skoro taki manager (jaki reprezentują metody statyczne) jest bezstanowy.
Sedziwoj
Cytat(LBO @ 2.09.2008, 01:28:26 ) *
Można i tak (Propel-way), ale czy przy tak niewielkim zastosowaniu trzeba rozbijać to na dwie klasy na tabelę?


To był przykład, jak masz metody pobierające np. najnowsze News'y losowe, czy jakiekolwiek zbiory, to umieszczasz to tam, masz w jednym miejscu wszystkie metody pobierania News'ów, dzięki temu, jak jest wymagana poprawka, zmiana funkcjonalności, masz jedno miejsce do edycji (albo dobry punkt zaczepienia, przy większych zmianach). Czyli taki Peer operuje ogólnie na News'ach, a obiekty klasy News na konkretnym elemencie, i tam masz metody np. do pobierania autora, czy co tam będzie potrzebne, przy operowaniu na konkretnej News'ie.

P.S. Hibernate ma jeszcze bardziej to rozbite.
Black-Berry
Cytat(Sedziwoj @ 2.09.2008, 01:17:20 ) *
@Black-Berry
A co daje podejście obiektowe, przecież to też jest gorsze wydajnościowo niż strukturalny kod ;]
Zwiększa czytelność i elastyczność kodu, zasada że klasy i ich obiekty mają jedno konkretne zadanie, po to się rozbija na funkcjonalność. Klasa News ma się zając konkretną aktualnością, nie obchodzi jej skąd się wzięła, czy jest częścią większego zbiory.
Chodziło mi o coś wręcz przeciwnego. Myślałem, że LBO pije do tego ze klasy statyczne są szybsze. Wogóle to mam mętlik straszny bo każdy mówi co innego: jedni ze singletny są złe, inni ze rejestry, jeszcze inni ze nie wolno używać globalsów... Pooli dochodze do wniosku że nikt ni ma racji, a liczy się tylko wygoda. Zresztą jak ma być 1 obiekt z danej klasy tylko to trzeba napisać to w komentarzach biggrin.gif A jak ktoś jest na tyle głupi żeby tworzyć 2 klasy dbDriver to już jego problem biggrin.gif Od dzisiaj tylko czyste obiekty bez żadnych udziwnień singletonami i klasami statycznymi stosuję... Od jutra bo dzis juz idę w kimę... sory za odejście od tematu biggrin.gif poprostu musiałem się wyżalić smile.gif Pozdrawiam wszystkich.
LBO
Heeh, ja to wiem. Pytam się czy takie rozbicie jest konieczne? Jak sam mówisz Hibernate ma jeszcze większy poziom decouple'ingu niż Propel - czy to znaczy, że Propel ma się stać jeszcze bardziej skomplikowany, bo trzeba naśladować Hibernate (abstrachując od związku z Torque biggrin.gif)?

Cytat(Black-Berry @ 2.09.2008, 01:46:13 ) *
/ciach/ Wogóle to mam mętlik straszny bo każdy mówi co innego: jedni ze singletny są złe, inni ze rejestry, jeszcze inni ze nie wolno używać globalsów...


Maja rację smile.gif

Cytat(Black-Berry @ 2.09.2008, 01:46:13 ) *
Pooli dochodze do wniosku że nikt ni ma racji, a liczy się tylko wygoda.


Też, ale nieraz ważniejszy jest porządek w kodzie. Można sobie nieźle nabruździć z takim czysto-praktycznym podejściem.

Cytat(Black-Berry @ 2.09.2008, 01:46:13 ) *
Zresztą jak ma być 1 obiekt z danej klasy tylko to trzeba napisać to w komentarzach biggrin.gif A jak ktoś jest na tyle głupi żeby tworzyć 2 klasy dbDriver to już jego problem biggrin.gif Od dzisiaj tylko czyste obiekty bez żadnych udziwnień singletonami i klasami statycznymi stosuję... Od jutra bo dzis juz idę w kimę... sory za odejście od tematu biggrin.gif poprostu musiałem się wyżalić smile.gif Pozdrawiam wszystkich.


Bo chyba nie do końca rozumiesz pojęcie Singletonu mam wrażenie. Singleton nie jest tożsamy z dokładnie jednym obiektem danej klasy.
Cysiaczek
Globalsów się nie używa... bo nie smile.gif
Singletona się używa ostrożnie - w uzasadnionych przypadkach (np. obiekt kontrolujący bazę danych)
Rejestru się używa i jest on dobrym wzorcem - trzeba mieć niepokolei w głowie, żeby twierdzić inaczej
Klasy statyczne stosuje się tam, gdzie trzeba (co już powiedzieli moim przedmówcy) i nie jest to żadne udziwnienie

Masz mętlik w głowie? Świetnie, powtarzaj mantrę "wszystko zależy od okoliczności, wszystko zależy od okoliczności, wszystko zależy od okoliczności" - codziennie przez godzinę biggrin.gif

Pozdrawiam.
Sedziwoj
Cytat(Cysiaczek @ 2.09.2008, 07:08:11 ) *
Globalsów się nie używa... bo nie smile.gif

Zgodzę się
Cytat
Singletona się używa ostrożnie - w uzasadnionych przypadkach (np. obiekt kontrolujący bazę danych)

Nie zgodzę się, a co jak chcesz mieć parę różnych połączeń w jednej chwili? Już miałem przyjemność z singletonem, więc musiałem napisać okropny kod, bo nie było czasu na przerobienie tej konstrukcji. (Propel jak wiesz pozwala na wiele połączeń, mimo że jak się używa jednego,to jest to nie zauważalne)
Cytat
Rejestru się używa i jest on dobrym wzorcem - trzeba mieć niepokolei w głowie, żeby twierdzić inaczej

Czy takim dobrym, to bym nie był pewien, ale na pewno lepszy niż Globals
Cytat
Masz mętlik w głowie? Świetnie, powtarzaj mantrę "wszystko zależy od okoliczności, wszystko zależy od okoliczności, wszystko zależy od okoliczności" - codziennie przez godzinę biggrin.gif

Tylko wątpię aby to pomogło ;]
@Black-Berry
Dwie rzeczy, doświadczenie (praktyka) z różnymi rozwiązaniami, powie Ci co jest lepsze. Bo to jest lepsze, co potem pozwala Ci szybciej i wygodniej pracować. Ponieważ te wszystkie rzeczy, OOP, Design Patterns itd. są po to, aby w przyszłości korzystanie z tak napisanych elementów było łatwo korzystać, i jak już trzeba coś dodać/zmienić, aby to była chwila.
Ale to nie jest tak, że jest jedno poprawne rozwiązanie, każdy programista ma swoje preferencje i stąd wynikają te różnice, ale do ogólnych spraw raczej większość jest zgodna.
Niestety, tylko doświadczenie w pisaniu i korzystaniu z różnych rozwiązań da Ci pewną pewność jak to rozwiązać... Więc czytaj, korzystaj, pisz i analizuj, jak się sprawują jakieś rozwiązania, próbuj różnych, ogólnie polecamy Propel, Synfony (może jeszcze parę) dla tego, że są przyzwoicie napisane, jak będziesz z nich korzystać, to zobaczysz że jest to wygodne i będziesz mógł podejrzeć jak inni to robią.
Black-Berry
@Sedziwoj Z tego co mówisz pośrednio wynika, że najlepiej przekazywać wszystko jawnie w konstruktorze bo moze się okazać, że chcesz np mieć osobne połaczenie z bazą dla przykładowego newsMenager'a. Idąc dalej tym tropem dobrze by było nie przekazywać za każdym razem 15 obiektów tylko już lepiej wrzucić wszystko do rejestru i przekazywać tylko jeden obiekt rejestru. Obiekt główny po którym dziedziczy każdy inny już sobie poustawia odpowiednie pola... Ale zauważ że w ten sposób tuszujesz tylko globalność niektórych obiektów.

No i moje dalsze rozumowanie: Po co tuszować? Nie lepiej w konstruktorze obiektu głównego i tylko w nim użyć słówka kluczowego global aby przypisać globalne obiekty do pól dziedziczących? Wtedy już nic nie musze przekazywać w konstruktorach, no i nie chowam śmieci pod dywan za pomocą rejestru smile.gif
Sedziwoj
Cytat(Black-Berry @ 2.09.2008, 11:24:36 ) *
No i moje dalsze rozumowanie: Po co tuszować? Nie lepiej w konstruktorze obiektu głównego i tylko w nim użyć słówka kluczowego global aby przypisać globalne obiekty do pól dziedziczących? Wtedy już nic nie musze przekazywać w konstruktorach, no i nie chowam śmieci pod dywan za pomocą rejestru smile.gif

W lesie masz rozrzucone kuleczki, teraz je znajdź trudne, co nie?
A wyobraź sobie że masz teraz do każdej przywiązaną nitkę, tak że zbiegają się wszystkie w Twoich dłoniach, o wiele łatwiej znaleźć?

Ogólnie zaplanowanie tak aplikacji, aby mieć zawsze dostęp do rzeczy potrzebnych w danym miejscu i nie robić tego na około, to jest trudne zagadnienie.
Cysiaczek
Dlaczego tak wszyscy nie lubią Registry? Przecież jest to wzorzec, który stosowany umiejętnie rozwiązuje np. problem BlackBerrego z 15 obiektami, które chce przekazać.
Inicjujesz rejestr, dodajesz do niego obiekty kojarząc je w kolekcje, potem tylko do konstruktora leci konkretna kolekcja - jako jeden parametr. Konstruktor sobie to rozpakowuje i voila!

Taki rejestr może kojarzyć obiekty na podstawie implementowanych interfejsów, co jest kolejnym przykładem ich zastosowania. Omijasz wówczas jawne przypisywanie do kolekcji.

Pozdrawiam.
Black-Berry
Cytat(Sedziwoj @ 2.09.2008, 11:38:34 ) *
W lesie masz rozrzucone kuleczki, teraz je znajdź trudne, co nie?
A wyobraź sobie że masz teraz do każdej przywiązaną nitkę, tak że zbiegają się wszystkie w Twoich dłoniach, o wiele łatwiej znaleźć?
Chyba mnie właśnie nawróciłeś biggrin.gif

Cytat
Inicjujesz rejestr, dodajesz do niego obiekty kojarząc je w kolekcje, potem tylko do konstruktora leci konkretna kolekcja - jako jeden parametr. Konstruktor sobie to rozpakowuje i voila!
Taki rejestr może kojarzyć obiekty na podstawie implementowanych interfejsów, co jest kolejnym przykładem ich zastosowania. Omijasz wówczas jawne przypisywanie do kolekcji.
Można prosić o jakiś manual do poczytania? O co chodzi z tymi kolekcjami? Chodzi tylko o grupowanie w logikę czy to ma też względy wydajnościowe jeśli nie przekazuję całego rejestru?
Sedziwoj
@Cysiaczek
Bo taki Registry, wydaje mi się niedaleko od wzorca Singleton ;]
Po prostu, jak nie wiem jak coś zrobić go wykorzystam...
Ale to jest jałowa dyskusja, bo wydaje mi się że na razie do kompromisu się nie dojdzie. Nie mówię że stosowanie Registry jest złe, po prostu mi się on bardzo nie podoba.
Black-Berry
Cytat(Sedziwoj @ 2.09.2008, 11:46:11 ) *
@Cysiaczek
Bo taki Registry, wydaje mi się niedaleko od wzorca Singleton ;]
Po prostu, jak nie wiem jak coś zrobić go wykorzystam...
Ale to jest jałowa dyskusja, bo wydaje mi się że na razie do kompromisu się nie dojdzie. Nie mówię że stosowanie Registry jest złe, po prostu mi się on bardzo nie podoba.
Co w takim razie robisz z obiektami globalnymi?
Sedziwoj
Cytat(Black-Berry @ 2.09.2008, 11:48:04 ) *
Co w takim razie robisz z obiektami globalnymi?


Jedna sprawa to skorzystać z np. generatora miniaturek, który po prostu ma zrobić swoje, a inna sprawa to korzystanie z dostępu do np. bazy danych które gdzieś jest inicjalizowane, czy danych z GET/POST/itd. które mają być dostępne w akcjach. Po prostu większość rzeczy da się przekazać do obiektu w jakiś inny sposób, np. wykorzystując warstwę abstrakcji, Registry jest o tyle brzydki że trzeba wiedzieć co w nim jest.
Cysiaczek
Cytat
Registry jest o tyle brzydki że trzeba wiedzieć co w nim jest.

@sedziwoj - Tak? To patrz aaevil.gif

Wybaczcie niedoróbki, ale to tylko mała prezentacja oparta o proste tablice.

  1. <?php
  2. interface Basic{}
  3. interface Advanced{}
  4.  
  5. class Config{}
  6. class fwConfig extends Config implements Basic{}
  7. class appConfig extends Config implements Basic{}
  8. class moduleConfig extends Config implements Advanced{}
  9.  
  10.  
  11. class Registry
  12. {
  13. static public $interfaces=array('Basic', 'Advanced'); // najlepiej zautomotyzować
  14. static public $collection=array();
  15.  
  16.  
  17. static public function add($obj)
  18. {
  19. foreach(class_implements($obj) as $iface)
  20. {
  21. if(in_array($iface, self::$interfaces))
  22. {
  23. self::$collection[$iface][get_class($obj)]=$obj;
  24. }
  25. }
  26. }
  27.  
  28. static public function getFor($obj)
  29. {
  30. $data=array();
  31. foreach(class_implements($obj) as $iface)
  32. {
  33. if(in_array($iface, self::$interfaces) && is_array(self::$collection[$iface]))
  34. {
  35. $data=array_merge($data, self::$collection[$iface]);
  36. }
  37. }
  38. return $data;
  39. }
  40.  
  41. public static function getBasicCollection()
  42. {
  43. return self::$collection['Basic'];
  44. }
  45.  
  46. public static function getAdvancedCollection()
  47. {
  48. return self::$collection['Advanced'];
  49. }
  50.  
  51. public static function getAll()
  52. {
  53. return self::$collection;
  54. }
  55. }
  56.  
  57. class News implements Basic,Advanced
  58. {
  59. public function __construct()
  60. {
  61. extract(Registry::getFor($this));
  62. print_r($fwConfig);
  63. }
  64. }
  65.  
  66. $f=new fwConfig();
  67. $a=new appConfig();
  68. $m=new moduleConfig();
  69.  
  70. print '<pre>';
  71. Registry::add($f);
  72. Registry::add($a);
  73. Registry::add($m);
  74. $obj=new News();
  75. print '</pre>';
  76. ?>


@BlackBerry - Proszę, Twoje globale smile.gif

Pozdrawiam
LBO
Cytat(Cysiaczek @ 2.09.2008, 12:35:59 ) *
/ciach/


Ja nadal uważam, że Rejestr nie jest najlepszym pomysłem i można się zawsze bez Niego Obejść. Natura programowania obiektowego jest enkapsulacja, a co za tym idzie mądre zarządzanie udostępnianiem ukrytych danych.
Bardzo łatwo można tak zaprojektować system/framework żeby ukrywał specyficzne dane i udostępniał tam gdzie potrzeba.

Fakt do samego konfigu jako klasa statyczna jak najbardziej jestem za, ale jak zauważyłem duża część programistów umieszcza w Rejestrze absolutnie wszystko - od danych konfiguracyjnych po jakieś specyficzne obiekty z logiką, która nie jest potrzebna w każdej części systemu. To świadczy o złej naturze Rejestru.

edit: ucięło mi część tekstu przez moją nieuwagę.
Black-Berry
Cytat(Cysiaczek @ 2.09.2008, 12:35:59 ) *
<?php
 (..)
?>
@.@ śliczne... Nie będę może polemizował bo jedyne co mi się nasuwa to że to cholernie skąplikowane a jedno słówko kluczowe global robi to samo. Ale masz 3,5k postów i śliczną konstrukcję rejestru więc pewnie się na tym znasz lepiej. Jak sobie przemyślę głębiej to pogadamy biggrin.gif
Sedziwoj
Cytat(Black-Berry @ 2.09.2008, 13:16:38 ) *
@.@ śliczne... Nie będę może polemizował bo jedyne co mi się nasuwa to że to cholernie skąplikowane a jedno słówko kluczowe global robi to samo. Ale masz 3,5k postów i śliczną konstrukcję rejestru więc pewnie się na tym znasz lepiej. Jak sobie przemyślę głębiej to pogadamy biggrin.gif


Zwróć uwagę na użycie, nie klasę, bo klasę masz raz napisaną, a potem ją używasz.
Pomijam fakt że nadal uważam to za coś co mi się nie podoba, ale nie chce mi się wnikać chwilowo w argumenty, LBO jak widzę sobie nieźle radzi biggrin.gif
Black-Berry
@Cysiaczek A tak z ciekawości to czy problem Sedziwoj'a o potrzebie 2 połaczeń z bazą byłby możliwy do rozwiązania w przypadku zastosowania Twojej konstrukcji rejestru? Np tak:

  1. <?php
  2. $dbDriver2 = new Db_Driver();
  3. $obj = new News();
  4. $obj->setDbDriver($dbDriver2);
  5. ?>

Zakładam że defaultowy dbDriver jest dodany wcześniej już do rejestru i chce go teraz podmienić.
LBO
W takim przypadku jestem za Zendowym rozwiązaniem
  1. <?php
  2. Db_Driver::setDefaultDriver($dbDriver);
  3. ?>

i można się obyć bez rejestru. Chociaż to też przypadek ekstremalny i można to rozwiązać dużo zgrabniej.
W prawdziwych systemach jest manager bazy danych - która trzyma identyfikowalną konfiguracje do rożnych połączeń i łączy się wtedy, kiedy potrzebuje (lazy load).
Przyzwyczaiłem się, że różne części frameworka są bardzo autonomiczne i zazwyczaj potrzeba tylko konfig a cała magia dzieje się pod powierzchnią. Jest to zarazem wygodne i śliczne rozwiązanie.
Black-Berry
Chcesz zob aczyć coś magicznie ślicznego?smile.gif To patrz na moje 'zgrabne' rozwiązanie. Prosze się nie śmiać wstydnis.gif

  1. <?php
  2. abstract class Main_Object
  3. {
  4. protected $settings;
  5. protected $language;
  6. protected $dbDriver;
  7. protected $session;
  8. protected $userGroup;
  9. protected $log;
  10. protected $userGroupManager;
  11. protected $structureManager;
  12. protected $rootManager;
  13. protected $nodeManager;
  14.  
  15. protected function __construct()
  16. {
  17. global $userGroupManager;
  18. $this->userGroup = $userGroupManager;
  19. global $mainSettings;
  20. $this->settings = $mainSettings;
  21. global $languageManager;
  22. $this->language = $languageManager;
  23. global $dbDriver;
  24. $this->dbDriver = $dbDriver;
  25. global $mainSession;
  26. $this->session = $mainSession;
  27. global $mainLog;
  28. $this->log = $mainLog;
  29. global $userGroupManager;
  30. $this->userGroupManager = $userGroupManager;
  31. global $structureManager;
  32. $this->structureManager = $structureManager;
  33. global $rootManager;
  34. $this->rootManager = $rootManager;
  35. global $nodeManager;
  36. $this->nodeManager = $nodeManager;
  37. }
  38. }
  39. ?>

This is magic baby czarodziej.gif
LBO
o_O mój boże

Zrób z tego obiekt kontekstu. Umieść gdzieś w systemie i udostępniaj gdzie potrzeba:

  1. <?php
  2. $this->context->getDatabaseManager->getConntection('nazwa_polaczenia');
  3. $this->context->getSessionMager->write($dane);
  4. ?>


To jest Magia... smile.gif
Black-Berry
A czy taki obiekt kontekstu przekazywany do kazdego konstruktora to nie to samo co rejestr na który tak narzekałeś ? worriedsmiley.gif
LBO
Nie bo w pełni kontroluję gdzie on jest dostępny.
Black-Berry
No to teraz już coś rozumiem... Ale w całym frameworku jest tylko jeden obiekt kontekstu? czy są rózne grupy tak jak w przykładzie Cysiaczka ?
LBO
Hmmm... jeden i tylko jeden. Cały myk w tym, że różnice powinny zależeć od Ciebie. Czyli nie ustawiaj tych wszystkich Managerów z globali - ostatnio modne jest tzw dependency injection, czyli (przykład):
  1. <?php
  2. class Main_Object {
  3.  
  4.  protected $dbDriver;
  5.  
  6.  public function setDbDriver(dbDriver $dbDriver)
  7.  {
  8.  $this->dbDriver = $dbDriver;
  9.  }
  10.  
  11.  public function getDbDriver()
  12.  {
  13.  return $this->dbDriver;
  14.  }
  15.  
  16. }
  17. ?>


Dostrzegasz jak dużą kontrolę zyskujesz dzięki temu
Black-Berry
@LBO: Dostrzegam smile.gif Powiedz mi jeszcze po co Ci są potrzebne klasy statyczne skoro mogłaby teoretycznie istnieć potrzeba dublowane nawet settingsów.
LBO
A kiedy dublujesz settingsy? Powiem Tobie - kiedy masz np. różne środowiska (produkcyjne, developerskie,w_domu_do_podgladania). Ale generalnie używasz tylko Tych, które są w tym momencie potrzebne (czyli na dane środowisko). Czy konkludując: sobie je sam ustawiasz dla środowiska, tylko te które potrzebujesz. I niby jest dublowane, ale jednak nie. Bo nie wszystkiego potrzebujesz. Architektura oprogramowania właśnie na tym polega, żebyś umiał rozgraniczyć i dobrze takie coś zaprojektować.

A klasy statyczne - są przydatne np. jako zastępnik funkcji np.
  1. <?php
  2. // to jest czysto abstrakcyjny przykład, nie sugeruj się tym
  3. class HtmlTools
  4. {
  5.  public static function escape($text)
  6. {
  7.  // htmlspecialchars() the output
  8. }
  9.  
  10. public static function link($url, $text, $alt)
  11. {
  12. // generate HTML link
  13. }
  14. }
  15. ?>


Są przydatne kiedy potrzebujesz czegoś bezstanowego. To, że możesz zrobić z klasy statycznej cos co przypomina pełnoprawny obiekt (używając atrybutów statycznych etc) nie znaczy, że to musisz robić.
W Pythonie chyba można dynamicznie zmieniać definicje klas, prawda? Ale czy to znaczy, że trzeba tego uzywać, skoro to jest gwarantem śmietnika w kodzie?
Black-Berry
@LBO wszystko super. Metoda Cysiaczka trochę przestaje do mnei przemawiać. Kontekst wydaje się być bardziej odpowiedni. No chyba że tak zaawansowany rejestr to już wyższa szkoła jazdy i nadaje się do systemów operacyjnych, a na poziomie CMS-ów i frameworków kontekst sprawia wrażenie przyjaźniejszego. Co do klas statycznych to nie wiem, funkcje też są fajne ale faktycznie czasem dobrze byłoby je w coś opakować. Takie opakowane funkcje też sie przekazuje kontekstem tak ?
LBO
Cytat(Black-Berry @ 2.09.2008, 22:20:52 ) *
@LBO wszystko super. Metoda Cysiaczka trochę przestaje do mnei przemawiać. Kontekst wydaje się być bardziej odpowiedni. No chyba że tak zaawansowany rejestr to już wyższa szkoła jazdy i nadaje się do systemów operacyjnych, a na poziomie CMS-ów i frameworków kontekst sprawia wrażenie przyjaźniejszego. Co do klas statycznych to nie wiem, funkcje też są fajne ale faktycznie czasem dobrze byłoby je w coś opakować. Takie opakowane funkcje też sie przekazuje kontekstem tak ?

Z wykorzystaniem klas statycznych to był tylko luźny przykład - to jest moje zastosowanie.
Pamiętaj jesteś programistą i sam o wszystkim decydujesz - złotego środka nikt nie poda Tobie na tacy.

A takie opakowane funkcje przekazuje się includem albo autoloaderem smile.gif podstawy biggrin.gif
Cysiaczek
To, co pokazałem, to pewna wariacja, a nie sprawdzony sposób smile.gif
Od Rejestru do Kontekstu jest niedaleko. W zasadzie można powiedzieć, że oba są Rejestrami, albo oba są Kontekstami. Granica jest płynna. To samo uzyskasz umiejętnie rozprowadzając Singletona po systemie - wówczas on również jest kontekstem.

Aha. Ilość postów nie jest wyznacznikiem posiadanej wiedzy graduated.gif. Cały postęp polega na kwestionowaniu tzw. autorytetów

Pozdrawiam.
Black-Berry
Dzięki za rady:) Wezmę je pod uwagę przy pisaniu następnej wersji swojego systemu b teraz to juz na wszystko za późno smile.gif
LBO
Cytat(Cysiaczek @ 2.09.2008, 22:28:13 ) *
Aha. Ilość postów nie jest wyznacznikiem posiadanej wiedzy graduated.gif. Cały postęp polega na kwestionowaniu tzw. autorytetów


OT:
Czy ja wiem, właśnie osiągnąłem 4 cyferki i byłoby mi na rękę gdyby jednak tak biggrin.gif heheh

Pozdrawiam, Alan
Sedziwoj
Cytat(Cysiaczek @ 2.09.2008, 22:28:13 ) *
To, co pokazałem, to pewna wariacja, a nie sprawdzony sposób smile.gif
Od Rejestru do Kontekstu jest niedaleko. W zasadzie można powiedzieć, że oba są Rejestrami, albo oba są Kontekstami. Granica jest płynna. To samo uzyskasz umiejętnie rozprowadzając Singletona po systemie - wówczas on również jest kontekstem.

Prawie robi wielką różnicę ;]
Nie zauważyłeś ważnej różnicy, a mianowicie wyszczególnienia elementów i możliwości ograniczenia co jest dostępne w danym miejscu.

P.S. OT to ja wypadam marnie w ilości ;(
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.