Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ponowne wykorzystanie interfejsów
Forum PHP.pl > Forum > PHP > Object-oriented programming
starach
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.
Crozin
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. }
starach
  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. ?>
Crozin
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.
starach
  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. }
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.