так что в основном неправильный код:
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 должен создать и владеть Кошельком ... или нет?Какой способ это хорошо?