Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Koncepcja budowania zależności
Forum PHP.pl > Forum > PHP > Object-oriented programming
rollen
Problem:
Jest sobie pewien serwis...
W serwisie w zależności od konfiguracji(rodzaj abonamentu...) danemu użytkownikowi udostępnia się odpowiednie moduły, tudzież podmoduły, ewntualnie pewne opcje w tych modułach, czy podmodułach.
Chodzi o to, żeby na podstawie danej konfiguracji dla użytkownika tak budować fragmenty serwisu, aby były dowolnie rozszeżalne poprzez włączenie/wyłączenie modułów tudzież podmodułów.

Dosyć dużo się nagłówkowałem nad jakimkolwiek rozwiązaniem problemu i chciałbym go choć schematycznie przedstawić i poznać wasze opinie na temat samej idei rozwiązania.
Podkreślam, że jest to pierwszy szkic i chciałbym się głównie skupić na samej idei, na możliwościach rozwiązania, jak i na jego słabych stronach.

A tutaj troszku kodu:

  1.  
  2. class Test {
  3.  
  4.  
  5. protected static $config = array(
  6. 'Module',
  7. 'Module\Asd'
  8. );
  9.  
  10. protected $dependencies = array();
  11.  
  12. public function __construct() {
  13. foreach (self::$config as $namespace) {
  14.  
  15. $class = $namespace . '\\' . __CLASS__;
  16.  
  17. if (class_exists($class)) {
  18. $this->dependencies[$class] = new $class;
  19. }
  20. }
  21. }
  22.  
  23. public function __get($name) {
  24.  
  25. $dep_obj = array();
  26.  
  27. if(!method_exists($this, $name)){
  28. throw new Exception('Dependency stack does not exists!');
  29. }
  30.  
  31. $result = $this->$name();
  32.  
  33. if(! ($result instanceof Closure)) {
  34. throw new Exception('Dependency function must return Closure. '. ucfirst(gettype($result)));
  35. }
  36.  
  37. foreach($this->dependencies as $obj) {
  38. if(method_exists($obj, $name)){
  39. $result = $obj->$name($result);
  40. if(! ($result instanceof Closure)) {
  41. throw new Exception('Dependency function must return Closure. '. ucfirst(gettype($result)));
  42. }
  43. }
  44. }
  45.  
  46. return $result;
  47. }
  48.  
  49. public function find($opt){
  50.  
  51. $find_query = $this->find_query;
  52.  
  53. var_dump($find_query);
  54.  
  55. $res = $find_query($opt);
  56.  
  57. echo 'wyniko: ';
  58. var_dump($res);
  59.  
  60. }
  61.  
  62. public function find_query(){
  63.  
  64. return function($opt) {
  65.  
  66. echo __CLASS__. ' - '. $opt . '<br />';
  67.  
  68. return 'hell';
  69. };
  70. }
  71.  
  72.  
  73. }
  74.  


  1.  
  2. namespace Module;
  3.  
  4. class Test {
  5.  
  6.  
  7. public function find_query(\Closure $c){
  8.  
  9. return function($opt) use ($c){
  10.  
  11. echo __CLASS__ . ' - ' . $opt . '<br />';
  12.  
  13. return $c($opt) . 'mama';
  14. };
  15. }
  16.  
  17. }
  18.  


  1.  
  2.  
  3. namespace Module\Asd;
  4.  
  5. class Test {
  6.  
  7. }
  8.  


index.php

  1.  
  2. spl_autoload_register();
  3.  
  4. $test = new Test();
  5.  
  6. $test->find(10);
  7.  


To nikt nie ma nic do powiedzenia? Trochę martwe to forum...
everth
Nikomu nie chce się tego wyobrażać - załącz diagram klas i dopiero wtedy narzekaj.
rollen
Cytat(everth @ 28.06.2011, 23:18:25 ) *
Nikomu nie chce się tego wyobrażać - załącz diagram klas i dopiero wtedy narzekaj.


Panie...
Po pierwsze: Podając link do Diagramu class obraziłeś mnie.
Po drugie: Nie narzekam, tylko stwierdzam.
Po trzecie: Forum jest martwe dlatego, że:
Cytat(everth @ 28.06.2011, 23:18:25 ) *
Nikomu nie chce się tego wyobrażać


Rid
Jeśli sądzi Pan że te forum jest martwe to jest Pan w największym błędzie ,ja oprócz tego forum jestem jeszcze na kilku innych forach programistycznych i mogę stwierdzić ,że te oto jest najaktywniejsze.
Cytat
A tutaj troszku kodu:
-i co?questionmark.gifŻąda Pan -konkretnej odpowiedzi po tym kawałku kodu-a nawet nie zadał Pan konkretnego pytania na nurtujący Pana problem.
rollen
Nie żądam odpowiedzi na żadne konkretne pytanie. Do odpowiedzi na konkretne pytania służą narzędzia typu Google, PHP manual, Standatdy W3C, etc.

To czego oczekuję to szerokie spojrzenie na problem, który opisałem szczegółowo. "Wyobrażenia sobie" jak działa ten kod, ewentualnie próby przetestowania.

Rozumiem, że ludzie nie mają czasu. Nie chce im się. Dlatego, jeżeli pisząc, że forum jest martwe kogoś uraziłem przepraszam.







Po dłuższym namyśle stwierdzam, że sam bym się starał zbyć kolesia, który zapodaje mi 4 linijki kodu i mówi "Stary! Zobacz jakie to ma możliwości".
Tak jest z kodem, że czasem przyjdzie do głowy. Wystukasz go. Przetestujesz sobie raz, drugi.... i bez dystansu do tego co właśnie wypłodziłeś chcesz nieść światu dobrą nowinę... Ale jesteś tylko programistą. Czujesz się jak Mojżesz, ale nie ma przy tobie Aarona, który mówiłby za Ciebie.

Więc jeżeli pozwolicie zacznę od początku:

Temat: Koncepcja budowania zależności teraz bym przerobił na Dekorowanie.

I nie ma w tym nic nowego.
Moim celem było stworzenie takiego mechanizmu, który pozwoliłby na automatyczne budowanie "stosu zależności". Właściwie "kolekcji dekoracji"...

Samo tworzenie takiej kolekci nie jest niczym szczególnym.
Ciekawe(oczywiście moim zdaniem) jest pobranie tego stosu zależności w postaci funkcji anonimowej.
Samo wywołanie tej metody powoduje, tak narawdę wykonanie ostatniej metody z "kolekcji dekoracji", do której została przekazana funkcja porzedzająca ją w kolekci.

Wszystko dzieje się przy zachowaniu konwencji:
1. Pobierana funkjca do wykonania musi mieć swój odpowiednik w postacji metod zdefinowanych w klasach z "kolekcji dekoracji"
2. Metody dekorujące muszą zwracać funkcje anonimowe
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.