[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Design Patterns
Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
twin
Цитата (SlavaFr @ 11.09.2017 - 12:46)
Фабрика в принципе не только создание объектов, но и перенос всей грязи, которая возникает при создание объектов именно в Фабрику.
Почему не в билдер? Создавать простые объекты через фабрику, это моветон мне кажется. Приведи пример такой грязи плиз.


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

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

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

user posted image
chee
twin, я писал тебе ответ, но что-то не то нажал и все пропало. Писать заново не буду, короче делайте фичу, которая будет черновик сообщения в localStorage писать.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
twin
Цитата (chee @ 11.09.2017 - 15:09)
twin, я писал тебе ответ, но что-то не то нажал и все пропало.
Яснопонятно.
Цитата (chee @ 11.09.2017 - 15:09)
Писать заново не буду, короче делайте фичу, которая будет черновик сообщения в localStorage писать.
Как ты себе это представляешь... Пунтосвитчер поставь. smile.gif
Можно сохранять в буфер перед отправкой, но ты же что то не то нажал...

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

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

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

user posted image
chee
twin, это уже не первый раз, на phpclub например черновики есть и это крайне удобно.


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
SlavaFr
Цитата (twin @ 11.09.2017 - 12:49)
Почему не в билдер? Создавать простые объекты через фабрику, это моветон мне кажется. Приведи пример такой грязи плиз.


А чем билдер отличается от фабрики?
Для примера возьми класс, который в конструкторе нуждается в других объектах определённого интерфейса, которые надо в начале создать или взять уже имеющиеся, к тому же например для передачи параметров считывает эти параметры в конфигурации. Если ты это сделаешь без фабрики в конструкторе самого объекта, то у тебя появятся в конструкторе операторы new, что приведёт не только к зависимости к конкретному классу, а не интерфейсу, но и тебе придётся во первых каждый раз менять под ситуацию конструктор и усложнять себе юнит-тест. Если же создание объектов происходит в фабрике, то тебе уже не надо прикасаться к классу, который эта фабрика производит и который проверен тестами, а тебе нужно только менять фабрику и тестировать её только функциональными тестами.


_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
twin
Цитата (SlavaFr @ 12.09.2017 - 06:16)
А чем билдер отличается от фабрики?
А разве не отличается?
Простая фабрика штампует однотипные объекты, когда их нужно много. Я писал про немцев.
class Factory
{
public function create()
{
return new SomeClass;
}
}

Смысл её в том, что её саму можно передать куда-нибудь, чтобы она и там наштамповала много одинаковых объектов. Но в веб не нужно много одинаковых объектов. Если они понадобились, значит где-то ошибка в архитектуре. Это лишнее звено, потому что сейчас объекты хранятся в реестрах или модных контейнерах.

Другое дело билдер. Он формирует объект пошагово, из нескольких, или конфигурируя его поэтапно и т.д.

class builder
{
public function create()
{
$obj = new Class1;
$result = $obj->getResult();
return new Class2($result);
}
}
Вся, как ты говоришь, грязь инкапсулирована в нем. Это понятно и полезно.

А есть абстракная фабрика. Она позволяет формировать целую линию объектов одного семейства, в зависимости от желания клиента. Это похоже на несколько билдеров, собранных под одним интерфейсом. Код абстрактной фабрики писать не буду, лень. Я вот тут расписывал.

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

Но в веб нет возможности изменить что-то в момент исполнения программы. Мы не можем запустить страницу, а пока она доли сеунды формируется, захотеть что то изменить. Причем не затрагивая результат того, что уже отработало. Тоже самое касается и фабричного метода. Веб-приложение лишено динамики. Мы не можем воздействовать на него в момент исполнения. Вся программа прописывается заранее, жестко, а значит все эти фабрики лишены смысла. Достаточно билдеров. Иначе это получается никому не нужное усложнение.

Так что ни простая фабрика, ни абстрактная, в веб-приложениях не применимы. Имеет некоторый смысл фабричный метод, и то только его разновидность с параметром. По крайней мере я не вижу задач, которые решались бы только фабриками и не могли быть упрощены с помощью обычных билдеров.

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

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

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

user posted image
SlavaFr
@twin я понял, что ты имеешь в виду. Проблема в том, что крупные проэкты имеют не только протекающие в контроллере операции, но имеются Джобс или к примеру возможности вызывать ту или иную имплементации интерфейса, в зависимости от среды или конфигурации + тесты.. Чисто из этих соображений, если в системе нет депенденси инекцион контейнера я не только делаю фабрики, но и фабрики которые позволяют заменять имплементации производимого фабрикой класса. Типа мутанта между фабрикой и фасадом. По сути мы об одном и тоже говорим, так как в том, что ты называешь билдером, а я фабрикой, общая цель по созданию объекта какого то типа в определённой среде и скрыть грязь производства этого объекта.

_____________
↓↓↓↓↓↓↓↓↓↓
ответ может быть здесь
или в mysql_error();
Arh
SlavaFr
Цитата
если в системе нет депенденси инекцион контейнера

DIC по сути тоже билдер.


_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
twin
Цитата (SlavaFr @ 14.09.2017 - 18:04)
По сути мы об одном и тоже говорим, так как в том, что ты называешь билдером, а я фабрикой, общая цель по созданию объекта какого то типа в определённой среде и скрыть грязь производства этого объекта.
В том и бяка вся, что это разные паттерны и служат для разных целей. Даже по названию. И по разному описаны в GoF.

Если кроме инициализации объекта есть еше что то, это билдер. Если чистое производство, то фабрика. Фабрика систематизирует создание объектов. Билдер строит объекты.

Фабрики имеют смысл только в динамике. Параметризированный (вот слово то sad.gif ) фабричный метод можно использовать в веб, если получать объект по имени. Допустим если это имя получено из базы в процессе выполнения скрипта. Все остальное должно управляться извне, причем рантайм. Без динамики абстрактная фабрика по сути не отличается от набора интерфейсов.

Если архитектура строится на фабриках, это просто от того, что везде и всюду только и слышно про них. А по идее в веб им нечего делать. Причем многие, вот ты и Сантехник к примеру, называете фабриками билдеры. Это ошибка на мой взгляд. Ну в PHP все понимают друг друга, потому что фабрики в чистом виде практически не используются. Однако почему то все советуют имено фабрики, ссылаясь на GoF. А ведь там примеры для С++. К веб отношения не имеют. И те же сишники вас могут уже не понять.

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

А в википедии примеры для PHP, мягко скажем, кривые. Но это же википедия! А значит фабрики - рабочим. И декораторы только в цепочку. smile.gif

Так что сначала нужно практически разобраться, что к чему, а потом уже изучать абстрактную теорию. Дабы блестать в высшем свете всякими умными словечками.

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

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

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

user posted image
Ron
Цитата (Santehnick @ 15.09.2017 - 15:41)
С тобой очень трудно вести дискуссию о паттернах, потому что ты прыгаешь с одного на другой, толком ни в одном из них не разобравшись.

Ну он мне в качестве примера декоратора выдал чистейшую защитную проксю, чего тут говорить. wink.gif

twin
Цитата (Guest @ 15.09.2017 - 11:37)
twin билдер используют чтобы изменять внутреннее представление объекта, то есть значения его свойств, при этом клиент знает только об интерфейсе билдера. Таким образом клиенту можно передавать на вход разные реализации билдеров и в итоге клиент будет получать объект одного и того же класса, но с разным внутренним представлением (значениями свойств).
Где я этому противоречил? Абсолютно верно, билдер выдает клиенту построенный и заполненный объект, инкапсулируя сложность его построения.
Цитата
Из той же вики сказано, что часто проектировать начинают с фабричного метода, потому что он проще и только затем это всё эволюционирует в билдер или что-то еще если нужна такая сложность.
И это не вызывает сомнений. Интересно другое. Сотый раз повторяю - интересно, где это применимо в PHP (это как то роднее smile.gif), а не как описано в GoF.

Цитата (Guest @ 15.09.2017 - 11:37)
С тобой очень трудно вести дискуссию о паттернах, потому что ты прыгаешь с одного на другой, толком ни в одном из них не разобравшись.
А я и пытаюсь разобраться. Но не просто вызубрить примеры из вики, как Ron, и говорить потом, что декоратор без yo-yo, это не декоратор. А действительно понять, на кой хрен это может понадобиться в веб-приложении. Примеров ни кто нормальных не приводит. Заметь, коды один я пишу в комментах. Отсюда вывод - ваши знания чисто теоретические. А мне нужны практические знания, а не эта шелуха.



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

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

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

user posted image
twin
И снова к кодам. Возьмем пример из вики, от которой ты фанатеешь, если уж перешли на жаргон. Весь пример не потащу, только вызов:
$appearance = "osx";

$factory = NULL;

switch ($appearance) {
case "win":
$factory = new WinFactory();
break;
case "osx":
$factory = new OSXFactory();
break;
default:
break;
}

$button = $factory->createButton();
$button->paint();


И скажи мне теперь, чем это лучше, чем так:
$appearance = "osx";

$factory = NULL;

switch ($appearance) {
case "win":
$button = new WinButton();
break;
case "osx":
$button = new OSXButton();
break;
default:
break;
}

$button->paint();

Сейчас ты скажешь про полиморфизм. Абстрактная фабрика позволяет систематизировать объекты по семействам. Выбрал фабрику и клепай круглые кнопки. Выбрал другую - получи квадратные. Да, полиморфизм - дело полезное. Но не в этом случае. Полиморфизм в виде фабрики полезен только в десктопных языках. Когда тебе сейчас нужна круглая кнопка, через пять минут переключил скин - квадратная. Потому и говорю, что фабрика призвана "фабриковать" много однотипных объектов.
Свернутый текст
Кстати, прмер даже в английской вики кривоват. Кому нужны разные кнопки в зависимости от оси при генерации веб-страниц... Там просто один и тот же пример расписали на разных языках без учета специфики.

Так вот. Это полезно, потому что десктопная программа работает долго. Мы понятия не имеем, сколько, когда и каких кнопок понадобится юзеру в процессе исполнения программы. Но в веб динамика не нужна. Что прописал, то и будет. В рантайме ничего не изменишь.

При запуске веб-приложения нам заранее известно, что для него потребуется в процессе исполнения. Все внешние данные подаются на входе, запросами или конфигурацией. Если есть запрос на квадратные кнопки, они и будут квадратными до конца. И этим вопросом куда как лучше справляется DIC. Контейнер, это и фабрика, и билдер, и прототип, и реестр, и локатор в одном флаконе. Сейчас 2017 год, напомню. Не 1994, в котором GoF написали. Награмождать на контейнер еще и внешнюю абстрактную фабрику... поясни смысл. Не догоняю.

Я знаю, что у контейнера есть свои недостатки по сравнению с фабрикой. Но все, что я смог нарыть, касается только десктопа. Именно из-за динамики.

Фабричный метод, если он параметризирован, еще куда ни шло, это может быть полезным при инициализации объекта по имени класса, полученного из СУБД. И то, с популяризацией всяческих AR и ОRM в этом пропадает необходимость.

Кстати, отдельное наблюдение. Большинство описаний паттернов в GoF не скупится на классы и интерфейсы, а каждый должен быть в отдельном файле. И это понятно почему. Эти все примеры для компелируемых языков. Там не особо важно, сколько чего ты наворотил, в итоге все равно получится один ексешник (я не беру во вимание либы, конфигурацию и пр, только приложение). А вот в интерпретируемых языках это плохо. Это сказывается на производительности. Конечно, сейчас опять начнеся "железо дешевле программиста" и прочая. Не понятно, зачем это делать специально, используя совершенно неприемлимые примеры, как делает Ron.

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

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

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

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

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