Если прямое «новое» делает код связанным, применимо ли это, когда я тоже использую фабрику? - PullRequest
0 голосов
/ 03 января 2019

так что в основном неправильный код:

abstract class Wallet
{
    private $amount;

    public function __construct($amount)
    {
        $this->amount = $amount;
    }
}

class PaypalWallet extends Wallet {}
class CreditcardWallet extends Wallet {}
class VisaWallet extends Wallet {}

class Person
{
    private $wallet;

    public function __construct($walletType, $amount)
    {
        $walletType = 'Wallet'.$walletType;
        $this->wallet = new $walletType($amount);
    }
}

$person1 = new Person('Paypal', 1000);
$person2 = new Person('Creditcard', 2000);
$person3 = new Person('Visa', 3000);

Допустим, у меня есть фабрика, поэтому:

class Person
{
    private $wallet;

    public function __construct($walletType, $amount)
    {
        $walletType = 'Wallet'.$walletType;
        $this->wallet = \Factory::create($walletType, $amount);
    }
}

конечно Factory::create можно настроить для создания другого класса.Таким образом, я все еще чувствую это вонючим, потому что $amount может не принадлежать Person, более того, это похоже на "фальшивый" DI.Другой рефакторинг:

class Person
{
    private $wallet;

    public function __construct(Walett $wallet)
    {
        $this->wallet = $walett;
    }
}

$wallet1 = new PaypalWallet(1000);
$wallet2 = new PaypalWallet(2000);
$wallet3 = new PaypalWallet(3000);
$person1 = new Person($wallet1);
$person2 = new Person($wallet2);
$person3 = new Person($wallet3);

это, кажется, чистое растворение DI и OOP - но также, кажется, нарушает инкапсуляцию.Таким образом, кошелек создается вне человека - но он полностью принадлежит ему!Похоже, $person и $walet находятся на одном уровне, в то время как Person должен создать и владеть Кошельком ... или нет?Какой способ это хорошо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...