Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
Страницы: (2) 1 [2]  ( Перейти к первому непрочитанному сообщению )  
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> SOLID что такие и с чем едят, серия статей части. S и O от SOLID
bestxp  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2120
Пользователь №: 36605
На форуме: 12 лет, 2 месяца, 13 дней
Карма: 115




Как это ты не видишь? Там четко показано,
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();
}
}


Что правильно, и теперь следуя принципа мы пишем только новый код, и не трогаем текущий, то есть тут уже архитектура верная
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
OleKh  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 753
Пользователь №: 32032
На форуме: 13 лет, 24 дня
Карма: 18




Вот нашел ещё пример
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

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
OleKh  
[x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 753
Пользователь №: 32032
На форуме: 13 лет, 24 дня
Карма: 18




Цитата (bestxp @ 25.03.2013 - 21:06)
Готов выслушать вопросы.

Хотелось бы ещё обратить внимание на некоторые моменты.

1. Рабочий пример (на примрере ТС) несоответствующий OCP. Как видно, класс Manager расширяет класс Person. По условию все классы наследники Person - 'employee', что неправильно и требует изменений.

class Person
{
public function getName(){}
public function setName(){}
}


class Employee extends Person {}
class Manager extends Person{}

class NameView
{
public function doOutput(Person $person)
{
// $employee = new Employee ;
$employee = new Manager;

if ($employee instanceof Person)
{
echo 'Hi employee', $person->getName();
}
else
{
Echo 'Hi person ', $person->getName();
}
}
}


class Controller
{
public function personAction()
{
// Get a person from some data source
// $person = ...;

$person = new Person;
$view = new NameView();
$view->doOutput($person);
}
}


$controller = new Controller ();
$controller->personAction();//Hi employee


2. Рабочий пример (на примрере ТС) соответствующий OCP (не полностью). Как видно, все классы расширяющие класс Person, возвращают требуемый результат, кроме одного - класс Worker. А если применить абстрактный класс и абстрактный метод, тогда класс Worker не останется без внимания.


class Person
{
public function getName(){}
public function setName(){}
public function getTitle()
{
return 'person';
}
}


class Employee extends Person
{
public function getTitle()
{
return 'employee';
}
}


class Manager extends Person
{
public function getTitle()
{
return 'manager';
}
}


class Worker extends Person
{

}


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


$output = new NameView();
$output->doOutput(new Employee);//Hi employee
$output->doOutput(new Manager);//Hi manager

$output->doOutput(new Worker);//Hi person

PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2120
Пользователь №: 36605
На форуме: 12 лет, 2 месяца, 13 дней
Карма: 115




ты не прав тут

Worker это частный случай Person , и если он возвращает Person значит верно всё.
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темыСтраницы: (2) 1 [2]  Ответ в темуСоздание новой темыСоздание опроса