[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: SOLID что такие и с чем едят
Страницы: 1, 2
bestxp
Как это ты не видишь? Там четко показано,
class NameView
{
public function doOutput(Person $person)
{
if (Person instanceof Employee)
{
echo ‘Hi employee ‘, $person->getName();
}
else
{
Echo ‘Hi person ‘, $person->getName();
}
}
}


По сути тут если мы добавляем еще кучу всего, мы его должны изменять, но согласно открытия закрытия, мы не должны менять его, так как это не та причина для изменения, следовательно архитектура построена не верно, то есть требуется рефакторинг

В результате у нас получается

class NameView
{
public function doOutput(Person $person)
{
echo ‘Hi ‘, $person->getTitle(), ‘ ‘, $person->getName();
}
}


Что правильно, и теперь следуя принципа мы пишем только новый код, и не трогаем текущий, то есть тут уже архитектура верная
OleKh
Вот нашел ещё пример
http://binary.freeperspective.net/countzer...-design-in-php/
Постарался сделать что-то похожее, чтобы было проще разобраться. Надеюсь получилось.

Проблемный класс. Кол-во типов ограничено двумя типами. Третий не проходит проверку. Чтобы добавить третий тип придется изменять базовый класс.
class Person
{
private $type;
public function __construct($type){
$this->type = $type;
}
public function setName(){
if ($this->type == 'employee')
return $this->type;
if ($this->type == 'manager')
return $this->type;
}

}


$person = new Person ('employee');
echo $person->setName();//employee
$person = new Person ('manager');
echo $person->setName();//manager

$person = new Person ('worker');
echo $person->setName();////


Следуя принципу Open/Close Principles, появляется возможность добавлять неограниченное кол-во типов при этом не изменяя базовый класс.

abstract class AnyPerson
{
public function setName(){
return $this->getPerson();
}
public abstract function getPerson ();
}

class employee extends AnyPerson
{
private $employee = 'employee';
public function getPerson(){
return $this->employee;
}
}


$person = new employee();
echo $person->setName();//employee

class manager extends AnyPerson
{
private $employee = 'manager';
public function getPerson(){
return $this->employee;
}
}


$person = new manager();
echo $person->setName();//manager

class worker extends AnyPerson
{
private $employee = 'worker';
public function getPerson(){
return $this->employee;
}
}


$person = new worker();
echo $person->setName();//worker

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.