Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Ponowne wykorzystanie interfejsów
starach
post 18.05.2010, 16:34:49
Post #1





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Witam,

Żałóżmy że : przestrzeń nazw a.b.c ma klase D i interfejs E. Obiekt klasy D sprawdza czy przekazany do niego obiekt innej klasy implementuje interfejs D i wykonuje pewne czynności. Potrzbna mi teraz taka sama funkcjonalność w klasie X, która musi wykonać identyczną czynność. Zastanawia mnie czy powinienem w tej sytuacji powielić tą funkcjonalność czy skorzystać z istniejącej wedle zasady DRY.

Dokładnie to chodzi o przekazywanie obiektu kontekstowego w parametrze konstruktora. Pyrz towrzeniu obiektu D sprwadza czy implementuje on odpowiedni interfejs i go przekazuje. To samo musi robić obiekt klasy X.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post 18.05.2010, 16:38:30
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Nie jestem pewien czy dobrze Cię zrozumiałem, ale chyba:

  1. namespace \a\b\c {
  2. interface E { }
  3.  
  4. class D {
  5. public function __construct(E $e) {
  6.  
  7. }
  8. }
  9. }
  10.  
  11. namespace \a\f\g {
  12. use \a\b\c\E;
  13.  
  14. class H {
  15. public function __construct(E $e) {
  16.  
  17. }
  18. }
  19. }
Go to the top of the page
+Quote Post
starach
post 18.05.2010, 16:53:00
Post #3





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


  1. <?php
  2. namespace A\B\C;
  3. class D
  4. {
  5. public function stworzObiekt($sClass)
  6. {
  7. // Sprawdz za pomoca ReflectionAPI czy klasa implementuje interfejs E
  8. // Jeśli tak to stworz przekazujac obiekt klasy F
  9. }
  10. }
  11. interface E
  12. {
  13.  
  14. }
  15. namespace E\F\G;
  16. class H
  17. {
  18.  
  19. }
  20. class I implements \A\B\C\E
  21. {
  22. public function __construct(F $f) { }
  23. }
  24.  
  25. $d = new D();
  26. $h = $d->stworzObiekt('H');
  27. $i = $d->stworzObiekt('I');
  28.  
  29. namespace J\K\L;
  30. class M
  31. {
  32. public function stworzObiekt($sClass)
  33. {
  34. /* Powinienem zaimplementować od nowa całe to sprawdzanie interfejsu czy w myśl Don't Repeat Yourself ( DRY ) zmodernizować tak implementację wcześniejszą żebym mógł ją wykorzystać ponownie */
  35. }
  36. }
  37. ?>
Go to the top of the page
+Quote Post
Crozin
post 18.05.2010, 17:53:43
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Mógłbyś opisać (najlepiej podać kod) jaki jest ostateczny cel tego kodu. Bo niestety teraz ciśnie się jedno: nie twórz w ogóle M::stworzObiekt(). Chciałbym poznać cały mechanizm jaki chcesz zaimplementować - może w założeniach powinno się coś poprawić.

Generalnie co do reguły DRY stosuję taką regułę: jeżeli ilość powielonego kodu jest względnie niewielka, a jego niepowtarzanie przystworzyłoby jedynie więcej problemów niż pożytku oraz co chyba najważniejsze, powielenie kodu z przyszłościowego punktu widzenia nie jest problemem - nie warto na siłę stosować się do tej reguły.
Go to the top of the page
+Quote Post
starach
post 19.05.2010, 03:45:10
Post #5





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


  1. $RC = new \ReflectionClass($sClass);
  2. if(false !== array_search('\System\Base\Context\ImplanterInterface', $RC->getInterfaceNames()))
  3. {
  4. $O = new $sClass($this);
  5. } else {
  6. $O = new $sClass();
  7. }
Go to the top of the page
+Quote Post

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: 13.08.2025 - 23:28