starach
18.05.2010, 16:34:49
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
18.05.2010, 16:38:30
Nie jestem pewien czy dobrze Cię zrozumiałem, ale chyba:
namespace \a\b\c {
interface E { }
class D {
public function __construct(E $e) {
}
}
}
namespace \a\f\g {
use \a\b\c\E;
class H {
public function __construct(E $e) {
}
}
}
starach
18.05.2010, 16:53:00
<?php
namespace A\B\C;
class D
{
public function stworzObiekt($sClass)
{
// Sprawdz za pomoca ReflectionAPI czy klasa implementuje interfejs E
// Jeśli tak to stworz przekazujac obiekt klasy F
}
}
interface E
{
}
namespace E\F\G;
class H
{
}
class I implements \A\B\C\E
{
public function __construct(F $f) { }
}
$d = new D();
$h = $d->stworzObiekt('H');
$i = $d->stworzObiekt('I');
namespace J\K\L;
class M
{
public function stworzObiekt($sClass)
{
/* 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 */
}
}
?>
Crozin
18.05.2010, 17:53:43
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
19.05.2010, 03:45:10
$RC = new \ReflectionClass($sClass);
if(false !== array_search('\System\Base\Context\ImplanterInterface', $RC->getInterfaceNames())) {
$O = new $sClass($this);
} else {
$O = new $sClass();
}