Осуществление делегирования

volodya81

Новичок
Читаю книгу Зандстры по ООП. Там есть пример делигирования. Нашел такую конструкцию и не могу понять как она работает.

function cost () {
return $this->costStrategy->cost($this);
}
тут:
$costStrategy - делегат от класса Lesson (его экземпляр)
function cost () - находится в примере класса, который делегирует к себе класса Lesson.
 

ArkDoom

Новичок
О боже, сорри :DDDD

Я смотрел другой форум, ответил сюда))))))))
 

Духовность™

Продвинутый новичок
Функия в которую передают значения высчитаные перед ней.
чо?

Это понятно, а что значит cost($this). Это мне не понятно.
В метод const объекта costStrategy передается указатель на текущий объект - $this

На самом деле это неудачный пример и весьма запутанный.
 

volodya81

Новичок
чо?

В метод const объекта costStrategy передается указатель на текущий объект - $this

На самом деле это неудачный пример и весьма запутанный.
Спасибо за ответ. Гляньте пожалуйста, на эти две страницы и помогите понять (в двух словах) как этот пример работает.
 

Вложения

  • 56,9 KB Просмотры: 17
  • 57,8 KB Просмотры: 11

Духовность™

Продвинутый новичок
Спасибо за ответ. Гляньте пожалуйста, на эти две страницы и помогите понять (в двух словах) как этот пример работает.
1. Если не понимаете, как работает этот код, то причины две:
- вы ещё не "доросли" до этого кода и вам это не надо пока знать, а нужно практиковаться на более легком ОО-коде
- вы не выучили синтаксис PHP в отношении классов

Работает это так: у вас есть класс Lesson, у которого есть значение duration (продолжительность) и значение ConstStrategy - объект, содержащий алгоритм подсчета стоимости, вынесенный в отдельный класс.
Вам нужно подсчитать стоимость cost у объекта Lesson.
Для того, что бы алгоритм подсчета можно было в случае надобности заменить и создать код, позволяющий рассчитывать стоимость на основании разных стратегий оплаты уроков, алгоритм выносится в отдельный класс, точнее - в два отдельных класса - TimedConstStrategy и FixedConstStrategy. У каждого из этик классов есть метод const, который принимает ссылку на класс Lesson, в котором содержится значение duration, которое и используется этими классами для подсчета стоимости.
В случае класса TimedConstStrategy стоимость рассчитывается по алгоритмы duration * 5, а в случае FixedConstStrategy значение duration не используется (хотя может).

Всё это дает универсальность и низкую связанность кода. В любой момент можно написать кучу других классов ConstStrategy, которые могут рассчитывать стоимость уроков по совершено разным алгоритмам. Если бы мы все алгоритмы пихали бы в метод cost класса Lesson, то это было бы не красиво, громоздко, не удобно.

А пример все таки интересный, я зря на него грешил.
 

volodya81

Новичок
Спасибо, понял. По-сути
function cost () {
return $this->costStrategy->cost($this);
}
передает текущий экземпляр класса Lesson в класс CostStrategy. А в классе CostStrategy мы его принимаем и в зависимости от подкласса делаем расчет стоимости занятий.
-----------
Подскажите, пожалуйста, что интерестного почитать синтаксис PHP в отношении классов (я раньше кодил только с процедурным подходом).
 

AmdY

Пью пиво
Команда форума
приехали, сразу учат паттерны, а лишь затем синтаксис. :confused:

volodya81
а что за книжка, вроде неплохая?
 

volodya81

Новичок
приехали, сразу учат паттерны, а лишь затем синтаксис. :confused:
О синтаксисе я читал (видимо недостаточно). Сейчас читаю про паттерны. Учиться кодить планирую в NetBeans. Раньше кодил процедуркой.
Хочу выучить теорию. а потом приступать к работе.
 

Улугбек

Новичок
да вы выше в конструктор гляньте
PHP:
abstract class Lesson
{

private $duration;
private $CostStrategy;//Объявляеться свойство в котором будет храниться объект класса CostStrategy 

/*Здесь во время создания объекта Lesson нужно 2 значния типа mylesson = new Lesson(5, new TimedCostStarategy()) где TimedCostStarategy() Наследник класса CostStrategy */

function __construct($duration, CostStrategy $strategy)
{
       $this->duration=$duration;
       $this->CostStrategy=$strategy;//вот тут наш $this->CostStrategy и вот это $this->costStrategy->cost($this) логически выглядит так $strategy->cost(new Lesson(5, new TimedCostStarategy()))

function cost () {
return $this->costStrategy->cost($this);//Тут высчитываеться цена от того объекта который был иницилизирован в конструкторе 
}
Надеюсь смог объяснить, книжка хорошая, сам тоже читаю))
 

Улугбек

Новичок
О синтаксисе я читал (видимо недостаточно). Сейчас читаю про паттерны. Учиться кодить планирую в NetBeans. Раньше кодил процедуркой.
Хочу выучить теорию. а потом приступать к работе.
Для ООП нужны конкретные задачи, лучше изучать шаблоны в процессе какой то работы, в ООП тебе очень будет надо UML, вот если что отличный эдитор, удачи ;)
 

craz

Нестандартное звание
Слушайте вот вопрос на засыпку)) Какова вероятность получить по е...нику от "следующего" за тобой программиста если делегирование сделать через магические методы?)
 

Улугбек

Новичок
Слушайте вот вопрос на засыпку)) Какова вероятность получить по е...нику от "следующего" за тобой программиста если делегирование сделать через магические методы?)
Вообще за любой проект вероятность ближе к 100% получить по е...нику от "следующего" за тобой программиста, если не используешь MVC)
 
Сверху