[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Немного моих наблюдений на тему ООП
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Ron
Цитата (twin @ 12.07.2019 - 20:05)
Отдельная просьба Ron'у, можно этот момент поподробнее?

twin, не понял, вот так что ли?

(new ViewBold($html))->render((new ViewItalicQuote($html))->render($text))

twin
Ну ты написал:
Цитата (Ron @ 9.07.2019 - 17:39)
...декоратор, в отличае от твоей стратегии, позволяет бороться с комбинаторным взрывом, который в данной задаче более чем вероятнет. А точнее, он наверняка наступит с ростом функционала форматирования.


Комбинаторный взрыв, на сколько я знаю, это ситуация, когда для вычисления результата нужно перебрать все возможные варианты. Другими словами нужно как минимум что-то вычислить в геометрической прогрессии.

А и Б сидели на трубе.
А упала, Б пропала. Это простое вычисление.


Цитата
                                                       А упала                                                                                  Б пропала.
                                                   /               \                                                                                 /     \
                          А упала на бок или вниз    
                                /                         \
Если на бок, покатилась ли дальше     Если вниз, не зацепилась ли в последний момент
             /                            \                                 /                \
Это комбинаторный взрыв.

Или тот же брутфорс. Перебрать все возможные сочетания букв алфавита и вычислить хэш пароля. Это тоже взрыв.

Какое это имеет отношение к форматированию, где и вычислений то никаких нет...

Я что то не догоняю.


Цитата (Ron @ 12.07.2019 - 16:57)
twin, не понял, вот так что ли?

(new ViewBold($html))->render((new ViewItalicQuote($html))->render($text))
Можно и так конечно, но идея в том, что требуемый формат инкапсулируется в управляющем классе.
То есть он не вычисляется, а задается.
Хотя можно и комбинировать готовые форматы, почему нет.

Только где тут взрыв?

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
twin
Скорее всего ты имел ввиду не комбинаторный взрыв, а раздувание интерфейса. Наверное и Santehnick это имел ввиду тут:
Цитата (Santehnick @ 11.07.2019 - 17:28)
У тебя слишком конкретизированный интерфейс. Добавление перечеркнутого текста приведет к изменению всего. Это бесмысленный, плохой интерфейс и как следствие весь зависящий от него код.
Потому что дал ссылку совсем не туда. Принцип разделения интерфейса подразумевает интерфейсы, различные по функциональности. Разделять интерфейсы нужно для того, чтобы сущности использовали только те интерфейсы, которые необходимы им в работе. В моем случае необходимы все, делить тут нечего.

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

Но это единственный минус и с ним можно бороться. Теми же группировками, разделяя интерфейсы не по функциональности, а по тематикам. Допустим в один класс собрать простые и часто используемые форматы (b, i, s, u), в другой цвета, в третий размеры и так далее.

Это не декоратор, хотя немного похоже, это просто библиотека обработки текста. Ну если сделать совсем канонично, можно текст представить как VO, хотя это ООП ради ООП. Можно еще фасад впиндюрить, если совсем заморочиться. Можно цепочку сделать. Ну в общем губы накрасить, но это не суть.

Лично я вижу преимущество такого подхода перед декоратором в переносимости. Декоратор зависит от декорируемого класса, а это по сути нарушение инверсии зависимости.

Так что вот, проанализировав всё вышесказанное, могу констатировать: интуиция меня не подвела и инструмент выбран как раз под задачу. Вот тебе и суслик :D :D

Свернутый текст
Только не придирайтесь к названиям классов, реально лениво фантазировать. Зрите в корень (с) Козьма Прутков.


///////////////////////////////////
// БИБЛИОТЕКА
interface FormatterInterface { }

interface SimpleInterface extends FormatterInterface
{
public function bold(Text $text);
public function italic(Text $text);
// Some methods
}

// ..............другие интерфейсы

class SimpleHTMLFormatter implements SimpleInterface
{
public function bold(Text $text)
{
return '<b>' . $text . '</b>';
}
public function italic(Text $text)
{
return '<i>' . $text . '</i>';
}
// Some methods
}

class SimpleBBFormatter implements SimpleInterface
{
public function bold(Text $text)
{
return '[В]' . $text . '[/В]';
}
public function italic(Text $text)
{
return '[l]' . $text . '[/l]';
}
// Some methods
}

//................. другие форматтеры

// VO

class Text
{
protected $text;

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

public function __toString()
{
return $this->text;
}
}


//////////////////////////////////
// КОНТЕКСТ

abstract class ViewBase
{
protected $formatter;

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

abstract public function render(Text $text);
}

class ViewHeader extends ViewBase
{
public function render(Text $text)
{
return $this->bold($text);
}

protected function bold(Text $text)
{
return $this->formatter->bold($text);
}
}


class ViewBody extends ViewBase
{
public function render(Text $text)
{
return $this->italic($text);
}

protected function italic(Text $text)
{
return $this->formatter->italic($text);
}
}


$header = new Text("Задача форматирования текста");
$body = new Text("Вот такая вот фигня. Делегирование рулит)))");
$simple = new SimpleHTMLFormatter;
echo (new ViewHeader($simple))->render($header);
echo '<br>';
echo (new ViewBody($simple))->render($body);


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
Быстрый ответ:

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