Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V  < 1 2  
Reply to this topicStart new topic
> Controller - co lepsze?, getInstance(), czy przekazywanie obiektom...
splatch
post 3.07.2006, 19:54:12
Post #21





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Ej, panowie, ale chyba znacie definicje Front Controllera prawda? Odpowiedzialność ciążąca na akcji powinna się sprowadzać tylko do wykonania pewnej operacji, cytując Fowlera:
Cytat("Patterns of Enterprise Application Architecture")
In a complex Web site there are many similar things you need to do when handling a request. These things include security, internationalization, and providing particular views for certain users. If the input controller behavior is scattered across multiple objects, much of this behavior can end up duplicated. Also, it's difficult to change behavior at runtime.

The Front Controller consolidates all request handling by channeling requests through a single handler object. This object can carry out common behavior, which can be modified at runtime with decorators. The handler then dispatches to command objects for behavior particular to a request.


Padły tu tez jakies zdania o IoC, w Springu, który korzysta w pełni z IoC jest element, który pełni funkcję front controllera - jest nim DispatcherServlet (pakiet spring.web.servlet).

Ten post edytował splatch 4.07.2006, 07:24:03


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Prph
post 4.07.2006, 01:31:37
Post #22





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

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


Cytat(NuLL @ 3.07.2006, 16:52 ) *
Bo wg mnie sztuka dla sztuki ( absurdem ) jest przekazywanie kotrolera z kontekstem do kazdej klasy withstupidsmiley.gif

Nie przekazuje go. Ale jezeli akcja go potrzebuje, to bierze go sobie poprzez Controller::getInstance();

Kontekst trzymam w kontrolerze, bo kontroler traktuje jak OTOCZKE aplikacji. I ta OTOCZKA ma kazdemu pozwolic wziac sobie co zechce. Jezeli potrzebuje parametru GET, niech poprosi o kontekst, a ten juz posiada HttpRequest.

Oczywiscie mozna zrobic Kontekst osobna klasa. Ale wtedy znowu byloby Context::getInstance->getRequest()...

Jak juz ktos powiedzial - ile osob, tyle roznych pomyslow. A ten pomysl nie jest akurat w pelni moj. Tak bylo bodajze w Mojavi, a i z Phienda2 cos zaczerpnalem.

Adrian.
Go to the top of the page
+Quote Post
Bora
post 5.07.2006, 00:46:42
Post #23





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

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


Może warto zastosować tutaj rozwiązanie z javy? Np inversion of control (injection)
Kod
[Class1]
dep=Class2,Class4
singleton=true
[Class2]
singleton=true
[Class3]
singleton=true
[Class4]
singleton=true


Kod:
  1. <?php
  2. function getmicrotime(){
  3.  list($usec, $sec) = explode(" ",microtime());
  4.  return ((float)$usec + (float)$sec);
  5. }
  6. function dump($val){
  7. /*
  8. echo '<pre>';
  9. var_dump($val);
  10. echo '</pre>';
  11. */
  12. }
  13. function endTime($startTime){
  14. return getmicrotime() - $startTime;
  15. }
  16.  
  17. class Manager{
  18. protected $config = NULL;
  19. protected $contener = array();
  20. public function __construct(){
  21. $this->config = parse_ini_file("config.ini", true);
  22. }
  23. public function create($name){
  24. if(isset($this->contener[$name])){
  25. return $this->contener;
  26. }
  27. if(!isset($this->config[$name])){
  28. throw new ClassNotExistException($name);
  29. }
  30. $class = new $name();
  31. if(isset($this->config[$name]['dep'])){
  32. $deps = explode(',', $this->config[$name]['dep']);
  33. foreach($deps as $dep){
  34. $method = 'set'.$dep;
  35. $class->$method($this->create($dep));
  36. }
  37. }
  38. if(!empty($this->config[$name]['singleton'])){
  39. $this->contener[$name] = $class;
  40. }
  41. return $class;
  42. }
  43. }
  44.  
  45. class Class1{
  46. private $c2 = NULL;
  47. private $c4 = NULL;
  48. public function setClass2($c2){
  49. $this->c2 = $c2;
  50. }
  51. public function setClass4($c4){
  52. $this->c4 = $c4;
  53. }
  54. private static $_instance ; 
  55. public static function GetInstance() { 
  56. if (!isset(self::$_instance)){ 
  57. self::$_instance = new Class1() ; 
  58. } 
  59. return self::$_instance; 
  60. }
  61. }
  62. class Class2{
  63. private static $_instance ; 
  64. public static function GetInstance() { 
  65. if (!isset(self::$_instance)){ 
  66. self::$_instance = new Class2() ; 
  67. } 
  68. return self::$_instance; 
  69. }
  70. }
  71. class Class3{
  72. private static $_instance ; 
  73. public static function GetInstance() { 
  74. if (!isset(self::$_instance)){ 
  75. self::$_instance = new Class3() ; 
  76. } 
  77. return self::$_instance; 
  78. }
  79. }
  80. class Class4{
  81. private static $_instance ; 
  82. public static function GetInstance() { 
  83. if (!isset(self::$_instance)){ 
  84. self::$_instance = new Class4() ; 
  85. } 
  86. return self::$_instance; 
  87. }
  88. }
  89. class ClassNotExistException extends Exception{};
  90. $startTime = getmicrotime();
  91. $manager = new Manager();
  92. for ($i = 0; $i < 100; $i++) {
  93. try{
  94. dump($manager->create('Class2'));
  95. dump($manager->create('Class4'));
  96. dump($manager->create('Class1'));
  97. }catch(ClassNotExistException $e){
  98. dump($e->getMessage());
  99. }
  100. }
  101. echo "Czas:".endTime($startTime).' (menager)<br/>';
  102.  
  103. $startTime = getmicrotime();
  104. for ($i = 0; $i < 100; $i++) {
  105. $c2 = new Class2();
  106. $c4 = new Class4();
  107. $c1 = new Class1();
  108. $c1->setClass2($c2);
  109. $c1->setClass4($c4);
  110. dump($c2);
  111. dump($c4);
  112. dump($c1);
  113. }
  114. echo "Czas:".endTime($startTime).' (single)<br/>';
  115.  
  116. $startTime = getmicrotime();
  117. for ($i = 0; $i < 100; $i++) {
  118. $s2 = Class2::GetInstance();
  119. $s4 = Class4::GetInstance();
  120. $s1 = Class1::GetInstance();
  121. $c1->setClass2($c2);
  122. $c1->setClass4($c4);
  123. dump($c2);
  124. dump($c4);
  125. dump($c1);
  126. }
  127. echo "Czas:".endTime($startTime).' (instance)<br/>';
  128. ?>


Co ciekawe działa podobnie szybko jak za każdym razem używać jawnie wywołania instancji, jedynie troszke dłużej trwa wczytywanie ini.

Czasy u mnie na lh:
Czas:0.0023281574249268 (menager)
Czas:0.0016329288482666 (single)
Czas:0.0024371147155762 (instance)


W javie (spring) działa to pięknie ale php z racji tworzenia od 0 za każdym wywołaniem czasami może warto poprostu nie przekombinować i tak wyszukane rozwiązania zostawić w spokoju.
Nie korzystałem z tego jeszcze w żadnym projekcie bo ostatnio nie robie wiele w php i stworzyłe tylko z ciakawości czy sie wogóle uda.

Ten post edytował Bora 5.07.2006, 00:59:55
Go to the top of the page
+Quote Post
Ludvik
post 5.07.2006, 08:44:07
Post #24





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Hm... muszę przynać, że ciekawie to wygląda i nawet narzut czasowy jest do zaakceptowania. Sam będę musiał przemyśleć zastosowanie czegoś takiego u siebie.


--------------------
Go to the top of the page
+Quote Post
Sh4dow
post 6.07.2006, 11:17:08
Post #25





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


Moim zdaniem wszystko zalezy od konstrukcji aplikacji. Jesli chodzi o jakies schematy obiektow ktore beda odpalane, czyli obiekty maja takie same nazwy metod to mozna przekazywac. Ale ogolnie ja sie przykladam do przekazywania instancji. I mozna to robic w roznoraki sposob. Albo poprzez Magazyn albo przez singletone. Ja uzywam singletone. Jest to o tyle wygodne ze jesli chce przekazac instancje obiektu w parametrze, to musze miec ja juz wywolana.
Jesli nie stworzylem obiektu jakies klasy bo nie była potrzebna wczesniej, to musze stworzyc obiekt tylko po to zeby go przekazac. Wiec po co ? skoro w metodzie ktora wymaga obiektu moge odwolas sie do getInstance() i juz mam. Sadze ze jest to wygodniejsze. Przy jakichkolwiek zmienach nie musze pamietac o tym ze wymagam jakiegos obiektu w atrybucie.
Przy okazji, jesli mam grupe roznych modeli, i potrzebuje pobrac 3 modele do akcji, to bedziesz je przekazywac w atrybutach ? Dziwnie by to wygladało.


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
Cysiaczek
post 6.07.2006, 14:34:51
Post #26





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Ale czy w tym wypdku o którym mówisz Sh4dow, to nie może się zdazyć tak, że jeśli będziesz miał dwie klasy (potrzebujące tego samego obiektu) z metodami getInstance(), to każda powoła do życia obiekty tego samego typu, ale różne?


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
bigZbig
post 6.07.2006, 14:42:44
Post #27





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


@Cysiaczek - jesli to jet klasa Singleton (poprawnie zaimplementowana) to w ramach jednego wywolania nie ma szansy na powolanie do zycia wiecej niz jednej jej instancji.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
Cysiaczek
post 6.07.2006, 14:47:43
Post #28





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Tak. Zdaję sobie z tego sprawę - mimo to zastanawiam się nad samym mechanizmem jawnego wywołania instancji w ciele klasy. przy singletonie jest ok, ale gdzie indziej? Po prostu pytam.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
bigZbig
post 6.07.2006, 14:55:33
Post #29





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Ale w czym problem? Zalezy od ciebie czy przekazesz obiekt do klasy czy wywolasz go wewnatrz niej. Wzorzec budowniczego np. zaklada z definicji tworzenie instancji wewnatrz klasy bo klasy te maja wlasnie takie przeznaczenie.

Klopot z wywolywaniem Singeltona wewnatrz klasy polega na tym ze wywolujesz konkretna klase. Nie jej rozszerzenie np, ale wlasnie te klase. No chyba, ze przekazujesz do swojej klasy nazwe klasy bedacej singletonem, ale to juz chyba lepeiej przekazac obiekt.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
Cysiaczek
post 6.07.2006, 15:07:49
Post #30





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




Aha. Własnie do tego zmierzałem - po co "psuć" klasę trzymając tam nazwę innej klasy. Lepiej chyba od razu przekazać obiekt. Zastanawia mnie jeszcze coś takiego.

  1. <?php
  2. class somethingCool{
  3. .../
  4. private $_classMagicBox; //array
  5.  
  6. public function assignClassName($className){}
  7.  
  8. private function getInstance(){}
  9.  
  10. .../
  11.  
  12. }
  13. ?>



Czy to byłoby dobre do wywołania/utrzymywania potrzebnych pierdół?


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
splatch
post 6.07.2006, 18:15:53
Post #31





Grupa: Zarejestrowani
Postów: 487
Pomógł: 7
Dołączył: 7.01.2004
Skąd: Warszawa

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


Singleton jest zły. Dlaczego? Jest to niemalże to samo co global. Singleton jest po to by mieć 1 instancje a nie po to by nie przekazywać obiektów!
Inversion of Controll idzie dalej, zapewnia obsługę obiektów. Kontener IoC możę się zachowywać jak fabryka i wypluwać kolejne instancje albo trzymać tylko 1 instancje. Dostęp do usług (np połączenia z bazą) jest tylko w tych miejscach, gdzie przekazaliśmy instancję kontenera.


--------------------
Łukasz Dywicki
Independent Java and open source software consultant.
Blog - Java, OSGi, integracja oprogramowania..
Go to the top of the page
+Quote Post
Bora
post 6.07.2006, 19:36:24
Post #32





Grupa: Zarejestrowani
Postów: 270
Pomógł: 0
Dołączył: 15.06.2003

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


podejrzewam że IoC może sie nie podobać osobom które mają np pare klass obsługujących cały kod. Np klassa User powinna mieć dostęp do obketku Groups ale jeśli ktoś trzymałby w tej klasie dodatkowo tworzenie miniaturki usera, zarządznaie wiadomościami i jeszcze coś wówczas rzeczywiście może być sporo niepotrzebnych stworzonych obiektów. W javie lazy-init pomaga gdzie obiekt jest tworzony dopiero gdy jest potrzebny.

Cytat
Przy jakichkolwiek zmienach nie musze pamietac o tym ze wymagam jakiegos obiektu w atrybucie.

Takie rzeczy powinny wyjść w testach.

Tak jak pisze Splatch IoC zapewnia większe bezpieczeństwo, kodu. Pozatym klassy są mniej z sobą powiązane przez co w przyszłości prościej można je wykorzystać w innym projekcie.

Ten post edytował Bora 6.07.2006, 19:40:40
Go to the top of the page
+Quote Post

2 Stron V  < 1 2
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 9.05.2024 - 18:10