[C++] о паттернах
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 22.05.11 12:50
Оценка: 18 (3) +14 -1
Здравствуйте, Abyx,

А вообще говоря, завязывал бы ты с попытками "понять паттерны" — без практики это гнилое занятие, чреватое перекосами. Паттерны вырабатываются как плод многих и многих попыток оптимизации собственной работы, помноженных на поиск баланса между фактическими и предполагаемыми требованиями. Соответственно те, кто формулирует описание паттернов, предполагают, что их читатели съели такую же собаку на этом поприще, потому, естественно, многих вещей не договаривают. Прежде всего, касаемо контекста — этак каждый паттерн придётся сопровождать трёхтомником описаний возможных альтернатив и рассказами о том, что из чего вытекло. Поэтому ограничиваются только ключевыми характеристиками, а читатель, считатется, что сам узнает ситуацию, сопоставимую с контекстом, приведённым в описании паттерна.

Отсюда мораль: сначала должна быть практика без учёта мнения авторитетов. Вот когда набьёшь шишек по этой части — перестанешь задавать вопросы относительно значения отдельных иероглифов в манускриптах паттерноведов.


23.05.11 12:00: Ветка выделена из темы [C++] о паттернах
Автор: Abyx
Дата: 21.05.11
— Odi$$ey
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re: [C++] о паттернах
От: Sorc17 Россия  
Дата: 22.05.11 17:53
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, Abyx,


ГВ>А вообще говоря, завязывал бы ты с попытками "понять паттерны" — без практики это гнилое занятие, чреватое перекосами. Паттерны вырабатываются как плод многих и многих попыток оптимизации собственной работы, помноженных на поиск баланса между фактическими и предполагаемыми требованиями. Соответственно те, кто формулирует описание паттернов, предполагают, что их читатели съели такую же собаку на этом поприще, потому, естественно, многих вещей не договаривают. Прежде всего, касаемо контекста — этак каждый паттерн придётся сопровождать трёхтомником описаний возможных альтернатив и рассказами о том, что из чего вытекло. Поэтому ограничиваются только ключевыми характеристиками, а читатель, считатется, что сам узнает ситуацию, сопоставимую с контекстом, приведённым в описании паттерна.


ГВ>Отсюда мораль: сначала должна быть практика без учёта мнения авторитетов. Вот когда набьёшь шишек по этой части — перестанешь задавать вопросы относительно значения отдельных иероглифов в манускриптах паттерноведов.


Можете придумать две как можно более простые программы в одной из которых было бы целесообразно использовать какой-нибудь самый простой паттерн, например синглтон, а другая была бы похожа на первую но там использование синглтона было бы не нужно?
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[2]: [C++] о паттернах
От: Carc Россия https://vk.com/gosha_mazov
Дата: 22.05.11 21:36
Оценка:
S>Можете придумать две как можно более простые программы в одной из которых было бы целесообразно использовать какой-нибудь самый простой паттерн, например синглтон, а другая была бы похожа на первую но там использование синглтона было бы не нужно?
В "наиболее простых программах" паттерны и нафиг не нужны. Ибо паттерны это эффективный элемент управления со сложностью. Чего в простых программах и вовсе нет, ибо программа по определению п_р_о_с_т_а_я!!!

Выше действительно правильно подметили: практика, практика, и еще раз практика. Тогда становится достаточно ясным плюсы и минусы использования того или иного паттерна.
Aml Pages Home
Re[2]: [C++] о паттернах
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 22.05.11 23:04
Оценка: 116 (10) +13 -1 :)
Здравствуйте, Sorc17, Вы писали:

ГВ>>Отсюда мораль: сначала должна быть практика без учёта мнения авторитетов. Вот когда набьёшь шишек по этой части — перестанешь задавать вопросы относительно значения отдельных иероглифов в манускриптах паттерноведов.


S>Можете придумать две как можно более простые программы в одной из которых было бы целесообразно использовать какой-нибудь самый простой паттерн, например синглтон, а другая была бы похожа на первую но там использование синглтона было бы не нужно?


И не подумаю.

Во-первых, в силу того, что до использования единственного на весь процесс экземпляра класса, который фактически создаётся первым обращением, я додумался ещё задолго до того, как узнал, что та же идея оказалась закодирована под названием "паттерн синглтон". Что-то там было у меня в то время связано с lazy-инициализацией, или lazy-подгрузкой, не помню уже. Собственно, инсайт по этому поводу я помню только такой, который на поверку оказался сродни оторопи: неужели даже такую чепуху можно с таким пафосом продавать? ЧёрдЪ! Сколько же бабла я мог натрясти!

А во-вторых, чтобы избежать ненужных спекуляций — я вполне понимаю, что какое бы воплощение означенной идеи я ни предложил, всё равно найдётся кто-нибудь, кто начнёт мне доказывать, что я-де "использовал паттерн синглтон". Здесь будет тонкое передёргивание, от которого мне отвертеться не получится. Дело в том, что я не использую паттерны так, как это иной раз себе представляют (сначала посмотрел справочник, потом подобрал паттерн, потом придумал воплощение в соответствии с каноном), а лишь постфактум обозначаю выбранное решение в терминах "паттернов" — так, для краткости дальнейших коммуникаций. Не было бы паттернов, нашлись бы другие способы "сокращения количества слов". Но сугубо внешне, по свои результатам, эти два процесса не отличимы один от другого: в обоих случаях получится, хе-хе, синглтон и его словесное описание. Для выяснения различий останется апеллировать к стилям мышления, и прочей заведомо спекулятивной лабуде.

И повторюсь, наверное, в десятый раз: паттерны нельзя в прямом смысле использовать. Нельзя даже пытаться это делать. Книги с перечислением паттернов полезно изучать, потому что они подкидывают некоторые комбинаторные (и справедливости ради — терминологические) идеи, которые могут оказаться свежими в данный момент, не более того. При прочих равных (я в этом уверен и никто меня не разубедит) любому мыслящему программисту не составит большого труда додуматься до любого паттерна самостоятельно, но обстоятельства бывают разные — иногда просто нет возможности прерваться и спокойно подумать.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[3]: [C++] о паттернах
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 23.05.11 07:59
Оценка: +1 -1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>И повторюсь, наверное, в десятый раз: паттерны нельзя в прямом смысле использовать.


спорное обобщение совершенно индивидуального опыта

ГВ>Нельзя даже пытаться это делать.


ну а я сначала прочитал про State, и только потом через какое-то время попалась задача, на которую я посмотрел, подумал — "О, так это ж состояния и переходы между ними, а не применить ли мне State" и применил, съэкономив кучу времени на разработке и поддержке
Re[3]: [C++] о паттернах
От: Pavel Dvorkin Россия  
Дата: 23.05.11 08:37
Оценка: +3 :)
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>А во-вторых, чтобы избежать ненужных спекуляций — я вполне понимаю, что какое бы воплощение означенной идеи я ни предложил, всё равно найдётся кто-нибудь, кто начнёт мне доказывать, что я-де "использовал паттерн синглтон". Здесь будет тонкое передёргивание, от которого мне отвертеться не получится. Дело в том, что я не использую паттерны так, как это иной раз себе представляют (сначала посмотрел справочник, потом подобрал паттерн, потом придумал воплощение в соответствии с каноном), а лишь постфактум обозначаю выбранное решение в терминах "паттернов" — так, для краткости дальнейших коммуникаций. Не было бы паттернов, нашлись бы другие способы "сокращения количества слов". Но сугубо внешне, по свои результатам, эти два процесса не отличимы один от другого: в обоих случаях получится, хе-хе, синглтон и его словесное описание. Для выяснения различий останется апеллировать к стилям мышления, и прочей заведомо спекулятивной лабуде.


ИМХО здесь имеет место некоторое отличие между программистской культурой нынешних времени и культурой нашего поколения.

Паттерны нас не интересовали (собственно, мы о них и не знали), а вот алгоритмы — очень даже. И за незнанием паттернов мы эти алгоритмы подбирали или придумывали, для тех или иных задач. Я не имею в виду только математические алгоритмы, я имею в виду вообще некие решения в той или иной ситуации.

Из совокупности таких решений и выкристаллизовались патттерны как их сейчас понимают. Это, по сути, алгоритмы решений в некоторых стандартных ситуациях. Вот в этом случае мы употребим такое-то решение (мы его раньше употребляли, и получилось хорошо, почему не употребить опять, коли ситуация схожая), а в этой — другое, тоже нам известное по прошлому опыту. Но как только ситуация будет не той, с которой нам уже приходилось иметь дело, мы перестанем аппелировать к прежним решениям и начнем искать подходящий алгоритм исходя из общих соображений.

Образно выражаясь, на счетном множестве различных проблем есть выбранные значения, для которых решение для проблемы нам известно. А также есть намного больше точек, где его нет для нас пока что, и надо его найти. Попали в одну из этих точек — прекрасно, возьмем решение. Не попали — будем искать решение для этого значения.

Подход "от паттернов" прямо противоположный. Есть набор рецептов, которые надо попробовать употребить в данной задаче
Иными словами, давайте искать подходящую точку, где решение есть, и всеми силами сводить нашу задачу к этой (этим) точке(ам). Если сведется — хорошо, а иначе... Иначе придется все же искать решение , а к этому не все способны. Все равно как конструктору, умеющему собирать из деталей, имеющихся на рынке, предложить самому спроектировать и разработать новую деталь.
With best regards
Pavel Dvorkin
Re[4]: [C++] о паттернах
От: Abyx Россия  
Дата: 23.05.11 09:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Образно выражаясь, на счетном множестве различных проблем есть выбранные значения, для которых решение для проблемы нам известно. А также есть намного больше точек, где его нет для нас пока что, и надо его найти. Попали в одну из этих точек — прекрасно, возьмем решение. Не попали — будем искать решение для этого значения.


PD>Подход "от паттернов" прямо противоположный. Есть набор рецептов, которые надо попробовать употребить в данной задаче

PD>Иными словами, давайте искать подходящую точку, где решение есть, и всеми силами сводить нашу задачу к этой (этим) точке(ам). Если сведется — хорошо, а иначе... Иначе придется все же искать решение , а к этому не все способны. Все равно как конструктору, умеющему собирать из деталей, имеющихся на рынке, предложить самому спроектировать и разработать новую деталь.

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

например "глобальная переменная" — замечательно. для проблемы X это решение которое дает простой и выразительный код.
через некоторое время проблемы X превращается в проблемы X+1 и что-то становится не так. Ищем новое решение?

в случае с паттернами всё иначе. применяя паттерн, мы знаем что он сравнительно хорошо подходит для проблемы X, еще лучше подходит для проблемы X+1, полезен для смежной проблемы Y, но вреден для проблемы X + (0 + 1i). Да, это сложное универсальное решение, а усложнение кода плохо. Зато оно обещает что при ожидаемом изменении задачи ситуация не ухудшится.

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

А процесс решения проблемы выглядит не так что мы смотрим решали мы такую задачу или нет, если да- берем предыдущее решение,
а мы должны предвидеть в каком направлении проблема может меняться, и должны выбрать если точку — то находящуюся в направлении изменений проблемы.
In Zen We Trust
Re[5]: [C++] о паттернах
От: Pavel Dvorkin Россия  
Дата: 23.05.11 09:17
Оценка: +1
Здравствуйте, Abyx, Вы писали:

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


Так ведь до появления этого понятия (паттерн) находили же...
А потом — почему одно решение ? Я об этом ничего не говорил. Вполне возможно, что и несколько, и надо выбрать лучшеее в применении к данной задаче. А может быть, ни одно из ранее известных мне решений все же не годится, и несмотря на соблазн его применить (ну очень уж задача похожа), все же лучше их не применять, а искать новое решение.

A>например "глобальная переменная" — замечательно. для проблемы X это решение которое дает простой и выразительный код.

A>через некоторое время проблемы X превращается в проблемы X+1 и что-то становится не так. Ищем новое решение?

Не очень серьезный аргумент.

A>в случае с паттернами всё иначе. применяя паттерн, мы знаем что он сравнительно хорошо подходит для проблемы X, еще лучше подходит для проблемы X+1, полезен для смежной проблемы Y, но вреден для проблемы X + (0 + 1i). Да, это сложное универсальное решение, а усложнение кода плохо. Зато оно обещает что при ожидаемом изменении задачи ситуация не ухудшится.


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


A>А процесс решения проблемы выглядит не так что мы смотрим решали мы такую задачу или нет, если да- берем предыдущее решение,

A>а мы должны предвидеть в каком направлении проблема может меняться, и должны выбрать если точку — то находящуюся в направлении изменений проблемы.

Ты изложил другими словами процесс как я его определяю. Именно искать решение, сообразуясь с задачей и прежними решениями (паттернами). Вот только ты не сказал, что будешь делать, если (в твоей терминологии) не найдем никаких вхождений точки-проблемы в области всех паттернов. А так, все верно, и ничему из того, что я сказал, это не противоречит.
With best regards
Pavel Dvorkin
Re[4]: [C++] о паттернах
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 23.05.11 09:29
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Подход "от паттернов" прямо противоположный. Есть набор рецептов, которые надо попробовать употребить в данной задаче


это кто рекомендует такой подход? кого клеймим?
Re[6]: [C++] о паттернах
От: Abyx Россия  
Дата: 23.05.11 09:29
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Ты изложил другими словами процесс как я его определяю. Именно искать решение, сообразуясь с задачей и прежними решениями (паттернами). Вот только ты не сказал, что будешь делать, если (в твоей терминологии) не найдем никаких вхождений точки-проблемы в области всех паттернов. А так, все верно, и ничему из того, что я сказал, это не противоречит.


грустно вздохнем, предвидя кучу проблем в будущем, и напишем как придумается. как будто могут быть варианты %)
нет никакой гарантии что придуманное решение ранее неизвестной задачи будет хорошим\удачным, опираюсь я на паттерны или нет.

впрочем хорошо бы еще узнать, а вдруг такой паттерн есть, просто я о нем еще не знаю.
In Zen We Trust
Re[5]: [C++] о паттернах
От: Pavel Dvorkin Россия  
Дата: 23.05.11 09:33
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

OE>это кто рекомендует такой подход? кого клеймим?


Да то и дело проскальзывает . "здесь надо употребить паттерн X"
With best regards
Pavel Dvorkin
Re[7]: [C++] о паттернах
От: Pavel Dvorkin Россия  
Дата: 23.05.11 09:38
Оценка:
Здравствуйте, Abyx, Вы писали:

A>грустно вздохнем, предвидя кучу проблем в будущем, и напишем как придумается. как будто могут быть варианты %)


А что, их не может быть ?

A>нет никакой гарантии что придуманное решение ранее неизвестной задачи будет хорошим\удачным, опираюсь я на паттерны или нет.


Гарантии нет, верно. А что делать-то ? Задача ранее неизвестная, решение придумывать все равно придется... Окажется удачным — будет новый "паттерн" (для меня). Окажется неудачным — будет новый "паттерн", но придуманный не мной.

A>впрочем хорошо бы еще узнать, а вдруг такой паттерн есть, просто я о нем еще не знаю.


Серьезно. Согласен. В переводе на мой язык : а вдруг для этой точки есть хорошее решение, а я о нем не знаю. Может быть. Век живи — век учись.
With best regards
Pavel Dvorkin
Re[6]: [C++] о паттернах
От: Abyx Россия  
Дата: 23.05.11 09:45
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Odi$$ey, Вы писали:


OE>>это кто рекомендует такой подход? кого клеймим?


PD>Да то и дело проскальзывает . "здесь надо употребить паттерн X"


так если действительно надо?

конечно бывает что говорят "здесь надо употребить паттерн X", а на самом деле паттерн Х там применять не надо, но паттерн-то чем виноват?
In Zen We Trust
Re[6]: [C++] о паттернах
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 23.05.11 09:50
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Да то и дело проскальзывает . "здесь надо употребить паттерн X"


разве это тоже самое что

PD>Есть набор рецептов, которые надо попробовать употребить в данной задаче


Re[7]: [C++] о паттернах
От: Pavel Dvorkin Россия  
Дата: 23.05.11 11:11
Оценка:
Здравствуйте, Abyx, Вы писали:


PD>>Да то и дело проскальзывает . "здесь надо употребить паттерн X"


A>так если действительно надо?


A>конечно бывает что говорят "здесь надо употребить паттерн X", а на самом деле паттерн Х там применять не надо, но паттерн-то чем виноват?


Да не виноват он ни в чем, прочти еще раз мой первый ответ. Он — вполне корректное решение некоей задачи, вот и все.
With best regards
Pavel Dvorkin
Re[7]: [C++] о паттернах
От: Pavel Dvorkin Россия  
Дата: 23.05.11 11:18
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

PD>>Да то и дело проскальзывает . "здесь надо употребить паттерн X"


OE>разве это тоже самое что


PD>>Есть набор рецептов, которые надо попробовать употребить в данной задаче


OE>


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

Вот надо тебе прибор какой-то сделать. Если ты его спроектируешь, а потом решишь, что вот тут нужно использовать паттерн "шуруп и гайка" — никаких возражений нет. А вот если ты ходишь и ищешь, из каких бы шурупов , болтов, гаек и т.п. его собрать — значит, анализ явно отсутствует
With best regards
Pavel Dvorkin
Re[5]: [C++] о паттернах
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 13:47
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>Подход "от паттернов" прямо противоположный. Есть набор рецептов, которые надо попробовать употребить в данной задаче

PD>>Иными словами, давайте искать подходящую точку, где решение есть, и всеми силами сводить нашу задачу к этой (этим) точке(ам). Если сведется — хорошо, а иначе... Иначе придется все же искать решение , а к этому не все способны. Все равно как конструктору, умеющему собирать из деталей, имеющихся на рынке, предложить самому спроектировать и разработать новую деталь.

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


Замечательное решение можно найти, имея следующее: максимально возможное знание о своём контексте, знание инструмента, некоторую формальную теоретическую подготовку и определённый опыт, который подскажет, как именно нужно интерпретировать условия своего контекста. Плюс некоторая независимость характера, но это, ИМХО, свойственно любому инженеру. При таких вводных, поверь на слово, можно найти замечательное решение, ничего не зная о паттернах. Собственно, свидетельством тому сама книга GoF: они ведь не выдумывали эти самые паттерны, а только выделяли их в тех решениях, которые им удалось просмотреть. Следовательно, во-первых, кто-то эти самые паттерны придумал, ничего при этом не зная о "паттернах", а во-вторых, эти самые придумщики не были ни гениями, ни какими-то штучными талантами — раз одни и те же паттерны воплощались несколькими разными людьми независимо друг от друга. Как там GoF характеризует авторов паттернов? "Хорошие инженеры", кажется так.

A>например "глобальная переменная" — замечательно. для проблемы X это решение которое дает простой и выразительный код.


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

A>через некоторое время проблемы X превращается в проблемы X+1 и что-то становится не так. Ищем новое решение?


Точно. Вот это и называется "практикой". Наколачивая такие шишки мы быстро учимся предсказывать проблемы, связанные с теми или иными архитектурными (структурными) решениями. И заодно обучаемся тому, как надо интерпретировать сторонние описания похожих проблем: какие фразы можно пропустить, какие и как нужно додумать, где нужно вставить умолчания, которые имеются в виду авторами, как нечто само собой разумеющееся.

A>в случае с паттернами всё иначе. применяя паттерн, мы знаем что он сравнительно хорошо подходит для проблемы X, еще лучше подходит для проблемы X+1, полезен для смежной проблемы Y, но вреден для проблемы X + (0 + 1i). Да, это сложное универсальное решение, а усложнение кода плохо. Зато оно обещает что при ожидаемом изменении задачи ситуация не ухудшится.


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

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


Собственно, это и есть источник всех зол. Проблема заключена в "люфте" между описанием проблемы в книге по паттерну и тем, как, грубо говоря, "ощущается" проблема здесь и сейчас. То есть — тем, чем она является на самом деле. В случае с алгоритмами всё намного проще — здесь у нас есть точно определённые параметры сложности, потребления памяти и т.п. В случае с описаниями паттернов оценки нужно базировать чуть ли не по эмоциональному восприятию: сегодня мне кажется, что я правильно понял автора, а завтра встал не с той ноги и — упс. Он же совсем не то имел в виду!

A>А процесс решения проблемы выглядит не так что мы смотрим решали мы такую задачу или нет, если да- берем предыдущее решение,

A>а мы должны предвидеть в каком направлении проблема может меняться, и должны выбрать если точку — то находящуюся в направлении изменений проблемы.

Это всё правильно, вопрос только в умении предсказывать изменения контекста.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: [C++] о паттернах
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 14:06
Оценка: 10 (1) +1
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>ИМХО здесь имеет место некоторое отличие между программистской культурой нынешних времени и культурой нашего поколения.


PD>Паттерны нас не интересовали (собственно, мы о них и не знали), а вот алгоритмы — очень даже. И за незнанием паттернов мы эти алгоритмы подбирали или придумывали, для тех или иных задач. Я не имею в виду только математические алгоритмы, я имею в виду вообще некие решения в той или иной ситуации.


Ну да, правильно, в некотором обзорном виде, конечно, готовые решения интересовали и интересуют. Надо же где-то набираться свежих идей. А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.

PD>Из совокупности таких решений и выкристаллизовались патттерны как их сейчас понимают. Это, по сути, алгоритмы решений в некоторых стандартных ситуациях. Вот в этом случае мы употребим такое-то решение (мы его раньше употребляли, и получилось хорошо, почему не употребить опять, коли ситуация схожая), а в этой — другое, тоже нам известное по прошлому опыту. Но как только ситуация будет не той, с которой нам уже приходилось иметь дело, мы перестанем аппелировать к прежним решениям и начнем искать подходящий алгоритм исходя из общих соображений.


По сути, насколько я понимаю, с паттернами всё ещё гаже. Несколько разных инженеров занимаясь какими-то проблемами пришли к каким-то похожим решениям. Потом прискакали GoF и свели вместе некоторый общий каркас выработанных решений и некую "суперпозицию" описания проблем, с которыми столкнулись инженеры. То есть паттерны в их литературном воплощении — по определению сильно вторичный продукт. Полезный в определённом смысле, но вторичный. Соответственно, они лучше всего "работают" именно как обзорный материал, непосредственно их использовать подчас труднее, чем синтезировать свои собственные решения — чтобы адекватно "использовать" паттерн нужно знать намного больше, чем написано в книге, но если ты всё это знаешь, то книга по паттернам не нужна. Коллапс однако.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: [C++] о паттернах
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 14:15
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

ГВ>>Нельзя даже пытаться это делать.


OE>ну а я сначала прочитал про State, и только потом через какое-то время попалась задача, на которую я посмотрел, подумал — "О, так это ж состояния и переходы между ними, а не применить ли мне State" и применил, съэкономив кучу времени на разработке и поддержке


Обрати внимание на последовательность, описание State стало для тебя только шпаргалкой, про которую ты вовремя вспомнил. Собственно, это и есть, наверное, самый приемлемый способ "использования" паттернов: ассоциативное сопоставление. Правда, что-то мне подсказывает, что уж до чего-чего, а до State додуматься просто до элементарного.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[5]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 14:44
Оценка:
ГВ>А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.

Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: [C++] о паттернах (доп.)
От: Sorc17 Россия  
Дата: 23.05.11 17:40
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.


ГВ>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.


Ага, только если программист знает алгоритмы, то это само собой разумеющееся, а если не знает паттерны, то он профессионально непригоден. Почему так, если это почти одно и тоже?
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[7]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 18:04
Оценка:
Здравствуйте, Sorc17, Вы писали:

ГВ>>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.


S>Ага, только если программист знает алгоритмы, то это само собой разумеющееся, а если не знает паттерны, то он профессионально непригоден. Почему так, если это почти одно и тоже?


Это по чьему мнению программист, не знающий паттернов становится профессионально непригодным?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[6]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 23.05.11 18:05
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>>А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.

А можно название паттерна и вот это "сумбурно и противоречиво описанное" со ссылкой на источник?
А то у меня складывается впечатление, что я не про те паттерны читал.

ГВ>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.

Если серьезно, то мне не понятен смысл топика. Тут только Вами написано столько умных(я бы даже сказал заумных) фраз, что GoF на их фоне отдыхает. И все это как бы подталкивает читателя(особенно ленивого и долго проработавшего программером) в сторону ненадобности учить паттерны.
А ведь сам GoF не намного сложнее этого топика. Честно. Ну почему бы его не прочесть тем, кто не читал?
Чтобы потом в разговоре об архитектуре не говорить "State — а что это?" или "ну вот такая хреновина ..тут много тексту.. и кажется это даже паттерном прозвали". Это стыдно просто для старого программера. И это из реальных случаев(хотя в упрощенном виде. Реальность немного контрастнее)

А по поводу попыток тулить паттерны куда можно и куда нельзя у меня есть простое обьяснение. Вот оно:
Каждый паттерн состоит из трех частей:
1. Название и возможные алиасы
2. Конкретная задача для применения
3. Рекомендуемая реализация(возможны расхождения для разных языков программирования)

Так вот под знанием паттерна я предполагаю все ТРИ части. Они неразделимы.
Если я вижу попытку применения паттерна к любой задаче(как тут писалось — а какой бы паттерн сюда затулить) то это просто незнание паттернов и более того непонимание самой идеи паттернов. И паттерны тут совершенно не виноваты.

Посему всем кто еще не читал банду четырех, Фаулера и другие первоисточники описывающие различные паттерны, рекомендую почитать. А если сразу не пойдет — можно пока отложить но не очень далеко.
А с теми кто читал и применял(успешно и не очень) рад буду поспорить на эту тему с примерами из жизни. А с теми кто еще и рядом находится — и вообще с пивом
Проектирование велосипедов для слепых жирафов
Re[7]: [C++] о паттернах (доп.)
От: SleepyDrago Украина  
Дата: 23.05.11 18:10
Оценка: +1 :)
Здравствуйте, Sorc17, Вы писали:

S>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>>А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.


ГВ>>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.


S>Ага, только если программист знает алгоритмы, то это само собой разумеющееся, а если не знает паттерны, то он профессионально непригоден. Почему так, если это почти одно и тоже?

потому как те ворчуны вместо "банды 4х" под кофе/чай подставляли "алгоритмы + структуры данных..."
ps а я вообще дракошу подставлял и на тех и на тех смотрю с улыбкой
Re[8]: [C++] о паттернах (доп.)
От: Sorc17 Россия  
Дата: 23.05.11 18:19
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Здравствуйте, Sorc17, Вы писали:


ГВ>>>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.


S>>Ага, только если программист знает алгоритмы, то это само собой разумеющееся, а если не знает паттерны, то он профессионально непригоден. Почему так, если это почти одно и тоже?


ГВ>Это по чьему мнению программист, не знающий паттернов становится профессионально непригодным?


Работодателя из любой софтверной компании, имхо. Пример можно не только с алгоритмами-паттернами привести, кстати. Вот ещё, например, мне и "раньше" приходили в голову идеи о сохранении "без красноглазия" объекта в БД. А оказывается это уже давно придумали, обсосали и вовсю критикуют, а кто-то даже уже отказывается от этого (и такое мелькало да, не помню где). Думаю если я захочу куда-то устроится ява программистом, вообще в любое место, и скажу что не знаю что такое паттерны и хибернейт, то со мной даже разговаривать дальше не станут, чтобы не тратить время.
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[8]: [C++] о паттернах (доп.)
От: Sorc17 Россия  
Дата: 23.05.11 18:23
Оценка:
Здравствуйте, SleepyDrago, Вы писали:

SD>Здравствуйте, Sorc17, Вы писали:


S>>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>>>А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.


ГВ>>>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.


S>>Ага, только если программист знает алгоритмы, то это само собой разумеющееся, а если не знает паттерны, то он профессионально непригоден. Почему так, если это почти одно и тоже?

SD>потому как те ворчуны вместо "банды 4х" под кофе/чай подставляли "алгоритмы + структуры данных..."
SD>ps а я вообще дракошу подставлял и на тех и на тех смотрю с улыбкой

[off]Дайте пожму вашу когтистую лапу! Только у меня кефир.[/off]
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re[7]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 19:32
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

ГВ>>>А с алгоритмами всё вообще не так обстоит: с одной стороны у них есть достаточно точные оценки параметров, а с другой — синтез алгоритмов гораздо сложнее синтеза паттернов. Хотя бы потому, что паттерн вовсе не претендует на решение проблемы — это только так, приблизительное направление, зачастую сумбурно и противоречиво описанное.

___>А можно название паттерна и вот это "сумбурно и противоречиво описанное" со ссылкой на источник?
___>А то у меня складывается впечатление, что я не про те паттерны читал.

Собственно, в данном случае канон я не имел в виду... Хотя, с другой стороны — адаптер vs. мост vs. фасад. Я вот, например, нередко вижу их "органичное взаимопроникновение" в реальных условиях.

ГВ>>Собственно, разница между паттернами и алгоритмами — это примерно как разница между советами и предписаниями.

___>Если серьезно, то мне не понятен смысл топика. Тут только Вами написано столько умных(я бы даже сказал заумных) фраз, что GoF на их фоне отдыхает. И все это как бы подталкивает читателя(особенно ленивого и долго проработавшего программером) в сторону ненадобности учить паттерны.
___>А ведь сам GoF не намного сложнее этого топика. Честно. Ну почему бы его не прочесть тем, кто не читал?

А кто запрещает читать GoF? Читайте на здоровье! Только не ставьте лошадь позади телеги.

___>Чтобы потом в разговоре об архитектуре не говорить "State — а что это?" или "ну вот такая хреновина ..тут много тексту.. и кажется это даже паттерном прозвали". Это стыдно просто для старого программера. И это из реальных случаев(хотя в упрощенном виде. Реальность немного контрастнее)


Кстати, а ты сам по-простому сможешь сформулировать, что такое State?

___>А по поводу попыток тулить паттерны куда можно и куда нельзя у меня есть простое обьяснение. Вот оно:

___>Каждый паттерн состоит из трех частей:
___>1. Название и возможные алиасы
___>2. Конкретная задача для применения
___>3. Рекомендуемая реализация(возможны расхождения для разных языков программирования)

___>Так вот под знанием паттерна я предполагаю все ТРИ части. Они неразделимы.


О! Появилась первая красная тряпка: "рекомендуемая". Кто, когда и почему имеет наглость мне что-то рекомендовать и почему этот негодяй не имеет смелости подписаться под своей рекомендацией?

___>Если я вижу попытку применения паттерна к любой задаче(как тут писалось — а какой бы паттерн сюда затулить) то это просто незнание паттернов и более того непонимание самой идеи паттернов. И паттерны тут совершенно не виноваты.


Давай возьмём простую задачу. Допустим, у нас есть некоторая программа, в которой понадобился некий глобальный объект, подгружаемый из базы данных. Подгружается он достаточно долго и нужен не всегда, потому подкачивать его прямо на старте нет никакой необходимости. У этого объекта есть несколько методов, не зависящих от содержимого БД и парочка — которые от неё зависят. Допустим, так (код на C++, но это не существенно, можно и Java, и C#):

class ISomeObject {
public:
   // Не зависят от БД
   virtual bool ready() = 0;
   virtual bool beingLoaded() = 0;
   virtual SomeTimeStamp lastLoadTime() = 0;
   
   // Зависят от БД
   virtual void someIntegralData1(SomeoneData *) = 0;
   virtual void someIntegralData2(SomeoneData *) = 0;
   virtual void refresh() = 0;
protected:
   virtual ~ISomeObject(){}
};


Расширения интерфейса не предполагаются, максимум, добавится один-два метода, зависимых от БД. Параметры доступа к БД, полагаем, что определены где-то вовне. Сроки, как всегда — позавчера, но не далее, как завтра. Расскажи мне про процесс решения этой задачи с использованием паттернов. А я потом расскажу тебе о том же, но, в основном, без паттерновой терминологии.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 19:40
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>>>Ага, только если программист знает алгоритмы, то это само собой разумеющееся, а если не знает паттерны, то он профессионально непригоден. Почему так, если это почти одно и тоже?

ГВ>>Это по чьему мнению программист, не знающий паттернов становится профессионально непригодным?
S>Работодателя из любой софтверной компании, имхо.

У тебя неправильная имха, это раз. А два — те высказывания работодателей, которые они выносят в список требований к кандидатам — это давно уже грустный анекдот IT-индустрии. Тоже мне, нашёл пример...

S>Пример можно не только с алгоритмами-паттернами привести, кстати. Вот ещё, например, мне и "раньше" приходили в голову идеи о сохранении "без красноглазия" объекта в БД. А оказывается это уже давно придумали, обсосали и вовсю критикуют, а кто-то даже уже отказывается от этого (и такое мелькало да, не помню где).


Это ты не иначе, как о CRUD вспомнил?

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


Что-то мне подсказывает, что Hibernate и паттерны не стоит ставить в один ряд.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[8]: [C++] о паттернах (доп.)
От: Abyx Россия  
Дата: 23.05.11 20:39
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Давай возьмём простую задачу. Допустим, у нас есть некоторая программа, в которой понадобился некий глобальный объект, подгружаемый из базы данных. Подгружается он достаточно долго и нужен не всегда, потому подкачивать его прямо на старте нет никакой необходимости. У этого объекта есть несколько методов, не зависящих от содержимого БД и парочка — которые от неё зависят. Допустим, так (код на C++, но это не существенно, можно и Java, и C#):


ГВ>
ГВ>class ISomeObject {
ГВ>public:
ГВ>   // Не зависят от БД
ГВ>   virtual bool ready() = 0;
ГВ>   virtual bool beingLoaded() = 0;
ГВ>   virtual SomeTimeStamp lastLoadTime() = 0;
   
ГВ>   // Зависят от БД
ГВ>   virtual void someIntegralData1(SomeoneData *) = 0;
ГВ>   virtual void someIntegralData2(SomeoneData *) = 0;
ГВ>   virtual void refresh() = 0;
ГВ>protected:
ГВ>   virtual ~ISomeObject(){}
ГВ>};
ГВ>


ГВ>Расширения интерфейса не предполагаются, максимум, добавится один-два метода, зависимых от БД. Параметры доступа к БД, полагаем, что определены где-то вовне. Сроки, как всегда — позавчера, но не далее, как завтра. Расскажи мне про процесс решения этой задачи с использованием паттернов. А я потом расскажу тебе о том же, но, в основном, без паттерновой терминологии.


если подгружается долго — доступ должен быть асинхронным.
class SomeObjectWrap
{ 
  void async_use(function<void(SomeObjectWithoutFirstThreeMethods*)> handler);
}

async_use проверяет наличие объекта, таймстамп, если надо — загружает\перезагружает, и когда всё в порядке — вызывает handler, и передает ему обертку ISomeObject из которой выкинуты ненужные методы.

в коде это выглядит так
obj.async_use([=](SomeObjectWithoutFirstThreeMethods* obj){
  ....
});


async_use может быть не методом а функцией, принимающей ISomeObject&

То что объект глобальный — это значит что где-то около main() мы его создаем (может в CApplication), потом передаем SomeObjectWrap или ISomeObject туда где он нужен. Потому что синглтоны — зло.

непонятно как эта задача относится к паттернам %)
In Zen We Trust
Re[8]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 23.05.11 20:52
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Собственно, в данном случае канон я не имел в виду... Хотя, с другой стороны — адаптер vs. мост vs. фасад. Я вот, например, нередко вижу их "органичное взаимопроникновение" в реальных условиях.

Согласен. Есть такое между некоторыми паттернами.
Кстати понимание этого "взаимопроникновения" лично я рассматриваю как плюс к пониманию каждого паттерна в отдельности

ГВ>А кто запрещает читать GoF? Читайте на здоровье! Только не ставьте лошадь позади телеги.

Я за просто читать. Про впереди-сзади пока оставим

ГВ>Кстати, а ты сам по-простому сможешь сформулировать, что такое State?

Да. С точки зрения теории это конечный автомат.
С точки зрения С++ зто набор классов-наследников одного предка(база описывает обработку всех видов сообщений), описывающих конкретное состояние обьекта с возможностью перехода в другие состояния.
Если переход в другое состояние в рантайме убрать то получим патерн стратегия(это к слову о взаимопроникновинии)


ГВ>О! Появилась первая красная тряпка: "рекомендуемая". Кто, когда и почему имеет наглость мне что-то рекомендовать и почему этот негодяй не имеет смелости подписаться под своей рекомендацией?

Не понял в чем наглость? Есть многократно повторенная в реализации задача. Есть решение, которое в большинстве случаев — наилучшее. Его и предлагают в учебниках. Где наглость?


ГВ>Давай возьмём простую задачу. Допустим, у нас есть некоторая программа, в которой понадобился некий глобальный объект, подгружаемый из базы данных. Подгружается он достаточно долго и нужен не всегда, потому подкачивать его прямо на старте нет никакой необходимости. У этого объекта есть несколько методов, не зависящих от содержимого БД и парочка — которые от неё зависят. Допустим, так (код на C++, но это не существенно, можно и Java, и C#):


ГВ>
ГВ>class ISomeObject {
ГВ>public:
ГВ>   // Не зависят от БД
ГВ>   virtual bool ready() = 0;
ГВ>   virtual bool beingLoaded() = 0;
ГВ>   virtual SomeTimeStamp lastLoadTime() = 0;
   
ГВ>   // Зависят от БД
ГВ>   virtual void someIntegralData1(SomeoneData *) = 0;
ГВ>   virtual void someIntegralData2(SomeoneData *) = 0;
ГВ>   virtual void refresh() = 0;
ГВ>protected:
ГВ>   virtual ~ISomeObject(){}
ГВ>};
ГВ>


ГВ>Расширения интерфейса не предполагаются, максимум, добавится один-два метода, зависимых от БД. Параметры доступа к БД, полагаем, что определены где-то вовне. Сроки, как всегда — позавчера, но не далее, как завтра.

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

ГВ>Расскажи мне про процесс решения этой задачи с использованием паттернов. А я потом расскажу тебе о том же, но, в основном, без паттерновой терминологии.


Я понимаю, что ты собираешься выдать более простое решение на вчера, чем я предложу с учетом завтрашних изменений.
Но паттерны тут для меня пока не очень видны. Задача уж очень напоминает кусочек интерьера засвеченый фонариком в темной комнате. Давай свет включим. Давай рассмотрим сразу _все_ обьекты загружаемые из базы. Их связи. И на этом фоне необходимость лэйзи загрузки одного обьекта может сильно потускнеть с точки зрения архитектуры. А появятся на свет такие паттерны как DAO, ActiveRecord, UnitOfWork, Registry по отдельности или в комбинации друг с другом. И вот тут либо мы решаем задачу один раз для всех обьектов сразу либо каждый раз решаем микрозадачу не обращая внимания на остальной проект с невозможностью потом понять почему код загрузки очень похожего обьекта так сильно отличается от того, с чем мы только сейчас работали.
И как это будет без паттернов мне не надо рассказывать. Я этого видел столько, что тошнит. Это потом все либо переделывали либо оставляли, потому как архитектурные ошибки иногда так дороги, что дешевле годами потом вокруг подпорочки ставить с матюками в адрес торопящихся сдать вчера. Только вот эти торопящиеся вчера почему-то обычно не любят сегодня вспоминать как это было. Так статистический результат наблюдений. Компании меняются а результат — нет
Проектирование велосипедов для слепых жирафов
Re[9]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 23.05.11 20:53
Оценка:
Здравствуйте, Abyx, Вы писали:

A>непонятно как эта задача относится к паттернам %)


Cкажем так, я предполагаю, что эта задача может быть решена с использованием, как минимум, "рекомендуемых реализаций" (по выражению robin_of_the_wood) некоторых паттернов. Вполне возможно, что я ошибаюсь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[10]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 23.05.11 21:27
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>Cкажем так, я предполагаю, что эта задача может быть решена с использованием, как минимум, "рекомендуемых реализаций" (по выражению robin_of_the_wood) некоторых паттернов. Вполне возможно, что я ошибаюсь.


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

При упоминании базы у меня сразу срабатывают ассоциации с Фаулеровскими паттернами.
И кроме того синглтон — это наверно единственный из GoF паттернов, который я считаю антипаттерном.
Но не просто так, а только потому что я попробовал как минимум две замены этому этому паттерну.
Первая замена — это сервис локатор.
И это тоже кстати паттерн. Замена не всегда полная но даже если сам локатор является синглтоном(что не обязательно) то это единственный синглтон на все приложение. Все знают про него. Он не знает ни про кого(Медиатор кстати из GoF похожую задачу решает). И это уже гораздо лучше синглтона.
Вторая — это IoC или DI. Тут уже паттерном и не назвать наверно.
Даже без IoC контейнеров сам принцип очень интересен. А уж с ними совсем хорошо.
Но тут отдельная тема но она того стоит хотя и оффтоп
Проектирование велосипедов для слепых жирафов
Re[11]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.05.11 01:26
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>При упоминании базы у меня сразу срабатывают ассоциации с Фаулеровскими паттернами.

___>И кроме того синглтон — это наверно единственный из GoF паттернов, который я считаю антипаттерном.
___>Но не просто так, а только потому что я попробовал как минимум две замены этому этому паттерну.
___>Первая замена — это сервис локатор.
___>И это тоже кстати паттерн. Замена не всегда полная но даже если сам локатор является синглтоном(что не обязательно) то это единственный синглтон на все приложение. Все знают про него. Он не знает ни про кого(Медиатор кстати из GoF похожую задачу решает). И это уже гораздо лучше синглтона.
___>Вторая — это IoC или DI. Тут уже паттерном и не назвать наверно.

А в чем разница межде сервис локатором и IoC
Re[11]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.05.11 03:45
Оценка:
Здравствуйте, robin_of_the_wood,

Хм, Робин, я уж было собирался отказаться от затеи с примером, но...

ГВ>>Cкажем так, я предполагаю, что эта задача может быть решена с использованием, как минимум, "рекомендуемых реализаций" (по выражению robin_of_the_wood) некоторых паттернов. Вполне возможно, что я ошибаюсь.


___>Позволю сюда вклиниться, так как речь обо мне идет.

___>Если Вы предполагали, что слова про лэйзи загрузку в условии задачи послужат причиной сделать из предоставленного интерфейса синглтон, то Вы ошибались.

Ничего определённого я не предполагал, а если и предполагал, то озвучивать сейчас не буду.

___>При упоминании базы у меня сразу срабатывают ассоциации с Фаулеровскими паттернами.

___>И кроме того синглтон — это наверно единственный из GoF паттернов, который я считаю антипаттерном.
___>Но не просто так, а только потому что я попробовал как минимум две замены этому этому паттерну.
___>Первая замена — это сервис локатор.

То есть, ты предлагаешь реализовать в предложенной задаче service locator? Допустим. А чуть точнее можно?

___>И это тоже кстати паттерн. Замена не всегда полная но даже если сам локатор является синглтоном(что не обязательно) то это единственный синглтон на все приложение. Все знают про него. Он не знает ни про кого(Медиатор кстати из GoF похожую задачу решает). И это уже гораздо лучше синглтона.

___>Вторая — это IoC или DI. Тут уже паттерном и не назвать наверно.
___>Даже без IoC контейнеров сам принцип очень интересен. А уж с ними совсем хорошо.

Ну, для ясности можно назвать IoC-контейнер воплощением DI-паттерна — ИМХО, вполне приемлемо. То есть вариантов у тебя получается уже два?

___>Но тут отдельная тема но она того стоит хотя и оффтоп


Нет-нет, что ты. Какой же это оффтоп?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[9]: [C++] о паттернах (доп.)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 24.05.11 03:55
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>Собственно, в данном случае канон я не имел в виду... Хотя, с другой стороны — адаптер vs. мост vs. фасад. Я вот, например, нередко вижу их "органичное взаимопроникновение" в реальных условиях.

___>Согласен. Есть такое между некоторыми паттернами.
___>Кстати понимание этого "взаимопроникновения" лично я рассматриваю как плюс к пониманию каждого паттерна в отдельности

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

ГВ>>Кстати, а ты сам по-простому сможешь сформулировать, что такое State?

___>Да. С точки зрения теории это конечный автомат.
___>С точки зрения С++ зто набор классов-наследников одного предка(база описывает обработку всех видов сообщений), описывающих конкретное состояние обьекта с возможностью перехода в другие состояния.
___>Если переход в другое состояние в рантайме убрать то получим патерн стратегия(это к слову о взаимопроникновинии)

Честно говоря, я думал, что ты скажешь, что это сопоставление состояниям объекта наборов доступных методов. То есть в состоянии1 доступен набор1, в состоянии2 — набор2 и т.п. Такой себе не самый плохой метод снизить количество ошибок из-за обращения к неправильному методу.

ГВ>>О! Появилась первая красная тряпка: "рекомендуемая". Кто, когда и почему имеет наглость мне что-то рекомендовать и почему этот негодяй не имеет смелости подписаться под своей рекомендацией?

___>Не понял в чем наглость? Есть многократно повторенная в реализации задача. Есть решение, которое в большинстве случаев — наилучшее. Его и предлагают в учебниках. Где наглость?

Потому что в учебниках (по определению учебника) приводится иллюстрация. А превращение иллюстрации в "рекомендуемое" как раз и есть постановка лошади позади телеги.

ГВ>>Давай возьмём простую задачу.


[skip]

ГВ>>Расширения интерфейса не предполагаются, максимум, добавится один-два метода, зависимых от БД. Параметры доступа к БД, полагаем, что определены где-то вовне. Сроки, как всегда — позавчера, но не далее, как завтра.

___>Ох уж эти сроки
___>Не программиста это дело — про сроки думать. Он код правильный писать должен. Иногда нереально это. Согласен.

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

___>Но зато потом очень реально начальству указать, что если бы вчера, позавчера, или еще того раньше, написали подумав и не торопясь, то сегодня, завтра и послезавтра переписывать бы не пришлось. Это работает. Проверено на людях


Естественно, это работает. Работает, потому что вчера тобой было выдано нечто для proof of concept, и потому сегодня тебя согласны выслушать. Это вопрос доверия, как ты понимаешь. Ну и потом, не будь этого вчерашнего "мусора", вполне вероятно, что сегодня попросту нечего было бы переписывать.

ГВ>>Расскажи мне про процесс решения этой задачи с использованием паттернов. А я потом расскажу тебе о том же, но, в основном, без паттерновой терминологии.


___>Я понимаю, что ты собираешься выдать более простое решение на вчера, чем я предложу с учетом завтрашних изменений.

___>Но паттерны тут для меня пока не очень видны.

В соседнем сообщении уже озвучены и DI, и Service Locator.

___>Задача уж очень напоминает кусочек интерьера засвеченый фонариком в темной комнате. Давай свет включим. Давай рассмотрим сразу _все_ обьекты загружаемые из базы. Их связи.


База внешняя, стоит особняком, и плотная работа с ней не относится к обязанностям этой программы. В сущности, она вообще может быть где-то в интернете. Мы просто поднимаем некоторую информацию из СУБД по требованию.

___>И на этом фоне необходимость лэйзи загрузки одного обьекта может сильно потускнеть с точки зрения архитектуры. А появятся на свет такие паттерны как DAO, ActiveRecord, UnitOfWork, Registry по отдельности или в комбинации друг с другом. И вот тут либо мы решаем задачу один раз для всех обьектов сразу либо каждый раз решаем микрозадачу не обращая внимания на остальной проект с невозможностью потом понять почему код загрузки очень похожего обьекта так сильно отличается от того, с чем мы только сейчас работали.


Такие рассуждения я и сам умею разводить. Но иногда банан — это просто банан (c). Масштабной работы с данными не предвидится, так что, не нужно притягивать сюда то, чего нет в постановке задачи.

___>И как это будет без паттернов мне не надо рассказывать. Я этого видел столько, что тошнит. Это потом все либо переделывали либо оставляли, потому как архитектурные ошибки иногда так дороги, что дешевле годами потом вокруг подпорочки ставить с матюками в адрес торопящихся сдать вчера. Только вот эти торопящиеся вчера почему-то обычно не любят сегодня вспоминать как это было. Так статистический результат наблюдений. Компании меняются а результат — нет


Давай всё же не будем предполагать, что постановщик задачи совершил большую ошибку и выдал ошибочные ограничения. То есть, в наши планы не входит и в обозримой перспективе не будет входить расширение программы до такой, которая много работает с базой.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[12]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 24.05.11 17:20
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>А в чем разница межде сервис локатором и IoC

В этой самой инверсии. Когда мы юзаем локатор, то все компоненты знают о нем и запрашивают у него нужные сервисы.
Особенно нехорошо выглядит это все когда сервис запрашивается непосредственно перед использованием.
Прямо как у слепого со склерозом.
IoC основуется на том, что компоненты имеют параметры конструктора и/или сэттеры для получения зависимостей снаружи.
И очень часто эти зависимости выражены в виде интерфейсов. Суть тут в том что компонент не знает откуда зависимость приходит и часто не знает и точного типа(что очень помогает и при юнит тестировании и в повторном использовании). Кроме того IoC контейнер(или за неимением просто код из main()) проводит создание обьектов, раздачу связей с проверкой факта получения всеми всего с попутной вычиткой конфигов итд _до_ старта всей системы.
Это порой может очень упростить реализацию и позволяет правильно инициализировать и проверить многие вещи до старта.

Но вопрос кстати не совсем шутошный.
Потому как часто IoC контейнеры предоставляют интерфейс в стиле сервис локатора.
Но этот интерфейс — это просто альтернативный путь. Он не есть обязательный с точки зрения IoC.
В идеале при помощи него получают ссылку на какой нибуть рутовый компонент и вызывают у него какой нибуть Run()
Есть варианты и вообще обойтмсь без него.
Хотя обычно IoC контейнеры стараются подстроиться под готовые компоненты и это хорошо
Проектирование велосипедов для слепых жирафов
Re[10]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 24.05.11 17:57
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>Вопрос был о противоречивости описаний. Так вот, собственно, и пример путаницы: Proxy запросто может являться фасадом по совместительству, а фасад с лёгкостью может нести обязанности адаптера.

Погоди. Давай по порядку.
У прокси есть критерий. Прокси обладает интерфейсом проксируемой сущности. Иначе это не прокси.
Его задача — быть подставленым вместо проксируемого обьекта.
Фасад — это сборная солянка — интерфейс подсистемы то есть некая сумма или обьединениие.
Адаптер это преобразователь одного в другое.
Я не вижу тут путаницы и противоречий

ГВ>Честно говоря, я думал, что ты скажешь, что это сопоставление состояниям объекта наборов доступных методов. То есть в состоянии1 доступен набор1, в состоянии2 — набор2 и т.п. Такой себе не самый плохой метод снизить количество ошибок из-за обращения к неправильному методу.

Методов везде одинаковое количество.
Выигрыш по отношению к реализации на ифах или свитчах в том что при необходимости изменить поведение в определенном состоянии мы меняем только соответствующий класс не боясь по ошибке задеть чего-то лишнее. Когда код чужой и сложный — это многого стоит

ГВ>Потому что в учебниках (по определению учебника) приводится иллюстрация. А превращение иллюстрации в "рекомендуемое" как раз и есть постановка лошади позади телеги.

Есть вещи которые проще и дешевле выучить чем вывести самому. Я заметьте за выучить. А не нравится — не юзай

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

Не знаю насчет светлых и темных идеалов. А в реальности обычно либо хорошо либо плохо выполненая работа.
Причем очень часто в случае "плохо" исполнитель и представления не имел о том что бывает лучше.

ГВ>Естественно, это работает. Работает, потому что вчера тобой было выдано нечто для proof of concept, и потому сегодня тебя согласны выслушать. Это вопрос доверия, как ты понимаешь. Ну и потом, не будь этого вчерашнего "мусора", вполне вероятно, что сегодня попросту нечего было бы переписывать.

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

ГВ>В соседнем сообщении уже озвучены и DI, и Service Locator.


ГВ>База внешняя, стоит особняком, и плотная работа с ней не относится к обязанностям этой программы. В сущности, она вообще может быть где-то в интернете. Мы просто поднимаем некоторую информацию из СУБД по требованию.


ГВ>Такие рассуждения я и сам умею разводить. Но иногда банан — это просто банан (c). Масштабной работы с данными не предвидится, так что, не нужно притягивать сюда то, чего нет в постановке задачи.


ГВ>Давай всё же не будем предполагать, что постановщик задачи совершил большую ошибку и выдал ошибочные ограничения. То есть, в наши планы не входит и в обозримой перспективе не будет входить расширение программы до такой, которая много работает с базой.


Извини но задачи для разговора о паттернах я не увидел. Был один интерфейс и упоминание про лэйзи загрузку с некоторыми уточнениями. Этого мало. DI и ServiceLocator — это общей архитектуры касаются. Их нельзя применять для одного обьекта и не применять для всех остальных.
Задача больше похожа на быстрый фикс. Из области "Посмотри как сделано вокруг. Быстро поправь с минимумом изменений." Паттерны тут не нужны.
Но это совсем не значит что они нигде не нужны
Проектирование велосипедов для слепых жирафов
Re[12]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 24.05.11 18:17
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Хм, Робин, я уж было собирался отказаться от затеи с примером, но...

ГВ>Ничего определённого я не предполагал, а если и предполагал, то озвучивать сейчас не буду.
Я не возражаю

ГВ>То есть, ты предлагаешь реализовать в предложенной задаче service locator? Допустим. А чуть точнее можно?

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

ГВ>Ну, для ясности можно назвать IoC-контейнер воплощением DI-паттерна — ИМХО, вполне приемлемо. То есть вариантов у тебя получается уже два?

Да. Но вариантов замены синглтона а не вариантов решения Вашей задачи. Увы

___>>Но тут отдельная тема но она того стоит хотя и оффтоп

ГВ>Нет-нет, что ты. Какой же это оффтоп?
DI и ServiceLocator — реально интересные темы.
Я бы даже смог придумать полуреальную-полутестовую задачу типа фасада персистент слоя из DAO обьектов с пулом соединений с DB.
Скажем на базе OCCI. Ведь не такая уж и фантастическая задача. И вот там место для паттернов реально есть и по делу. Но это больше на статью про IoC тянет если честно
Проектирование велосипедов для слепых жирафов
Re[13]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.05.11 18:31
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, Ikemefula, Вы писали:


I>>А в чем разница межде сервис локатором и IoC

___>В этой самой инверсии. Когда мы юзаем локатор, то все компоненты знают о нем и запрашивают у него нужные сервисы.
IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

___>IoC основуется на том, что компоненты имеют параметры конструктора и/или сэттеры для получения зависимостей снаружи.

Вот тут ты описываешь DI контейнер.
___>И очень часто эти зависимости выражены в виде интерфейсов. Суть тут в том что компонент не знает откуда зависимость приходит и часто не знает и точного типа(что очень помогает и при юнит тестировании и в повторном использовании). Кроме того IoC контейнер(или за неимением просто код из main()) проводит создание обьектов, раздачу связей с проверкой факта получения всеми всего с попутной вычиткой конфигов итд _до_ старта всей системы.
_до_ старта — совсем не обязательно.

___>Но вопрос кстати не совсем шутошный.

___>Потому как часто IoC контейнеры предоставляют интерфейс в стиле сервис локатора.
да, т.к. сервис-локатор тоже может быть контейнером.
___>Но этот интерфейс — это просто альтернативный путь. Он не есть обязательный с точки зрения IoC.
Верно. контейнеры не обязательны для IoC.
Re[13]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.05.11 18:49
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

I>>А в чем разница межде сервис локатором и IoC

___>В этой самой инверсии. Когда мы юзаем локатор, то все компоненты знают о нем и запрашивают у него нужные сервисы.

Вообще то сервис локатор это и есть одна из реализаций IoC.

Обычный код
DependencyA a = new DependencyA();
DependencyB b = new DependencyB();
DependencyC c = new DependencyC();
DependencyD d = new DependencyD();

Target t = new T(a,b);

t.d = d;
t.Prepare(c);


т.е. депенденсы хардкодим, передаём сами, нужно знать всякие подробности, создание вместе с использованием

IoC с помощью сервислокатора

// конфигурация
locator.Register(new DependencyA());
locator.Register(new DependencyB());
locator.Register(new DependencyC());
locator.Register(new DependencyD());

//использование
Target t = new T(locator);

t.Prepare(locator.Resolve(typeof(IC)));

// реализация

ctor(Locator locator)
{
  this.a = locator.Resolve(typeof(IA));
  this.a = locator.Resolve(typeof(IB));
  this.a = locator.Resolve(typeof(IC));
  this.a = locator.Resolve(typeof(ID));
}


итого — депенденсы кофигурируются, передавать их не надо, только локатор, не надо знать подробности, создание отделено от использования

IoC с помощью инжекции ака true-инверсия, потому что сервис локатор инвертирует не до конца — кое какие подробности таки надо знать, кое какие депенденсы хардкодятся, анпример сам локатор и кое какие шаги инициализации надо таки хардкодить, например конструктор и операции

// конфигурация аналогична локатору, добавляется одна строка
di.ConfigureCreate(typeof(Target)).Setup((t,d) => t.Prepare(d.Resolve(typeof(IC))));

//использование
Target t = di.Resolve(typeof(Target))

// реализация и интерфейс Target может быть любой из тех, которые понятны используемому di, как правило - почти любой.


Итого — не надо знать практически ничего, создание полностью отделяется от использование, никаких лишних депенденсов в т.ч. от di нет. Т.е. не надо знать ни про конструкторы, ни про операции.
+ на di можно навесить управление временем жизни, маппинг всякой дряни и тд и тд.
Re[14]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 24.05.11 19:37
Оценка:
Здравствуйте, samius, Вы писали:

S>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

Я это не первый раз слышу, но я с этим не согласен.
Сервис локатор никакого отношения ни к IoC ни к DI не имеет. Там нет инверсии.
Компонент получает зависимости из известного ему источника — репозитория зарегистрированных сервисов.
Это почти что использование синглтонов но только все сведены в одно место. Компонент знает про репозиторий сервисов.
Да можно передать интерфейс с доступом к репозиторию(упростив подмену реализации) но поиск сервиса будет производить сам компонент.
А это дополнительная ответственность. Нарушение SRP и очень много лишнего кода ничего общего не имеющего с основной задачей компонента.

В IoC компонент не знает ни про репозиторий и про что другое. Он позволяет чему-то внешнему установить зависимости. И все.
Вот это и есть инверсия. Компонент не связан ни с чем. Он имеет либо параметры конструктора либо сэттеры.
При использовании интерфейсов в этих параметрах и/или сэттерах связь с внешним миром минимальна.
IoC и DI — это синонимы. И инверсия и инжекция предполагают что связь устанавливается снаружи.
Компонент не имеет этой ответственности. И это критерий. Дайте мне то, что мне нужно и не моя проблема как это будет сделано.
В случае же сервис локатора это не так.

Путаницу вносят контейнеры IoC которые предоставляют доступ к внутреннему репозиторию своих компонентов.
Но такой контейнер может выполнять все свои функции и без этого доступа.
Проектирование велосипедов для слепых жирафов
Re[15]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 24.05.11 20:46
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, samius, Вы писали:


S>>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

___>Я это не первый раз слышу, но я с этим не согласен.
___>Сервис локатор никакого отношения ни к IoC ни к DI не имеет. Там нет инверсии.
Инверсию обеспечивает IoC. А DI и SL — это паттерны подключения зависимостей. Ни SL ни DI сами по себе никакой инверсии не должны обеспечивать. Они могут вообще быть предназначены для управления временем жизни компонентов, а не для инверсии.

___>Компонент получает зависимости из известного ему источника — репозитория зарегистрированных сервисов.

В этом отличие DI от SL.

___>В IoC компонент не знает ни про репозиторий и про что другое. Он позволяет чему-то внешнему установить зависимости. И все.

Это специфика паттерна DI. Для IoC способ подачи зависимостей не важен. Лишь бы компонент не инстанциировал свои зависимости сам.

___>Вот это и есть инверсия. Компонент не связан ни с чем. Он имеет либо параметры конструктора либо сэттеры.

Это DI.
___>При использовании интерфейсов в этих параметрах и/или сэттерах связь с внешним миром минимальна.
___>IoC и DI — это синонимы. И инверсия и инжекция предполагают что связь устанавливается снаружи.
Впрыск и инверсия существуют независимо друг от друга, хоть и часто используются вместе. Пример инверсии без впрыска — положить зависимость в глобальную переменную.

___>Компонент не имеет этой ответственности. И это критерий. Дайте мне то, что мне нужно и не моя проблема как это будет сделано.

___>В случае же сервис локатора это не так.
Ну как же? То же самое "дайте мне то". Разница лишь в том что компонент знает кого просить. Схожесть в том, что он не знает, что за реализацию ему подадут.

___>Путаницу вносят контейнеры IoC которые предоставляют доступ к внутреннему репозиторию своих компонентов.

___>Но такой контейнер может выполнять все свои функции и без этого доступа.

Я привел примеры впрыска без инверсии, инверсии без впрыска. Какая тут путаница?
Re[15]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 24.05.11 21:22
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, samius, Вы писали:


S>>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

___>Я это не первый раз слышу, но я с этим не согласен.
___>Сервис локатор никакого отношения ни к IoC ни к DI не имеет. Там нет инверсии.

Есть инверсия и я показал это на примере.
Re[16]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 24.05.11 22:52
Оценка:
Здравствуйте, samius, Вы писали:

___>>В IoC компонент не знает ни про репозиторий и про что другое. Он позволяет чему-то внешнему установить зависимости. И все.

S>Это специфика паттерна DI. Для IoC способ подачи зависимостей не важен. Лишь бы компонент не инстанциировал свои зависимости сам.

Я вижу разное понимание одних и тех же терминов.
По этому поводу много разных точек зрения. Причем в некоторых русскоязычных ресурсах присутствуют явные огрехи перевода
Чтобы не спорить о правильности приведу свой первоисточник
Мне наиболее последовательным и непротиворечивым показался Фаулер

здесь

Вот выдержка про IoC DI ServiceLocator

As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator, and I'll discuss that after I'm done with explaining Dependency Injection.

В первом абзаце сказано, что IoC == DI
Во втором абзаце указано что SL — альтернативный IoC путь для уменьшения зависимостей

Дальше спорить бесполезно
Проектирование велосипедов для слепых жирафов
Re[11]: [C++] о паттернах (противоречия)
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 25.05.11 01:52
Оценка: +1
Здравствуйте, robin_of_the_wood, Вы писали:

___>Я не вижу тут путаницы и противоречий


Позволю себе парочку цитат, здесь я должен извиниться, что поленился поискать их пару дней назад.

Фасад:

Проблема: Как обеспечить унифицированный интерфейс с набором разрозненных реализаций или интерфейсов, например, с подсистемой, если нежелательно высокое связывание с этой подсистемой или реализация подсистемы может измениться?
Решение: Определить одну точку взаимодействия с подсистемой — фасадный объект, обеспечивающий общий интерфейс с подсистемой и возложить на него обязанность по взаимодействию с ее компонентами. Фасад — это внешний объект, обеспечивающий единственную точку входа для служб подсистемы. Реализация других компонентов подсистемы закрыта и не видна внешним компонентам. Фасадный объект обеспечивает реализацию паттерна "Устойчивый к изменениям" с точки зрения защиты от изменений в реализации подсистемы., см. п. 3.1.9.


Адаптер:

Проблема: Необходимо обеспечить взаимодействие несовместимых интерфейсов или как создать единый устойчивый интерфейс для нескольких компонентов с разными интерфейсами.
Решение: Конвертировать исходный интерфейс компонента к другому виду с помощью промежуточного объекта — адаптера, то есть, добавить специальный объект с общим интерфейсом в рамках данного приложения и перенаправить связи от внешних обьектов к этому объекту — адаптеру.


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

ГВ>>Честно говоря, я думал, что ты скажешь, что это сопоставление состояниям объекта наборов доступных методов. То есть в состоянии1 доступен набор1, в состоянии2 — набор2 и т.п. Такой себе не самый плохой метод снизить количество ошибок из-за обращения к неправильному методу.

___>Методов везде одинаковое количество.
___>Выигрыш по отношению к реализации на ифах или свитчах в том что при необходимости изменить поведение в определенном состоянии мы меняем только соответствующий класс не боясь по ошибке задеть чего-то лишнее. Когда код чужой и сложный — это многого стоит

На мой взгляд, это очень спорное утверждение. Поскольку состояние объекта представляется набором классов, то я, к примеру, не вижу больших препятствий к тому, чтобы дать возможность пользователю класса оперировать состояниями непосредственно. Собственно, именно так оно и происходит внутри класса, реализующего State, осталось сделать ещё один шаг и вынести интерфейсы состояний наружу. Получится нечто, смахивающее на Visitor.

ГВ>>Потому что в учебниках (по определению учебника) приводится иллюстрация. А превращение иллюстрации в "рекомендуемое" как раз и есть постановка лошади позади телеги.

___>Есть вещи которые проще и дешевле выучить чем вывести самому. Я заметьте за выучить. А не нравится — не юзай

Структуры (в широком смысле этого слова), предлагаемые паттернами, выводятся не просто, а очень просто. Во всяком случае — GoF-овские. Вопрос в запасе времени на их реализацию. И по части "выучить"... Хм. Замнём для ясности.

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

___>Не знаю насчет светлых и темных идеалов. А в реальности обычно либо хорошо либо плохо выполненая работа.
___>Причем очень часто в случае "плохо" исполнитель и представления не имел о том что бывает лучше.

В реальности бывает по-разному. Бывает и так, что глядя на программу после нескольких лет развития буквально видишь, как менялись требования к ней. Понятно, что имея перед глазами полную историю развития продукта легко рассуждать о том, как "надо было" делать — задним числом все умные.

ГВ>>Естественно, это работает. Работает, потому что вчера тобой было выдано нечто для proof of concept, и потому сегодня тебя согласны выслушать. Это вопрос доверия, как ты понимаешь. Ну и потом, не будь этого вчерашнего "мусора", вполне вероятно, что сегодня попросту нечего было бы переписывать.

___>Да вот как-то ни разу не встречал ситуации где нечего переписывать. Чаще этого _так_ много, что даже самые большие оптимисты боятся заикнуться

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

ГВ>>Давай всё же не будем предполагать, что постановщик задачи совершил большую ошибку и выдал ошибочные ограничения. То есть, в наши планы не входит и в обозримой перспективе не будет входить расширение программы до такой, которая много работает с базой.


___>Извини но задачи для разговора о паттернах я не увидел. Был один интерфейс и упоминание про лэйзи загрузку с некоторыми уточнениями. Этого мало. DI и ServiceLocator — это общей архитектуры касаются. Их нельзя применять для одного обьекта и не применять для всех остальных.

___>Задача больше похожа на быстрый фикс. Из области "Посмотри как сделано вокруг. Быстро поправь с минимумом изменений." Паттерны тут не нужны.

Ладно, шут с ней, с задачей. На самом деле, идея с таким примером была неудачной. Больше того, я почти повторил ошибку одного из своих оппонентов по этой дискуссии.

___>Но это совсем не значит что они нигде не нужны


Я и не говорил, что паттерны не нужны. Как минимум, в качестве краткого справочника по терминам — вполне.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[17]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.05.11 04:35
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, samius, Вы писали:


___>Я вижу разное понимание одних и тех же терминов.

___>По этому поводу много разных точек зрения. Причем в некоторых русскоязычных ресурсах присутствуют явные огрехи перевода
___>Чтобы не спорить о правильности приведу свой первоисточник
___>Мне наиболее последовательным и непротиворечивым показался Фаулер
У Фаулера много воды, его каждый понимает как хочет.

___>здесь


___>Вот выдержка про IoC DI ServiceLocator


___>

___>As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

___>I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator, and I'll discuss that after I'm done with explaining Dependency Injection.

___>В первом абзаце сказано, что IoC == DI
Там такого не сказано. Там сказано что this pattern они решили называть DI. А что они подразумевают под this pattern — читай выше. И там же сказано, что IoC — слишком общий термин для обозначения DI, с чем я согласен.
___>Во втором абзаце указано что SL — альтернативный IoC путь для уменьшения зависимостей
Там сказано что SL тоже может удалять зависимость от релизации плагина, и только лишь.

___>Дальше спорить бесполезно

Конечно. Ведь ты споришь со своим первоисточником.

There is some confusion these days over the meaning of inversion of control due to the rise of IoC containers; some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.

Выше он показывает множество примеров IoC без впрыска.
Re[17]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.05.11 09:39
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:


___>

___>As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

___>I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator, and I'll discuss that after I'm done with explaining Dependency Injection.

___>В первом абзаце сказано, что IoC == DI

Нет, там такого как раз и не сказано. Там сказано, что IoC > DI

Поскольку IoC шире, чем просто DI, логично предположить, что есть еще IoC но не DI, и, опаньки !, таким оказывается сервис локатор.

Соотвественно, если человек путает == и >= , c ним нет смысла спорить
Re[12]: [C++] о паттернах (противоречия)
От: robin_of_the_wood Россия  
Дата: 25.05.11 16:45
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Как ты думаешь, есть ли большая разница между "Определить одну точку взаимодействия с подсистемой — фасадный объект" и "Конвертировать исходный интерфейс компонента к другому виду с помощью промежуточного объекта — адаптера"? Если, скажем, целая подсистема накрыта некоторым общим интерфейсным классом — это адаптер или фасад? А если для подсистемы потребовалось несколько фасадов? А если среди классов подсистемы есть какой-то, интерфейс которого выглядит точно так же, как накрывающий — это прокси?


Я это понимаю и почти полностью с этим согласен, но ни путаницы ни противоречий по прежнему не вижу.
Если синглтон дает досуп к фабрике, разве он перестает быть синглтоном или фабрикой? Не думаю. О чем тут спорить?
Ситуаций можно много придумать а часто и придумывать не надо.
В любом случае в каждой конкретной ситуации еще и голова нужна во включеном состоянии.
И с ней паттерны не помешают а без нее — не помогут.
А дальше на это можно смотреть с разных точек зрения и находить мелкие расхождения. Но смысла я не вижу.

ГВ>Я и не говорил, что паттерны не нужны. Как минимум, в качестве краткого справочника по терминам — вполне.

Ну вот выходит, что по крупному разногласий то и нет
Проектирование велосипедов для слепых жирафов
Re[18]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 25.05.11 17:11
Оценка:
Здравствуйте, Ikemefula, Вы писали:

___>>

___>>As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

___>>I'm going to start by talking about the various forms of dependency injection, but I'll point out now that that's not the only way of removing the dependency from the application class to the plugin implementation. The other pattern you can use to do this is Service Locator, and I'll discuss that after I'm done with explaining Dependency Injection.

___>>В первом абзаце сказано, что IoC == DI

I>Нет, там такого как раз и не сказано. Там сказано, что IoC > DI

Вопрос в том, насколько больше. Я считаю что совершенно незначительно. На уровне неточности формулировок.


I>Поскольку IoC шире, чем просто DI, логично предположить, что есть еще IoC но не DI, и, опаньки !, таким оказывается сервис локатор.


Давайте Ваши логичные предположения оставим в стороне.
Можно конкретнее про "опаньки"? И почему именно ServiceLocator? Может мы переводим по разному?

Приведите цитату из того-же Фаулера к примеру. Я соглашусь что был не прав и пересмотрю свои взгляды на терминологию.
В противном случае можно с такой-же обоснованностью утверждать что угодно и спорить до посинения.

В обоих случае спорить дальше не о чем.
Проектирование велосипедов для слепых жирафов
Re[18]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 25.05.11 17:50
Оценка:
Здравствуйте, samius, Вы писали:

S>У Фаулера много воды, его каждый понимает как хочет.

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

___>>В первом абзаце сказано, что IoC == DI

S>Там такого не сказано. Там сказано что this pattern они решили называть DI. А что они подразумевают под this pattern — читай выше. И там же сказано, что IoC — слишком общий термин для обозначения DI, с чем я согласен.

Ладно расширим цитату до ближайшего заголовка, чтобы разгадать тайну загадочного "this pattern"

Inversion of Control
When these containers talk about how they are so useful because they implement "Inversion of Control" I end up very puzzled. Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.

The question, is what aspect of control are they inverting? When I first ran into inversion of control, it was in the main control of a user interface. Early user interfaces were controlled by the application program. You would have a sequence of commands like "Enter name", "enter address"; your program would drive the prompts and pick up a response to each one. With graphical (or even screen based) UIs the UI framework would contain this main loop and your program instead provided event handlers for the various fields on the screen. The main control of the program was inverted, moved away from you to the framework.

For this new breed of containers the inversion is about how they lookup a plugin implementation. In my naive example the lister looked up the finder implementation by directly instantiating it. This stops the finder from being a plugin. The approach that these containers use is to ensure that any user of a plugin follows some convention that allows a separate assembler module to inject the implementation into the lister.

As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

Ну так кто же этот незнакомец "this pattern"? Пусть он будет у каждого свой


___>>Во втором абзаце указано что SL — альтернативный IoC путь для уменьшения зависимостей

S>Там сказано что SL тоже может удалять зависимость от релизации плагина, и только лишь.
Вот именно. И только. Почему SL вдруг начали причислять к IoC?
Это альтернатива IoC а не его подвид. Вот предмет нашего спора.


S>Выше он показывает множество примеров IoC без впрыска.

Выше показаны примеры уменьшения зависимостей. Там про IoC ни слова нет.
До приведенной мной главы IoC не упоминается

Ну да ладно. Если на разногласия с SL глаза прикрыть, то собственно и спорить то не о чем. Зато IoC попиарили
Проектирование велосипедов для слепых жирафов
Re[19]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.05.11 18:20
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, samius, Вы писали:


S>>У Фаулера много воды, его каждый понимает как хочет.

___>Дико извиняюсь, но я там воды не увидел.
___>А в том, что понимают по разному скорее виноваты авторы множества переводных статей на эту тему, которые не совсем понимают о чем пишут.
О, нашли виноватых

___>>>В первом абзаце сказано, что IoC == DI

S>>Там такого не сказано. Там сказано что this pattern они решили называть DI. А что они подразумевают под this pattern — читай выше. И там же сказано, что IoC — слишком общий термин для обозначения DI, с чем я согласен.

___>Ладно расширим цитату до ближайшего заголовка, чтобы разгадать тайну загадочного "this pattern"

А я ее прокомментирую.

___>

___>Inversion of Control
___>When these containers talk about how they are so useful because they implement "Inversion of Control" I end up very puzzled. Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.

___>The question, is what aspect of control are they inverting? When I first ran into inversion of control, it was in the main control of a user interface. Early user interfaces were controlled by the application program. You would have a sequence of commands like "Enter name", "enter address"; your program would drive the prompts and pick up a response to each one. With graphical (or even screen based) UIs the UI framework would contain this main loop and your program instead provided event handlers for the various fields on the screen.

Это можно пропустить, ибо малосодержательно касательно предмета обсуждения.

The main control of the program was inverted, moved away from you to the framework.

На этом этапе IoC уже состоялся. Это можно понять по времени, в котором написана фраза.

___>For this new breed of containers the inversion is about how they lookup a plugin implementation. In my naive example the lister looked up the finder implementation by directly instantiating it. This stops the finder from being a plugin.

Заметь, IoC уже состоялся, но возникла другая проблема — в установке зависимости.

The approach that these containers use is to ensure that any user of a plugin follows some convention that allows a separate assembler module to inject the implementation into the lister.

И вот ее решение. Обозначим его (*).

___>As a result I think we need a more specific name for this pattern. Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

И этому решению дают более специфичное имя.
___>Ну так кто же этот незнакомец "this pattern"? Пусть он будет у каждого свой
Под "this pattern" я понимаю нечто, обозначенное (*).


___>>>Во втором абзаце указано что SL — альтернативный IoC путь для уменьшения зависимостей

S>>Там сказано что SL тоже может удалять зависимость от релизации плагина, и только лишь.
___>Вот именно. И только. Почему SL вдруг начали причислять к IoC?
Его не стали причислять к IoC, его причисляют к IoC контейнеру. Но SL может работать и не для инверсии вовсе.
___>Это альтернатива IoC а не его подвид. Вот предмет нашего спора.
Ты понимаешь под IoC впрыск, а не инверсию.
Для тебя Фаулер написал "some people confuse the general principle here with the specific styles of inversion of control", но ты решил поскипать это и не комментировать. Странное избирательное внимание к твоему же первоисточнику.

S>>Выше он показывает множество примеров IoC без впрыска.

___>Выше показаны примеры уменьшения зависимостей. Там про IoC ни слова нет.
___>До приведенной мной главы IoC не упоминается
А я тебя просил почитать здесь, выше абзаца "There is some confusion these days over the meaning of inversion of control due to the rise of IoC containers"

___>Ну да ладно. Если на разногласия с SL глаза прикрыть, то собственно и спорить то не о чем. Зато IoC попиарили

Я не спорю. Я указываю на неверное понимание тобой используемых терминов. До согласования терминологии спорить о чем-либо бессмысленно, т.к. твое понимание отличается даже от источника, на который ты ссылаешься.
Re[16]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 25.05.11 18:22
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, robin_of_the_wood, Вы писали:


S>>>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

___>>Я это не первый раз слышу, но я с этим не согласен.
___>>Сервис локатор никакого отношения ни к IoC ни к DI не имеет. Там нет инверсии.

I>Есть инверсия и я показал это на примере.

В примере у Вас локатор сам инжектится.
И инверсия там действительно есть, но не потому, что локатор а потому, что инжектится.
Если в этом примере убрать локатор и заменить на фэктори, то инверсия останется. Но фэктори тут не при чем будет.

И если убрать все, а оставить только локатор — то он будет выполнять свою роль без особых проблем.
Я не однажды встречал его использование(и очень удачное кстати) в проектах, где ни про инжекцию, ни про инверсию и ни про контейнеры никто и не слышал.

Это все к тому, что если вспомнить с чего весь сыр-бор начался
I>А в чем разница между сервис локатором и IoC

Надеюсь сейчас о том что разницы никакой нет никто мне не скажет (даже учитывая разногласия в терминологии)
Проектирование велосипедов для слепых жирафов
Re[20]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 25.05.11 19:02
Оценка:
Здравствуйте, samius, Вы писали:

Извините но после трактовки этой загадочной фразы не смог удержаться

S>Под "this pattern" я понимаю нечто, обозначенное (*).

А при помощи русского языка это нечто выразить никак нельзя?

___>>>>Во втором абзаце указано что SL — альтернативный IoC путь для уменьшения зависимостей

S>>>Там сказано что SL тоже может удалять зависимость от релизации плагина, и только лишь.
___>>Вот именно. И только. Почему SL вдруг начали причислять к IoC?
S>Его не стали причислять к IoC, его причисляют к IoC контейнеру. Но SL может работать и не для инверсии вовсе.
___>>Это альтернатива IoC а не его подвид. Вот предмет нашего спора.
S>Ты понимаешь под IoC впрыск, а не инверсию.
Да именно так. IoC == DI и все становится на свои места. Без умничания и домысливаний
Потому как никто мне не может обьяснить эту призрачную разницу без фантазий и того, чего словами не передать.
Пока я видел только попытку обьяснить это якобы неравенство наличием SL (примерно IoC == DI + SL)
которую Вы же (см. выделенное) опровергаете.


S>Для тебя Фаулер написал "some people confuse the general principle here with the specific styles of inversion of control", но ты решил поскипать это и не комментировать. Странное избирательное внимание к твоему же первоисточнику.

Это общая фраза. Явно различия между IoC и DI нигде не описано. Потому что его нет.

Покажите мне фразу типа "Кроме DI IoC может быть реализован при помощи XXXX"
Я встречал подобные фразы со ссылкой именно на обсуждаемую тут статью Фаулера. Но у Фаулера НЕТ ничего подобного.
Предложения типа "some people confuse the general principle..." — не аргумент.

Согласен с тем, что возможно я неправильно трактую Фаулера.
Но моя трактовка не содержит фантазий, домыслов и вещей, которые при помоши языка не выразить
Проектирование велосипедов для слепых жирафов
Re[17]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.05.11 19:12
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

I>>Есть инверсия и я показал это на примере.

___>В примере у Вас локатор сам инжектится.

Локатор можно инжектить, можно синглтоном сделать — разницы абсолютно никакой, т.к. все равно есть жосткая депендеси.

___>И инверсия там действительно есть, но не потому, что локатор а потому, что инжектится.


Инверсия это примерно так — депенденси хардкодятся или конфигурируются.

___>И если убрать все, а оставить только локатор — то он будет выполнять свою роль без особых проблем.

___>Я не однажды встречал его использование(и очень удачное кстати) в проектах, где ни про инжекцию, ни про инверсию и ни про
контейнеры никто и не слышал.

И что с того ? Название оно в книге, а принципы давно известные — отделение инициализации от использования, ослабление депенденсов и тд и тд и тд

___>Это все к тому, что если вспомнить с чего весь сыр-бор начался

I>>А в чем разница между сервис локатором и IoC

___>Надеюсь сейчас о том что разницы никакой нет никто мне не скажет (даже учитывая разногласия в терминологии)


Разница в том, что IoC более общий термин, вот и всё.
Re[19]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 25.05.11 19:27
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

I>>Нет, там такого как раз и не сказано. Там сказано, что IoC > DI

___>Вопрос в том, насколько больше. Я считаю что совершенно незначительно. На уровне неточности формулировок.

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

Т.е. DI это Push-IoC, локатор это Pull-IoC.

I>>Поскольку IoC шире, чем просто DI, логично предположить, что есть еще IoC но не DI, и, опаньки !, таким оказывается сервис локатор.


___>Давайте Ваши логичные предположения оставим в стороне.

___>Можно конкретнее про "опаньки"? И почему именно ServiceLocator? Может мы переводим по разному?

Потому что сервис локатор так же оказывается IoС ибо даёт ту же самую инверсию, если копать от депенденсов, а не способа инстанцирования. см выше

___>Приведите цитату из того-же Фаулера к примеру. Я соглашусь что был не прав и пересмотрю свои взгляды на терминологию.

___>В противном случае можно с такой-же обоснованностью утверждать что угодно и спорить до посинения.

Дался тебе этот фаулер. Открой Физерса и посмотри, что такое депенденси и какое влияние это оказывает на код. Отсюда станет ясно, что такое IoC.
Re[21]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.05.11 19:34
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, samius, Вы писали:


___>Извините но после трактовки этой загадочной фразы не смог удержаться


S>>Под "this pattern" я понимаю нечто, обозначенное (*).

___>А при помощи русского языка это нечто выразить никак нельзя?
Ты мне приводишь ссылки на английском, потому я полагал что английский ты понимаешь.

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

___>>>Это альтернатива IoC а не его подвид. Вот предмет нашего спора.

S>>Ты понимаешь под IoC впрыск, а не инверсию.
___>Да именно так. IoC == DI и все становится на свои места. Без умничания и домысливаний
Опять игноришь Фаулера. Теперь я его озвучу на русском.

some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.
некоторые люди путают общий принцип с конкретными стилями реализации IoC (таких как DI), что эти контейнеры используют.


___>Потому как никто мне не может обьяснить эту призрачную разницу без фантазий и того, чего словами не передать.

Ключевое тут не "никто", а тебе не может объяснить.
___>Пока я видел только попытку обьяснить это якобы неравенство наличием SL (примерно IoC == DI + SL)
Это чушь, и такое тут никто не утверждал.
___>которую Вы же (см. выделенное) опровергаете.
Естественно.

___>Это общая фраза. Явно различия между IoC и DI нигде не описано. Потому что его нет.

Железная логика. Ты на русском можешь понять разницу между "инверсия" и "впрыск"? Или для тебя это синонимы?

___>Покажите мне фразу типа "Кроме DI IoC может быть реализован при помощи XXXX"

Вот пример

These are complicated cases of inversion of control, but you run into this effect in much simpler situations. A template method is a good example: the super-class defines the flow of control, subclasses extend this overriding methods or implementing abstract methods to do the extension.

___>Я встречал подобные фразы со ссылкой именно на обсуждаемую тут статью Фаулера. Но у Фаулера НЕТ ничего подобного.
См выше
___>Предложения типа "some people confuse the general principle..." — не аргумент.
Разве?

___>Согласен с тем, что возможно я неправильно трактую Фаулера.

___>Но моя трактовка не содержит фантазий, домыслов и вещей, которые при помоши языка не выразить
Она содержит фантазии и домыслы, которые при помощи языка ты можешь выразить. Так легче?
Re[22]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 25.05.11 22:00
Оценка:
Здравствуйте, samius, Вы писали:

___>>>>Это альтернатива IoC а не его подвид. Вот предмет нашего спора.

S>>>Ты понимаешь под IoC впрыск, а не инверсию.
___>>Да именно так. IoC == DI и все становится на свои места. Без умничания и домысливаний
S>Опять игноришь Фаулера. Теперь я его озвучу на русском.
S>

S>some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.
S>некоторые люди путают общий принцип с конкретными стилями реализации IoC (таких как DI), что эти контейнеры используют.

Ну а где же про другие стили реализации?
Да они теоретически возможны. Если пофилософствовать. А на практике если идет упоминание про IoC то это эквивалентно DI.
Ну нет ничего другого.

___>>Потому как никто мне не может обьяснить эту призрачную разницу без фантазий и того, чего словами не передать.

S>Ключевое тут не "никто", а тебе не может объяснить.
Я пока внятного обьяснения не услышал. Обьяснение может состоять из одного названия.

___>>Пока я видел только попытку обьяснить это якобы неравенство наличием SL (примерно IoC == DI + SL)

S>Это чушь, и такое тут никто не утверждал.
Почитайте ветку. Ключевая фраза "опаньки"
Из-за того утверждения я собственно в этот спор и влез.
___>>которую Вы же (см. выделенное) опровергаете.
S>Естественно.
Естественно или нет но там было конкретное название и спорное с моей точки зрения но непротиворечивое утверждение.

___>>Это общая фраза. Явно различия между IoC и DI нигде не описано. Потому что его нет.

S>Железная логика. Ты на русском можешь понять разницу между "инверсия" и "впрыск"? Или для тебя это синонимы?
Инверсия вообще — гораздо более широкое понятие.
Инверсия при разговоре про IoC — это именно впрыск потому как других вариантов нет.
Как появятся — сразу буду разделять эти понятия. Честное пионерское

___>>Покажите мне фразу типа "Кроме DI IoC может быть реализован при помощи XXXX"

S>Вот пример
S>

S>These are complicated cases of inversion of control, but you run into this effect in much simpler situations. A template method is a good example: the super-class defines the flow of control, subclasses extend this overriding methods or implementing abstract methods to do the extension.

Пример вижу. Не вижу ответа на вопрос. Что вместо XXXX подставить? template method? Может не надо?
Тогда зачем пример был? Чтобы все равно что но ответить?
Согласен с тем что, если рассматривать фразу "inversion of control", то можно составить много правильных толкований.
Но когда говорят про IoC подход, то количество толкований резко уменьшается.
Если я говорю с программистами об использовании не просто любых методов уменьшения зависимостей, а именно IoC, то я предполагаю, что мы собираемся иметь набор компонентов не имеющих никаких зависимостей ни между собой ни с чем другим(локаторы фабрики и прочее)
Если есть возможность использования IoC контейнера то мы используем его возможности со всякими бонусами.
Если нет контейнера по тем или иным причинам то можно производить создание экземпляров компонентов и раздачу зависимостей в отдельном классе. Вот это будет IoC без контейнера с практической точки зрения. Я так делал. Это не теория и не фантазии
С точки зрения компонентов и их дизайна разницы нет. Более того если руководство потом например одобрит применение IoC контейнера — мы имеем минимум переделок. Вот практический взгляд на вещи.
С этой точки зрения IoC == DI и оба никакого отношения с SL не имеют.
Если же порассуждать на новомодные темы то IoC — это не просто DI а еще и непойми что и вообще.
Но меня всегда интересовала только практическая сторона. Уж извините


___>>Я встречал подобные фразы со ссылкой именно на обсуждаемую тут статью Фаулера. Но у Фаулера НЕТ ничего подобного.

S>См выше
Не на что там смотреть

___>>Предложения типа "some people confuse the general principle..." — не аргумент.

S>Разве?
Некоторые путают некоторые нет.

___>>Согласен с тем, что возможно я неправильно трактую Фаулера.

___>>Но моя трактовка не содержит фантазий, домыслов и вещей, которые при помоши языка не выразить
S>Она содержит фантазии и домыслы, которые при помощи языка ты можешь выразить. Так легче?
Кому. Вам? Может быть. Мне так все равно в принципе.
Я же просто решить вопрос предложил — одно слово вместо XXXX и все. Я признаю что был не прав. И что?
Слова нет зато много мелких утверждений, которые сами по себе верны, но к предмету спора не относятся.
Мне они не интересны
Проектирование велосипедов для слепых жирафов
Re[23]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 25.05.11 22:35
Оценка: 20 (1)
Здравствуйте, robin_of_the_wood, Вы писали:

___>Здравствуйте, samius, Вы писали:


___>>>>>Это альтернатива IoC а не его подвид. Вот предмет нашего спора.

S>>>>Ты понимаешь под IoC впрыск, а не инверсию.
___>>>Да именно так. IoC == DI и все становится на свои места. Без умничания и домысливаний
S>>Опять игноришь Фаулера. Теперь я его озвучу на русском.
S>>

S>>some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.
S>>некоторые люди путают общий принцип с конкретными стилями реализации IoC (таких как DI), что эти контейнеры используют.

___>Ну а где же про другие стили реализации?
Это другой вопрос. Тебе они приводились, но ты их упорно игнорируешь. По фразе Фаулера есть что сказать? Или пока тебе Фаулер не покажет другие реализации ты так и будешь продолжать спорить?
___>Да они теоретически возможны. Если пофилософствовать. А на практике если идет упоминание про IoC то это эквивалентно DI.
Чушь
___>Ну нет ничего другого.
SL, Template method, глобальная переменная, передача аргументом метода/конструктора, и даже явное создание экземляра в коде компоненты (было упомянуто Фаулером и процитировано тобой).

___>>>Потому как никто мне не может обьяснить эту призрачную разницу без фантазий и того, чего словами не передать.

S>>Ключевое тут не "никто", а тебе не может объяснить.
___>Я пока внятного обьяснения не услышал. Обьяснение может состоять из одного названия.
Тебе их было приведено больше одного.

___>>>Пока я видел только попытку обьяснить это якобы неравенство наличием SL (примерно IoC == DI + SL)

S>>Это чушь, и такое тут никто не утверждал.
___>Почитайте ветку. Ключевая фраза "опаньки"
___>Из-за того утверждения я собственно в этот спор и влез.
И зря, кстати. Только ты тут утверждаешь что IoC == чему-то. IoC — это паттерн, который достигается многими способами.

___>>>Это общая фраза. Явно различия между IoC и DI нигде не описано. Потому что его нет.

S>>Железная логика. Ты на русском можешь понять разницу между "инверсия" и "впрыск"? Или для тебя это синонимы?
___>Инверсия вообще — гораздо более широкое понятие.
___>Инверсия при разговоре про IoC — это именно впрыск потому как других вариантов нет.
обалдеть
___>Как появятся — сразу буду разделять эти понятия. Честное пионерское
нет слов
http://en.wikipedia.org/wiki/Inversion_of_control#Implementation_techniques

___>>>Покажите мне фразу типа "Кроме DI IoC может быть реализован при помощи XXXX"

S>>Вот пример

___>Пример вижу. Не вижу ответа на вопрос. Что вместо XXXX подставить? template method? Может не надо?

Что не надо? Я привел пример, а не надо было?
___>Тогда зачем пример был? Чтобы все равно что но ответить?
Я показал фразу у Фаулера. Что не так? Не нравится?

___>Согласен с тем что, если рассматривать фразу "inversion of control", то можно составить много правильных толкований.

___>Но когда говорят про IoC подход, то количество толкований резко уменьшается.
http://en.wikipedia.org/wiki/Inversion_of_control#Implementation_techniques

___>Если я говорю с программистами об использовании не просто любых методов уменьшения зависимостей, а именно IoC, то я предполагаю, что мы собираемся иметь набор компонентов не имеющих никаких зависимостей ни между собой ни с чем другим(локаторы фабрики и прочее)

Это только ты так предполагаешь. IoC этого не подразумевает в общем случае.
___>Если есть возможность использования IoC контейнера то мы используем его возможности со всякими бонусами.
Называй вещи своими именами. Под бонусами ты имеешь в виду DI контейнер.

___>Если нет контейнера по тем или иным причинам то можно производить создание экземпляров компонентов и раздачу зависимостей в отдельном классе. Вот это будет IoC без контейнера с практической точки зрения. Я так делал. Это не теория и не фантазии

Да ладно? Серьезно? А с чем тогда споришь?

___>С точки зрения компонентов и их дизайна разницы нет. Более того если руководство потом например одобрит применение IoC контейнера — мы имеем минимум переделок. Вот практический взгляд на вещи.

___>С этой точки зрения IoC == DI и оба никакого отношения с SL не имеют.
непробиваем
___>Если же порассуждать на новомодные темы то IoC — это не просто DI а еще и непойми что и вообще.
___>Но меня всегда интересовала только практическая сторона. Уж извините
С теорией для начала разберись.

S>>См выше

___>Не на что там смотреть


___>>>Предложения типа "some people confuse the general principle..." — не аргумент.

S>>Разве?
___>Некоторые путают некоторые нет.

___>>>Согласен с тем, что возможно я неправильно трактую Фаулера.

___>>>Но моя трактовка не содержит фантазий, домыслов и вещей, которые при помоши языка не выразить
S>>Она содержит фантазии и домыслы, которые при помощи языка ты можешь выразить. Так легче?
___>Кому. Вам? Может быть. Мне так все равно в принципе.
___>Я же просто решить вопрос предложил — одно слово вместо XXXX и все. Я признаю что был не прав. И что?
___>Слова нет зато много мелких утверждений, которые сами по себе верны, но к предмету спора не относятся.
___>Мне они не интересны
Детский сад
Re[24]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 25.05.11 23:34
Оценка:
Здравствуйте, samius, Вы писали:

S>>>some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.

S>>>некоторые люди путают общий принцип с конкретными стилями реализации IoC (таких как DI), что эти контейнеры используют.
S>>>[/q]
___>>Ну а где же про другие стили реализации?
S>Это другой вопрос. Тебе они приводились, но ты их упорно игнорируешь. По фразе Фаулера есть что сказать? Или пока тебе Фаулер не покажет другие реализации ты так и будешь продолжать спорить?
___>>Да они теоретически возможны. Если пофилософствовать. А на практике если идет упоминание про IoC то это эквивалентно DI.
S>Чушь
___>>Ну нет ничего другого.
S>SL, Template method, глобальная переменная, передача аргументом метода/конструктора, и даже явное создание экземляра в коде компоненты (было упомянуто Фаулером и процитировано тобой).
Это по Вашему стили реализации IoC (такие как DI)?
Мне так не кажется.
Хотя проблема скорее в Вашем маниакальном желании дать истинно правильную формулировку
Не надо так уж серьезно

S>Детский сад

Ути — пути
Проектирование велосипедов для слепых жирафов
Re[9]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 26.05.11 19:41
Оценка: 90 (7) +2
Здравствуйте, robin_of_the_wood, Вы писали:

___>Если переход в другое состояние в рантайме убрать то получим патерн стратегия(это к слову о взаимопроникновинии)


"Взаимопроникновений" гораздо больше, и без подписей к квадратикам до половины паттернов ты просто не распознаешь, ибо схема и принцип исполнения одни и те же, просто в голове мы даем разное толкование одному и тому же происходящему.

Включаем воображение и хулиганим: стратегия — это такое иммутабельное состояние. Наоборот: смена стратегий — это суть паттерна State. И первое и второе — разновидность делегирования. Фабрика — опять делегирование. Делегирование, в свою очередь, может на адаптерах выполняться, коль мы хотим делегировать некую функциональность некоему постороннему объекту, с несовместимым для ожидаемого интерфейсом.

На самом деле в GOF чуть ли не половина всех паттернов — это развитие темы делегирования + адаптеры. А нафига адаптер вообще нужен? Просто в номативной типизации два идентично описанных типа, отличающихся именем, являются несовместимыми. Т.е. чтобы вместо одного использовать другой, нужен адаптер. В зависимости от целевой задачи, можно обозвать так же мостом, фасадом, делегатом. Пофиг. DI — это делегирование через делегирование (если через service locator), либо если напрямую — то опять такое же обычное делегирование. И даже как "фабричный метод" или "шаблонный метод", всё суть делегирование функциональности "кому либо еще". Т.е. называя вещи своими именами — абстрагирование от конкретики этой функциональности. Или взять визитора, который от двойной диспетчеризации отличается замыливанием насчет потенциальной симметричности схемы, хотя теория мультиметодов ничего не замыливает. Ы? Нас опять пытаются сделать узколобыми?

Особенно возня с паттернами доставляет, когда всё происходит вокруг одного-двух методов (а оно так и бывает чаще всего). Даже если мы простоты ради распишем некий тип в С++ с методом operator(), который хотим использовать как функциональный, другой точно такой же функциональный тип будет с ним опять не совместим. (хотя, на шаблонах можно выкрутиться, но тогда весь код наружу)

Остается позавидовать функциональщикам, у которых все функциональные типы совместимы по сигнатуре, и такие вещи как адаптеры/стратегии/IoC делаются в одну строчку через частичное применение или через замыкания. Потому что функциональный объект — это и есть воплощение делегирования, а последнее — суть удобный механизм абстрагирования. И что характерно, ввиду совместимости функциональных объектов только лишь по сигнатурам и отсутствия необходимости ресолвить конфликты номативной типизации, эти приемы ФП в отдельные паттерны никто не выделяет. Так и остаются они замыканими и частичными применениями, из которых через комбинаторные сочетания и вложенности можно породить просто мильон сценариев, гораздо больше, чем в GOF. Не зря функциональщики вывели 3 базовых комбинатора, и сказали — теперь хоть обкомбинируйтесь, только не засирайте нам мозги вашими частностями.

ИМХО, в 3 кита ООП можно добавить всего один прикладной костыль — адаптер, служащий для приведения/адаптирования несовместимых интерфейсов или деталей реализации. Суть делегирования/абстрагирования заложена в самом полиморфизме, поэтому всё уже придумано до нас. Пользуйтесь.

___>Не понял в чем наглость? Есть многократно повторенная в реализации задача. Есть решение, которое в большинстве случаев — наилучшее. Его и предлагают в учебниках. Где наглость?


Не учебник, а дележ опытом, уровня нашего раздела "исходники". Тыкать подобным на грани наглости.

___>Но паттерны тут для меня пока не очень видны. Задача уж очень напоминает кусочек интерьера засвеченый фонариком в темной комнате. Давай свет включим. Давай рассмотрим сразу _все_ обьекты загружаемые из базы. Их связи. И на этом фоне необходимость лэйзи загрузки одного обьекта может сильно потускнеть с точки зрения архитектуры. А появятся на свет такие паттерны как DAO, ActiveRecord, UnitOfWork, Registry по отдельности или в комбинации друг с другом.


У блин... Жаль всё-таки Фаулер в детстве не умер. Если на каждую прикладную задачу плодить по "паттерну", типа Unit Of Work, то их скоро станет тысячи и сама идея будет профанирована. Хорошо хоть у этого плодовитого автора образование не позволило дотянуться до всех закоулков IT, так, по верхам прошелся, что увидел, о том и спел.

Не, реально, в чистом виде UnitOfWork не существует. Это не объект, не интерфейс, это больше словесное описание происходящего. А если взять реализации из реальных примеров, то его обощенный интерфейс максимум будет такой:
class UnitOfWork {
public:
  virtual void commit() = 0; 
protected:
  virtual ~UnitOfWork() = 0; 
};

А вовсе не тот, что дает Фаулер, бо там сугубо частности, вряд ли повторяемые даже в половине реализаций. И что, нам теперь один полезный метод + наличие детерминированной финализации объявлять еще одним паттерном?

Повторюсь, хорошо что Фаулер дальше песочницы ентерпрайза не лез. Что бы было, дотянись он до построения компиляторов, обработки информации, ИИ, сетевых протоколов, нечеткой логики и прочего? Боюсь даже представить. Он бы взорвал мозг себе и всем нам.

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


Да не при чем тут паттерны. ВСЕГДА стоит анализировать сценарии, искать похожести и обыгрывать различия. К паттернам мы должны придти на самом последнем шаге, непосредственно перед раздачей обязанностей конкретным классам и интерфейсам. Если делать это ДО составления адекватного списка сценариев, то никакие паттерны не спасут от последующей неминуемой переделки. Или, например, что ты будешь делать, если столкнешься с ситуацией, с которой Фаулер или GOF не сталкивались? Приплыли, что ли? Принципы проектирования должны быть универсальны, только тогда они работают. Самый универсальный принцип проектирования — это сбор, анализ и реализация требований. Реализация одних требований будет порождать другие, более конкретные ьребования и так итеративно. До паттернов тут еще далеко как до звезд и они рояли не играют. Возьмем, например, требование "атомарности" — это универсальное и известное давно понятие. Напротив, "UnitOfWork" — частное применение принципа. А если толкать эту частность как некие "знания", то это очевидная попытка исказить и сузить смысл исходного важного принципа. У Фаулера налицо пересказ "своими словами" собственного опыта и понимания происходящего одним хомячком для других. Стоит программистам пойти по такому пути самоограничений, и будет очередное деление, аналогично наблюдаемому ныне делению на "просто программистов" и "программистов 1С".

___>И как это будет без паттернов мне не надо рассказывать. Я этого видел столько, что тошнит.


Вопрос остается в силе. Что будешь делать, если тебе для некоей задачи еще никто не подсказал паттерна? Сдуешься? Как полуграмотный дельфист, не нашедший подходящий TSuperComponent? Плохой код можно и на паттернах сделать, и такого тоже видано было немало. Особенно когда желание "попользовать" паттерны первично, а решить конкретную задачу вторично. И не надо тут разводить "ля-ля", что грамотный разработчик так не делает. Грамотный разработчик, прежде всего, не носится с паттернами, как с писанной торбой. Сколько в жизни наблюдал тех, кто носился, столько раз косяки за ними правил. Зависимость железная. И неудивительно — нельзя понахвататься по верхам всяких Фаулеров и считать себя спецом. Потому что стоит начать себя считать и неминуемо снижается требования к себе, а значит и к мелким деталям происходящего. Фигли, мы же "как положено" делаем, априори ошибиться не можем...

(Сорри, у меня отношение именно к этому товарищу специфицеское. Единственно, где его узколобость и дотошность оказалась полезной — при составлении списка сценариев рефакторинга. Тут сидящая внутри него "девочка-отличница" оказалась как нельзя кстати.)

___>Это потом все либо переделывали либо оставляли, потому как архитектурные ошибки иногда так дороги, что дешевле годами потом вокруг подпорочки ставить с матюками в адрес торопящихся сдать вчера.


Не думаю, что с современными ср-вами рефакторинга с архитектурой могут быть проблемы. В последние лет 10 ситуация сильно поменялась на противоположную. Верхнеуровневая архитектура потеряла в цене, обзавелась обидным прозвищем "клей", более того, иногда от ее разработки полностью отказываются, ибо скриптуют через скриптовые движки+пару интерфейсов или через конфиги IoC-фреймворков (и тоже малое кол-во интерфейсов). Напротив, конкретный прикладной код, делающий полезные вещи — это непреходящая ценность. И его ценность ничуть не страдает, если сей код отрефакторили, перекомпоновали, куда-то вынесли или завернули в другой интерфейс. Этим кодом дорожат и именно он вдоль и поперек обкладывается юнит-тестами. Что как бэ намекает, кто тут папа. Да, каждый такой "кирпичик" может быть переписан или заменен, в этом суть абстрагирования. Но от этого ценность конкретного реализованного кирпичика не падает. Например, основная идея IoC — вместо прямых зависимостей м/у типами вводить зависимости от малого числа "третьесторонних стандартов" стара как мир. Еще во времена Сталина некоторых инженеров расстреливали за попытки ввода частных спецификаций в обход существующих стандартов, подходящих под решение. Расстреливали за саботаж. Но к программированию, заметь, эти случаи не имели ни малейшего отношения. Это общеинженерные принципы.

___>Только вот эти торопящиеся вчера почему-то обычно не любят сегодня вспоминать как это было. Так статистический результат наблюдений. Компании меняются а результат — нет


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

Не раз уже рынком было доказано, что софт с не самой "вылизанной" архитектурой, но богатый функционально, надежный и эффективный, продается получше конкурентов с "идеальной" внутренней архитектурой, но тормозных и монстроидальных. И это вряд ли изменится когда-либо. На самом деле, все споры о паттернах — суть споры о приоритетах. И пока наблюдается у патернофилов проблемы с адекватной расстановкой тех самых приоритетов.
Re[10]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.05.11 22:14
Оценка:
Здравствуйте, vdimas, Вы писали:

V>На самом деле в GOF чуть ли не половина всех паттернов — это развитие темы делегирования + адаптеры. А нафига адаптер вообще нужен?


На самом деле там развитие темы депенденсов и обязанностей на примере вырожденных форм MVC.
Re[11]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 27.05.11 01:08
Оценка: +1
Здравствуйте, robin_of_the_wood, Вы писали:


___>Методов везде одинаковое количество.

___>Выигрыш по отношению к реализации на ифах или свитчах в том что при необходимости изменить поведение в определенном состоянии мы меняем только соответствующий класс не боясь по ошибке задеть чего-то лишнее. Когда код чужой и сложный — это многого стоит

Не так. Выигрыш в первую очередь в том, что на ифах — это ручная диспетчеризация, а на паттерне State — автоматическая за счет полиморфизма. Слово "диспетчеризация" в связке с "полиморфизм" стоит запомнить. Собсно, об этом и речь — может стоит овладеть буквально единицами базовых принципов, из которых можно вывести бесчисленное мн-во частностей? Вроде как понятие полиморфизма и так изучают вместе с ООП, не? Может, надо научить просто пользоваться полиморфизмом? Показать особенности единичной и множественной диспетчеризации, и добрую половину остальных паттернов студент возможно выведет сам?

А вот те рассуждения насчет "код чужой и много стоит" — это исключительно от оформления декомпозиции зависит. И на ифах можно замечательно декомпозировать и оформить, чтобы не было проблем. Это уже ближе к культуре кода и ортогонально сути паттерна.

___>Извини но задачи для разговора о паттернах я не увидел. Был один интерфейс и упоминание про лэйзи загрузку с некоторыми уточнениями. Этого мало. DI и ServiceLocator — это общей архитектуры касаются. Их нельзя применять для одного обьекта и не применять для всех остальных.


Я так и знал. Начинаем нести отсебятину. Характерно, что ни в одной книжке по паттернам этого не говорится. Проблемы, как обычно, в толкователях.

DI — может и должен относиться к характеру исполнения АПИ единичного объекта (или некоего интерфейса). И только к нему, родимому. Тот факт, что на DI делают целые фреймворки лишь говорит о том, что есть такие фремворки-хелперы, и более ни о чем. Фреймворки эти нужны для автоматизации раздачи зависимостей, и больше ни для чего. И вот на основании существования таких фреймворков ты сделал иллюстративный для обсуждаемого вывод, что "DI нельзя применять для одного обьекта и не применять для всех остальных". А если мы не хотим тянуть громоздкий фреймворк в приложуху? А если нам не требуется автоматический "клей", но DI требуется как результат реализации требований параметризуемости или тестопригодности неких объектов? А если совершенно не требуется для других, в силу отсутствия требования параметризуемости или из-за тривиальных сценариев тестирования? Все равно будем пытаться притянуть за уши DI?

Отличная вышла иллюстрация запрягания кареты впереди лошади. Т.е. отталкивания от паттернов, а не от требований.
Re[10]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.05.11 11:39
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Повторюсь, хорошо что Фаулер дальше песочницы ентерпрайза не лез. Что бы было, дотянись он до построения компиляторов, обработки информации, ИИ, сетевых протоколов, нечеткой логики и прочего? Боюсь даже представить. Он бы взорвал мозг себе и всем нам.


А он и взорвал. Про тот же IoC так написал, что там одна проза, с комментарием что не все его правильно понимают. Не первый раз я сталкиваюсь с ситуацией, когда при одновременном прочтении чего-то из Фаулера, разные люди понимают его по-своему, и каждый считает что прав именно он. Впрочем, с GoF-ом практически так же. Но все-же GoF более формален.
Re[11]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.05.11 11:52
Оценка:
Здравствуйте, samius, Вы писали:

S>А он и взорвал. Про тот же IoC так написал, что там одна проза, с комментарием что не все его правильно понимают. Не первый раз я сталкиваюсь с ситуацией, когда при одновременном прочтении чего-то из Фаулера, разные люди понимают его по-своему, и каждый считает что прав именно он. Впрочем, с GoF-ом практически так же. Но все-же GoF более формален.


Паттерны, если человек путается с депенденсами-обязанностями и подобными вещами, всегда трактуются уникальным образом и взгляды тут ни при чем.
Re[14]: [C++] о паттернах (доп.)
От: Sinclair Россия https://github.com/evilguest/
Дата: 27.05.11 12:21
Оценка:
Здравствуйте, samius, Вы писали:

S>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

Простите, а что именно инвертируется в сервис локаторе?
Я вот читаю-читаю этот тред, и никак это понять не могу.
В DI я вижу полную инверсию: тот, кто вызывал, теперь становится вызываемым.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 27.05.11 12:40
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, samius, Вы писали:


S>>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

S>Простите, а что именно инвертируется в сервис локаторе?
конкретно в нем — ничего.
S>Я вот читаю-читаю этот тред, и никак это понять не могу.
S>В DI я вижу полную инверсию: тот, кто вызывал, теперь становится вызываемым.
Технически DI — это не средство инвертирования, а "a design pattern that separates behavior from dependency resolution" (википедия).
Именно IoC обеспечивает инверсию. А DI и SL — это средства доставки зависимостей. Причем инжектор DI может быть выполнен в виде SL.
Re[15]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 27.05.11 14:36
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

S>Простите, а что именно инвертируется в сервис локаторе?

Доставка депенденсов, точно так же как и с DI
Re[10]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 27.05.11 17:20
Оценка:
Здравствуйте, vdimas, Вы писали:

V>На самом деле в GOF чуть ли не половина всех паттернов — это развитие темы делегирования + адаптеры. А нафига адаптер вообще нужен? Просто в номативной типизации два идентично описанных типа, отличающихся именем, являются несовместимыми. Т.е. чтобы вместо одного использовать другой, нужен адаптер. В зависимости от целевой задачи, можно обозвать так же мостом, фасадом, делегатом. Пофиг. DI — это делегирование через делегирование (если через service locator), либо если напрямую — то опять такое же обычное делегирование. И даже как "фабричный метод" или "шаблонный метод", всё суть делегирование функциональности "кому либо еще". Т.е. называя вещи своими именами — абстрагирование от конкретики этой функциональности. Или взять визитора, который от двойной диспетчеризации отличается замыливанием насчет потенциальной симметричности схемы, хотя теория мультиметодов ничего не замыливает. Ы? Нас опять пытаются сделать узколобыми?

Да. Согласен с многим из перечисленного. Но кто кого пытается обидеть? Может не надо придумывать врага?


V>ИМХО, в 3 кита ООП можно добавить всего один прикладной костыль — адаптер, служащий для приведения/адаптирования несовместимых интерфейсов или деталей реализации. Суть делегирования/абстрагирования заложена в самом полиморфизме, поэтому всё уже придумано до нас. Пользуйтесь.

Так вовсю пользуемся. И факт наличия паттернов как тому танцору не не мешает вовсе

___>>Не понял в чем наглость? Есть многократно повторенная в реализации задача. Есть решение, которое в большинстве случаев — наилучшее. Его и предлагают в учебниках. Где наглость?

V>Не учебник, а дележ опытом, уровня нашего раздела "исходники". Тыкать подобным на грани наглости.
Ну если не лукавить, то тут и без паттернов тыканий хватает. На то и форум. Если выйти на площадь и высказать свое мнение, то хоть один несогласный да найдется. А тут шириной во весь рунет.

___>>Но паттерны тут для меня пока не очень видны. Задача уж очень напоминает кусочек интерьера засвеченый фонариком в темной комнате. Давай свет включим. Давай рассмотрим сразу _все_ обьекты загружаемые из базы. Их связи. И на этом фоне необходимость лэйзи загрузки одного обьекта может сильно потускнеть с точки зрения архитектуры. А появятся на свет такие паттерны как DAO, ActiveRecord, UnitOfWork, Registry по отдельности или в комбинации друг с другом.


V>У блин... Жаль всё-таки Фаулер в детстве не умер. Если на каждую прикладную задачу плодить по "паттерну", типа Unit Of Work, то их скоро станет тысячи и сама идея будет профанирована. Хорошо хоть у этого плодовитого автора образование не позволило дотянуться до всех закоулков IT, так, по верхам прошелся, что увидел, о том и спел.

Да ну ничего настолько плохого в Фаулере нет. Я чуть ли не большую половину своего программерского опыта не знал ни про ГоФа ни про фаулера. Когда интернета не было, то за большие деньги покупали книжки, которые ближе были к реальным задачам. И я применял добрую половину известных мне сейчас паттернов, не зная названий. Было такое. И я в этом ничего сильно полохого не вижу. Потом я прочел ГоФа и просто запомнил как это называется. Ну кое что новое узнал. Так же и с Фаулером. Я у него много названий узнал, которые помогают в общении. Особых противоречий со своим опытом я у него не нашел. Все к чему пришел сам у него часто было подобным образом описано. По крайней мере на уровне понимания зачем все это.
Именно поэтому я не вижу в паттернах ничего плохого и заявляю что от знакомства с ними хуже не становится. Не более того.
Если речь идет о зазубривании формулировок с вытекающим полным непониманием зачем это надо, но с желанием применить, то я против.

V>Повторюсь, хорошо что Фаулер дальше песочницы ентерпрайза не лез. Что бы было, дотянись он до построения компиляторов, обработки информации, ИИ, сетевых протоколов, нечеткой логики и прочего? Боюсь даже представить. Он бы взорвал мозг себе и всем нам.

Хорошо. Не будем про этого страшного дядьку больше.

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


V>Да не при чем тут паттерны. ВСЕГДА стоит анализировать сценарии, искать похожести и обыгрывать различия. К паттернам мы должны придти на самом последнем шаге, непосредственно перед раздачей обязанностей конкретным классам и интерфейсам. Если делать это ДО составления адекватного списка сценариев, то никакие паттерны не спасут от последующей неминуемой переделки. Или, например, что ты будешь делать, если столкнешься с ситуацией, с которой Фаулер или GOF не сталкивались? Приплыли, что ли? Принципы проектирования должны быть универсальны, только тогда они работают. Самый универсальный принцип проектирования — это сбор, анализ и реализация требований. Реализация одних требований будет порождать другие, более конкретные ьребования и так итеративно. До паттернов тут еще далеко как до звезд и они рояли не играют. Возьмем, например, требование "атомарности" — это универсальное и известное давно понятие. Напротив, "UnitOfWork" — частное применение принципа. А если толкать эту частность как некие "знания", то это очевидная попытка исказить и сузить смысл исходного важного принципа. У Фаулера налицо пересказ "своими словами" собственного опыта и понимания происходящего одним хомячком для других. Стоит программистам пойти по такому пути самоограничений, и будет очередное деление, аналогично наблюдаемому ныне делению на "просто программистов" и "программистов 1С".

Согласен. Я не считаю сказанное Фаулером или кем бы то ни было за догму. Если человек имеет опыт, то мы за 5 минут скорректируем термины и дальше будем делиться опытом. Если же человек википедий начитался но сути не понял то, с ним говорить невозможно. Чтение Фаулера поможет в первом случае(не повредит как минимуи) и сыграет злую шутку во втором. Но я бы не стал винить в этом Фаулера

___>>И как это будет без паттернов мне не надо рассказывать. Я этого видел столько, что тошнит.


V>Вопрос остается в силе. Что будешь делать, если тебе для некоей задачи еще никто не подсказал паттерна? Сдуешься? Как полуграмотный дельфист, не нашедший подходящий TSuperComponent? Плохой код можно и на паттернах сделать, и такого тоже видано было немало. Особенно когда желание "попользовать" паттерны первично, а решить конкретную задачу вторично. И не надо тут разводить "ля-ля", что грамотный разработчик так не делает. Грамотный разработчик, прежде всего, не носится с паттернами, как с писанной торбой. Сколько в жизни наблюдал тех, кто носился, столько раз косяки за ними правил. Зависимость железная. И неудивительно — нельзя понахвататься по верхам всяких Фаулеров и считать себя спецом. Потому что стоит начать себя считать и неминуемо снижается требования к себе, а значит и к мелким деталям происходящего. Фигли, мы же "как положено" делаем, априори ошибиться не можем...

Не здуюсь. Буду делать то, что делал, когда еще про паттерны не читал. Все в порядке.
А вот если я несколько раз делал одно и то же и знаю этому название из того же Фаулера или ГоФа, то скажу что применю определенный паттерн. Что я и продемонстрировал вроде. Для одной задачи разговоров о паттернах не было а для другой были. И не по тому что я хотел похвастаться знаниями паттернов. Я просто очень хорошо знаю как это делать потому как делал сам и еще больше разбирался как это делали другие. И если собеседник не слышал терминов, то я поверьте уж смогу в деталях все это обьяснить своими словами

V>(Сорри, у меня отношение именно к этому товарищу специфицеское. Единственно, где его узколобость и дотошность оказалась полезной — при составлении списка сценариев рефакторинга. Тут сидящая внутри него "девочка-отличница" оказалась как нельзя кстати.)

Ну он ведь ничего нового не сказал, просто систематезировал

___>>Это потом все либо переделывали либо оставляли, потому как архитектурные ошибки иногда так дороги, что дешевле годами потом вокруг подпорочки ставить с матюками в адрес торопящихся сдать вчера.


V>Не думаю, что с современными ср-вами рефакторинга с архитектурой могут быть проблемы. В последние лет 10 ситуация сильно поменялась на противоположную. Верхнеуровневая архитектура потеряла в цене, обзавелась обидным прозвищем "клей", более того, иногда от ее разработки полностью отказываются, ибо скриптуют через скриптовые движки+пару интерфейсов или через конфиги IoC-фреймворков (и тоже малое кол-во интерфейсов). Напротив, конкретный прикладной код, делающий полезные вещи — это непреходящая ценность. И его ценность ничуть не страдает, если сей код отрефакторили, перекомпоновали, куда-то вынесли или завернули в другой интерфейс. Этим кодом дорожат и именно он вдоль и поперек обкладывается юнит-тестами. Что как бэ намекает, кто тут папа. Да, каждый такой "кирпичик" может быть переписан или заменен, в этом суть абстрагирования. Но от этого ценность конкретного реализованного кирпичика не падает. Например, основная идея IoC — вместо прямых зависимостей м/у типами вводить зависимости от малого числа "третьесторонних стандартов" стара как мир. Еще во времена Сталина некоторых инженеров расстреливали за попытки ввода частных спецификаций в обход существующих стандартов, подходящих под решение. Расстреливали за саботаж. Но к программированию, заметь, эти случаи не имели ни малейшего отношения. Это общеинженерные принципы.

Про 10 лет согласен. Где-то в начале этого периода я решил свою первую архитектурную задачу. Понял некоторые вещи про которые не узнать из книжек. С тех пор были и кирпичики и самопальные IoC контейнеры и глубокое копание в чужих решениях на эту тему. Про идею IoC не совсем с Вами соглашусь. Она чуть глубже чем Вы описываете. В идеале зависимостей нет вообще. Берем кирпичик из старого проекта и он начинает работать в нашем контейнере. Все его связи инжектятся контейнером. От компонента вообще ничего не требуется кроме отсутствия скрытых зависимостей. С этим тоже плиз не спорьте. Я не в википедии и не у Фаулера про это вычитал. Я уже очень давно этими проблемами плотно занимаюсь. Честно.

___>>Только вот эти торопящиеся вчера почему-то обычно не любят сегодня вспоминать как это было. Так статистический результат наблюдений. Компании меняются а результат — нет


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

Ну я бы так не сказал. Одно другому не мешает. Архитектура это просто другой уровень. Ей не надо быть озабоченым.
И с неэффективностью это связано опосредовано. Если человек не понял алгоритмов и структур но эффективный код он не сможет написать. Будет хотеть но не сможет. А если он еще википедии перечитает то ему еще ничего и не докажешь. Проще за него самые критичные места переписать. А архитектура на ступеньку выше по цене ошибок. Там если не понял сути то такого можно нагородить. И я это имелл ввиду. Но видимо не совсем корректно мысль выразил. Там тоже знание и в первую очередь понимание того как надо делать правильно и как можно по другому и плюсы и минусы того и другого подхода важнее правильности названий. Знание на уровне понимания паттернов тут помогает общений. Знание на уровне заучивания отдельных фраз и терминов при непонимании сути — влечет к очень дорогостоящим архитектурным ошибкам.

V>Не раз уже рынком было доказано, что софт с не самой "вылизанной" архитектурой, но богатый функционально, надежный и эффективный, продается получше конкурентов с "идеальной" внутренней архитектурой, но тормозных и монстроидальных. И это вряд ли изменится когда-либо. На самом деле, все споры о паттернах — суть споры о приоритетах. И пока наблюдается у патернофилов проблемы с адекватной расстановкой тех самых приоритетов.

Чаще если софт тормозной и ненадежный, то там и с архитектурой не все гладко. А еще чаще рыба гниет именно с головы. Приоритеты всегда на результат направлены должны быть. А споры о паттернах безсмыслены. Если нет понимания то паттерны не помогают а даже вредят. Человеку кажется что он познал нечто непонятное и очень важное. И он не в состоянии обьяснить простыми терминами(так как сам то не понял) но пытается всех вокруг поучать. Отсюда разногласия на пустом месте. А если человек понимает суть проблемы, то "давай мы вот это будем называть вот так" и дальше говорим. Ну и в этом случае чтение о паттернах его не испортит. А по поводу споров, если сильно захотеть то ведь спорить можно по любому поводу. Вот и еще я никогда не работал скажем с 3D графикой. Так я разве полезу спорить с кем-то про какие нибудь скажем шейдеры если я про них в википедии прочту. Да ни в жизнь. Всем споршикам того же желаю
Проектирование велосипедов для слепых жирафов
Re[12]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 27.05.11 18:03
Оценка:
Здравствуйте, vdimas, Вы писали:


___>>Методов везде одинаковое количество.

___>>Выигрыш по отношению к реализации на ифах или свитчах в том что при необходимости изменить поведение в определенном состоянии мы меняем только соответствующий класс не боясь по ошибке задеть чего-то лишнее. Когда код чужой и сложный — это многого стоит

V>Не так. Выигрыш в первую очередь в том, что на ифах — это ручная диспетчеризация, а на паттерне State — автоматическая за счет полиморфизма. Слово "диспетчеризация" в связке с "полиморфизм" стоит запомнить. Собсно, об этом и речь — может стоит овладеть буквально единицами базовых принципов, из которых можно вывести бесчисленное мн-во частностей? Вроде как понятие полиморфизма и так изучают вместе с ООП, не? Может, надо научить просто пользоваться полиморфизмом? Показать особенности единичной и множественной диспетчеризации, и добрую половину остальных паттернов студент возможно выведет сам?

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

V>А вот те рассуждения насчет "код чужой и много стоит" — это исключительно от оформления декомпозиции зависит. И на ифах можно замечательно декомпозировать и оформить, чтобы не было проблем. Это уже ближе к культуре кода и ортогонально сути паттерна.

Я саппортил и на ифах и на State основе. Написал о своих впечатлениях. У Вас другие? Ну так это не значит что мои не верны

___>>Извини но задачи для разговора о паттернах я не увидел. Был один интерфейс и упоминание про лэйзи загрузку с некоторыми уточнениями. Этого мало. DI и ServiceLocator — это общей архитектуры касаются. Их нельзя применять для одного обьекта и не применять для всех остальных.


V>Я так и знал. Начинаем нести отсебятину. Характерно, что ни в одной книжке по паттернам этого не говорится. Проблемы, как обычно, в толкователях.

А разве тут до меня все только цитатами общались? Если у меня нет опыта по теме, я обычно помалкиваю

V>DI — может и должен относиться к характеру исполнения АПИ единичного объекта (или некоего интерфейса). И только к нему, родимому. Тот факт, что на DI делают целые фреймворки лишь говорит о том, что есть такие фремворки-хелперы, и более ни о чем. Фреймворки эти нужны для автоматизации раздачи зависимостей, и больше ни для чего. И вот на основании существования таких фреймворков ты сделал иллюстративный для обсуждаемого вывод, что "DI нельзя применять для одного обьекта и не применять для всех остальных". А если мы не хотим тянуть громоздкий фреймворк в приложуху? А если нам не требуется автоматический "клей", но DI требуется как результат реализации требований параметризуемости или тестопригодности неких объектов? А если совершенно не требуется для других, в силу отсутствия требования параметризуемости или из-за тривиальных сценариев тестирования? Все равно будем пытаться притянуть за уши DI?


V>Отличная вышла иллюстрация запрягания кареты впереди лошади. Т.е. отталкивания от паттернов, а не от требований.

Вы добавили много "А если". При каждом новом уточнении ситуация меняется и должна быть отдельно переосмыслена. Возможно это приведет к полнму пересмотру реализации. И возможно предложенный мной вариант и не подойдет. Это все обычные детали рабочего процесса. Ничего за уши притягивать не будем. А по поводу пользы фрэймворков я все-же позволю себе одно уточнение. Они не нужны только для автоматической раздачи зависимостей. Они почти только это делают. Но делают они это для того, чтобы убрать зависимость компонента от контейнера. А вот это дает много преимуществ, ради которых все и делается. Вот на мой взгляд основные:
1. Компонент можно тестировать вне контейнера (самая большая проблема EJB)
До IoC контейнеров компонент затачивался под контейнер. А тут контейнер работает с любым компонентом подстраиваясь под него.
Вот это и есть кстати многостральная инверсия которую любят трактовать по разному. В двух словах. Для 10летнего ребенка.
2. Компонент более чист по функционалу что дает возможность повторного использования у удобства саппорта
3. Компонент легко заменяется на загдушку (например модуль оплаты на девелоперских машинах)
4. Высокоуровневая архитектура вынесена в конфиг
5. Поддержка сразу нескольких конфигураций превращается в набор конфигов для одного и того-же кода
Это не из википедии а из личного опыта
Понимание есть. А уж куда стоит это применять а куда не стоит, я уж разберусь.

Ну не фанат я паттернов. Я просто большинство из них знаю
Проектирование велосипедов для слепых жирафов
Re[15]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 27.05.11 18:13
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>>IoC — это принцип, а сервис локатор — это паттерн, связанный с реализацией принципа IoC. Если говорить не о самом принципе IoC, а о контейнерах IoC, то подразделяются они на два вида — сервис локатор и DI контейнер.

S>Простите, а что именно инвертируется в сервис локаторе?
S>Я вот читаю-читаю этот тред, и никак это понять не могу.
S>В DI я вижу полную инверсию: тот, кто вызывал, теперь становится вызываемым.
Вы наверно википедии не читали.
Там инвертирует
Многие верят
Проектирование велосипедов для слепых жирафов
Re[16]: [C++] о паттернах (доп.)
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.05.11 06:02
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Доставка депенденсов, точно так же как и с DI

Простите, но вы, наверное, как-то по другому трактуете термин "инверсия". В моём понимании это "разворот", "отражение", "смена знака".
Если раньше A зависел от B, а теперь оба зависят от IB, то это нифига не инверсия. Это — абстракция.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 28.05.11 06:41
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Ikemefula, Вы писали:


I>>Доставка депенденсов, точно так же как и с DI

S>Простите, но вы, наверное, как-то по другому трактуете термин "инверсия". В моём понимании это "разворот", "отражение", "смена знака".
S>Если раньше A зависел от B, а теперь оба зависят от IB, то это нифига не инверсия. Это — абстракция.

Инверсия вот в чем:

A. High-level modules should not depend on low-level modules. Both should depend on abstractions.
B. Abstractions should not depend upon details. Details should depend upon abstractions.

Over the years, many have questioned why I use the word inversion in the name of this principle. The reason is that more traditional software development methods, such as structured analysis and design, tend to create software structures in which high-level modules depend on low-level modules and in which policy depends on detail. Indeed, one of the goals of these methods is to define the subprogram hierarchy that describes how the high-level modules make calls to the low-level modules. The initial design of the Copy program in Figure 7-1 is a good example of such a hierarchy. The dependency structure of a well-designed object-oriented program is "inverted" with respect to the dependency structure that normally results from traditional procedural methods.

...

Note that the inversion here is one of not only dependencies but also interface ownership. We often think of utility libraries as owning their own interfaces. But when DIP is applied, we find that the clients tend to own the abstract interfaces and that their servers derive from them.

This is sometimes known as the Hollywood principle: "Don't call us; we'll call you."[2] The lower-level modules provide the implementation for interfaces that are declared within, and called by, the upper-level modules.

[2] [Sweet85]

(Боб Мартин, Agile Software Development. Principles, Patterms, and Practices)

Re[17]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.05.11 10:12
Оценка:
Здравствуйте, Sinclair, Вы писали:

I>>Доставка депенденсов, точно так же как и с DI

S>Простите, но вы, наверное, как-то по другому трактуете термин "инверсия". В моём понимании это "разворот", "отражение", "смена знака".
S>Если раньше A зависел от B, а теперь оба зависят от IB, то это нифига не инверсия. Это — абстракция.

Я говорю про доставку депенденсов, а не про преобразование кода. Преобразование код — рефакторинг.

Инверсия это так — депенденсы конфигурируются или нет. Инициализация конфигурируется или нет. Инциализация делается явно или не явно.

Например когда создаёшь класс сам, ты четко знаешь, что именно ты по месту использования пишешь вызов конктруктора который создаст новый экземпляр. Надо изменить чтото — обходишь все места использования и правишь этот код.

Инверсия — инциализация описывается не по месту использования. После этого ты можешь и не знать, новый ли экземпляр тебе придет, и это тоже инверсия. Соответсвенно, вместо сотни мест нужно модифицировать только одно а может быть и вовсе ниодного

Разница в инжекции и локаторе достаточно простая — push vs pull. Т.е. это тоже инверсия, но к IoC уже отношения не имеет.

Кстати, преобразование конкретное — абстрактное это не только абстракция, но и инверсия
Re[11]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 28.05.11 10:31
Оценка: +2
Здравствуйте, samius, Вы писали:

V>>Повторюсь, хорошо что Фаулер дальше песочницы ентерпрайза не лез. Что бы было, дотянись он до построения компиляторов, обработки информации, ИИ, сетевых протоколов, нечеткой логики и прочего? Боюсь даже представить. Он бы взорвал мозг себе и всем нам.


S>А он и взорвал. Про тот же IoC так написал, что там одна проза, с комментарием что не все его правильно понимают. Не первый раз я сталкиваюсь с ситуацией, когда при одновременном прочтении чего-то из Фаулера, разные люди понимают его по-своему, и каждый считает что прав именно он. Впрочем, с GoF-ом практически так же. Но все-же GoF более формален.


GoF — отличная книжка. Местами спорная, но потянет. Спорная — потому что проблематика таки первична, а она раскрыта слабо. Сразу дается ответ без хода решения, без сравнения вариантов решения и без малейших обоснований. (Думаешь, почему такая тривиальная вещь, как мост, вызывает зачастую разногласия? — постановка задачи хромает на обе ноги). В общем, из-за упомянутых особенностей сия книжка претендовать на учебник никак не может, это НЕ учебный материал. От остальных она выделяется удачно введенной в обиход терминологией. Можно рассматривать как справочник по терминам, а все решенные "задачки" было бы неплохо перерешать заново. Что и сделал Александреску. Вот у него вышел действительно учебный материал, иллюстрирующий этапы решения программистских задач, со всеми обоснованиями, анализом и выводами. Но почему-то ажиотажа не вызывает. Не удивительно, там толковать нечего, всё и так толково растолковано. А где нет толкователей — там нет адептов сект.
Re[13]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 28.05.11 17:36
Оценка: 4 (1)
Здравствуйте, robin_of_the_wood, Вы писали:

___>Я саппортил и на ифах и на State основе. Написал о своих впечатлениях. У Вас другие? Ну так это не значит что мои не верны


А на автоматной модели саппортил?
Хорошо, а использовался ли в варианте State суррогатный идентификатор состояния (числовой, текстовый, указатель на экземпляре State в статической их реализации или typeid(T))? Понимаешь, если использовался (видел такое неоднократно), то в топку, ибо опять паттерн ради паттерна без достаточного понимания. Паттерн State отлично смотрится лишь там, где соблюдается LSP. Стоит начать обращаться к типу текущего State явно (или через его код, не суть) — и получи всю вязанку граблей, сопровождающих нарушение LSP.

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

___>Вы добавили много "А если". При каждом новом уточнении ситуация меняется и должна быть отдельно переосмыслена.


Э нет. Мои "если" — это лишь перечисление ситуаций, где DI нужен (прямо из требований) для одних объектов, но не нужен для других. Т.е. я возражаю насчет "или всё на DI или ничего". DI ради DI такая же глупость, как и любые другие переусложнения дизайна в угоду модным фреймворкам. Надо исходить из сценариев и больше не из чего. Любое изменение даже самого незначительного закоулка дизайна, приводящая к +1 косвенности в этом месте, должно быть обосновано до такой степени, чтобы было понятно, что без этой лишней косвенности никуда. Просто у молодых и горячих есть такой железобетонный аргумент — "на всякий случай", "для будущих расширений" и тому подобное. Как ни конкретная задача, то обязательно надо пытаться слепить из нее "фреймворк для всего". Конечно, эти фремворки потом используются лишь однажды, в том самой целевой задаче. Но целевая задача, по-факту, решена наихудшим из всех возможных способов. Это банальное экспериментирование за счет работодателя.

___>До IoC контейнеров компонент затачивался под контейнер. А тут контейнер работает с любым компонентом подстраиваясь под него.

___>Вот это и есть кстати многостральная инверсия которую любят трактовать по разному. В двух словах. Для 10летнего ребенка.

Подробностей не надо.

Я с самого начала своего програмирования удивляюсь, почему компонентные фреймворки, которые видел, столь слабы и столь неуниверсальны. Начиная с TurboVision. Как бывшему электронщику мне решение кажется тривиальным: http://www.rsdn.ru/forum/philosophy/1676773.1.aspx
Автор: vdimas
Дата: 14.02.06

Заметь, это не просто описание что-то типа "IoC модели мира, начиная с атомов" — это фактически парадигма "сбора" программных модулей без кодирования. И, хотя это противоречит тому, что я только написал, ввиду постоянной лишней косвенности, там подразумевается управление уже готовыми компонентами через какой-нить тул без программирования, т.е. параметризуемость вообще ВСЕХ св-в идет как требование. Заметь, это все лишь для этапа "составления" программы. А не для целевого рантайма, как в сущестсвующих IoC. И пусть не смущает ожидаемое падение производительности в случае такой компонентной модели, ведь структура/схема каждого компонента будет доступна, и по ней потенциально можно генерить релизный оптимизированный код, со всеми распространениями констант, суперкомпиляцией и т.д.

Собсно, вокруг этой темы "визуального построения кода" постоянно участвую в обсуждениях, потому как построение модели некоего ПО таким образом вполне возможно, эксперименты вполне удачны (для своих алгоритмов примочек для гитар). Более того. Неоднократно делал компоненты для всяких моделирующих тулзин и для CAD-ов, например для PCAD, CIRCAD, Simulink, Matlab. И поверь моему опыту, при должной сноровке, те задачи, которые в классическом программировании занимают недели (для достижения "промышленного качества"), в таких тулзах делаются за считанные часы. И переходим к следующей задаче. Ну это как писать растеризацию некоего кастомного контрола вручную для MFC+GDI vs накидать фигуры и эффекты мышкой в бленде. В первом случае у нас будет несколько десятков возможностей ошибиться, не закрыть хендлы, не вернуть состояния DC и т.д., во втором — самих мест для совершения ошибок такого плана просто нет. Среда проектирования не предоставляет.

___>4. Высокоуровневая архитектура вынесена в конфиг


В нормальном компонентном подходе понятие "высокоуровневой архитектуры" бессмысленно. В компонентном подходе может быть только "инфраструктура", задающая правила игры, позволяющая определять и связывать компоненты. Но сами готовые компоненты любых уровней ничем принципиально друг от друга не отличаются: они так же "собраны" из компонентов более низких уровней. Получается, что схема любого компонента — это и есть "высокоуровневая архитектура" с т.з. компонент более низкого уровня.

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

___>5. Поддержка сразу нескольких конфигураций превращается в набор конфигов для одного и того-же кода


Это небольшое достижение. Способов получить "вкусную" декларативность более 1-го, и самый удачный, как было признано, это текстовые и графические DSL. Конфиги (+ графические тулзы для их правки) тоже своего рода DSL, но сильно уж кастрированные, т.к. вовсе не ориентированные проблемно. Мы в них пишем страшные с виду полные аннотации используемых типов в нейспейсах 5-го уровня.

Поэтому и непонятно, чего народ с IoC фреймворками так носится. Как с неким откровением. Полумеры это всё. Хотя, пойдет, конечно, на коленке по-шустряку что-нить сляпать...

___>Ну не фанат я паттернов. Я просто большинство из них знаю


Даже сомн фаулеровских?
Re[11]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 28.05.11 19:05
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:


V>>(Сорри, у меня отношение именно к этому товарищу специфицеское. Единственно, где его узколобость и дотошность оказалась полезной — при составлении списка сценариев рефакторинга. Тут сидящая внутри него "девочка-отличница" оказалась как нельзя кстати.)

___>Ну он ведь ничего нового не сказал, просто систематезировал

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

___>Про 10 лет согласен. Где-то в начале этого периода я решил свою первую архитектурную задачу. Понял некоторые вещи про которые не узнать из книжек. С тех пор были и кирпичики и самопальные IoC контейнеры и глубокое копание в чужих решениях на эту тему. Про идею IoC не совсем с Вами соглашусь. Она чуть глубже чем Вы описываете. В идеале зависимостей нет вообще. Берем кирпичик из старого проекта и он начинает работать в нашем контейнере. Все его связи инжектятся контейнером. От компонента вообще ничего не требуется кроме отсутствия скрытых зависимостей. С этим тоже плиз не спорьте. Я не в википедии и не у Фаулера про это вычитал. Я уже очень давно этими проблемами плотно занимаюсь. Честно.


Постой, ну компонент даже "нескрытые" зависимости должен как-то объявлять и давать возможность их инициализировать? Должна быть инфраструктура в любом случае. Некие основополагающие интерфейсы/протоколы взаимодействия компонентов. Будь то дотнет, джава, COM или некий скриптовый язык с возможностью расширения нативными пользовательскими типами или функциями. Именно эта инфраструктура и есть те самые "третьесторонние" стандарты, обычно напрямую не связанные с предметной областью целевых задач.

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

Итак, что делают IoC фреймворки:
— парсят скрипты конфигурации
— выполняют скрипты конфигурации неким движком.

(Вариант хардкордного ручного конфигурирования контейнера я даже не рассматриваю, ибо это форменный идиотизм — проще связать напрямую без контейнера).

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

Ты на достаточное расстояние отошел, чтобы обозреть картинку? И что же это такое выходит в итоге?

Мы, на основе одного набора компонент, изготовленных предварительно (в compile-time), собираем динамически в рантайм новый целевой компонент/компоненты. Некий XML-конфиг IoC контейнера служит "своеобразным" скриптовым языком программирования. Своеобразным, потому что хуже языка программирования придумать — это надо постараться. Описать на нем один-два "динамических" компонента так еще куда ни шло, но описать некую иерархию или хоть какие-то сценарии на нем... легче застрелиться. Программирование в конфигах IoC, когда сценари получаются довольно сложными (а они рано или поздно таки получаются сложными в серьезных проектах), по моему ИМХО всё это — наглядная демонстрация мема про неправильное удаления гланд.

Ведь можно взять нормальные скриптовые платформы/библиотеки и делать то же самое с человеческим синтаксисом нормальных скриптовых языков. Или сбацать свои DSL, чтобы достичь наибольшей выразительности. Тем более, что некоторые скриптовые языки довольно легко расширяемы пользовательскими "встроенными" типами и ф-ями, т.е. DSL можно сделать задешево. Ну блин, ведь так всё просто, если плясать от того самого универсального подхода к проектированию. Если стоит требование динамического программирования, то надо всего-навсего удовлетворять это требование. Желательно самым прямолинейным и удобным способом, используя специально предназначенные для этого ср-ва.

Хотя, совсем отрицать полезность IoC тулзовин я не буду. Они хороши низким порогом вхождения, не надо изучать сложный АПИ и особенности некоей скриптовой среды, не надо писать свои DSL и т.д. Повторю себя же рядом — для каких-то миниатюрных задачек вполне пойдет, например для экспериментов, чтобы позапускать что-то в разной конфигурации. Или быстренько что-то сбацать на коленке, добиться работоспособности, получить деньги и разбежаться. Угу. Желательно как можно дальше. Чтобы не участвовать в поддержке и не дай бог в развитии/усложнении проекта. Но ведь сей сценарий как-то не тянет на "много и плотно с этим работал". Не объяснишься?
Re[14]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 28.05.11 20:33
Оценка:
Здравствуйте, vdimas, Вы писали:
....
Многое пропущу.
Уточню только что реализации State паттерна разные видел.
LSP нарушать нехорошо. Как и другие принципы ООП. Сам стараюсь чтить.

V>Поэтому и непонятно, чего народ с IoC фреймворками так носится. Как с неким откровением. Полумеры это всё. Хотя, пойдет, конечно, на коленке по-шустряку что-нить сляпать...

Я за всех не в ответе. А сам лично ничего лучше не видел со времен того самого TurboVision-а. А вот гораздо хуже — очень много.
Может Вам попадались особые заказчики. Может Ваш уровень много выше. Откуда я знаю.
Многие из моих работодателей сильно бы обиделись если бы их продукт назвали слепленым на коленке, а у некоторых в архитектуре до IoC как до космоса. Так что тут есть идеалы и реальность и пропасть между ними

___>>Ну не фанат я паттернов. Я просто большинство из них знаю

V>Даже сомн фаулеровских?
Даже Фаулеровских. Я просто фанат порядка в коде, независимо от средств достижения
Проектирование велосипедов для слепых жирафов
Re[12]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 28.05.11 21:20
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Постой, ну компонент даже "нескрытые" зависимости должен как-то объявлять и давать возможность их инициализировать? Должна быть инфраструктура в любом случае.

V>Некие основополагающие интерфейсы/протоколы взаимодействия компонентов. Будь то дотнет, джава, COM или некий скриптовый язык с возможностью расширения нативными пользовательскими типами или функциями. Именно эта инфраструктура и есть те самые "третьесторонние" стандарты, обычно напрямую не связанные с предметной областью целевых задач.
Ну во первых начнем с инфраструктуры. Ее отсутствие и есть ключевая фича IoC контейнеров
Контейнер неинтрузивен и легковесен.
Абсолютно любой класс может быть элементом контейнера. Никаких стандартов.
Именно поэтому с ними как вы выразились "так носятся". Отсюда новшество подхода и все вытекающие преимущества.


V>А насчет "все его связи инжектятся контейнером". Давай остановимся подробнее, коль ты с этим много работал. Не против взглянуть на ситуацию чуть со стороны?

Можно и со стороны

V>Итак, что делают IoC фреймворки:

V>- парсят скрипты конфигурации
V>- выполняют скрипты конфигурации неким движком.

V>(Вариант хардкордного ручного конфигурирования контейнера я даже не рассматриваю, ибо это форменный идиотизм — проще связать напрямую без контейнера).

Не совсем понял но хардкода точно нет.

V>Итак. В результате мы создаем экземпляры компонентов, инициализируем значения их св-в. Потом запускаем на выполнение какой-нить метод какого-нить экземпляра. Разумеется, значениями св-в могут быть так же экземпляры других компонент. В т.ч. абстрактные, и даже с декларативным указанием для такого-то компонента под такой-то интерфейс подставить такую-то реализацию.


V>Ты на достаточное расстояние отошел, чтобы обозреть картинку? И что же это такое выходит в итоге?

Выходит намного лучше, чем без такого контейнера

V>Мы, на основе одного набора компонент, изготовленных предварительно (в compile-time), собираем динамически в рантайм новый целевой компонент/компоненты. Некий XML-конфиг IoC контейнера служит "своеобразным" скриптовым языком программирования. Своеобразным, потому что хуже языка программирования придумать — это надо постараться. Описать на нем один-два "динамических" компонента так еще куда ни шло, но описать некую иерархию или хоть какие-то сценарии на нем... легче застрелиться. Программирование в конфигах IoC, когда сценари получаются довольно сложными (а они рано или поздно таки получаются сложными в серьезных проектах), по моему ИМХО всё это — наглядная демонстрация мема про неправильное удаления гланд.

Смотря с чем сравнивать. Мне приходилось сравнивать с сильно связаным кодом в котором после нескольких лет разработки уже никто не разбирается. По сравнению с таким кодом IoC — это сказка.

V>Ведь можно взять нормальные скриптовые платформы/библиотеки и делать то же самое с человеческим синтаксисом нормальных скриптовых языков. Или сбацать свои DSL, чтобы достичь наибольшей выразительности. Тем более, что некоторые скриптовые языки довольно легко расширяемы пользовательскими "встроенными" типами и ф-ями, т.е. DSL можно сделать задешево. Ну блин, ведь так всё просто, если плясать от того самого универсального подхода к проектированию. Если стоит требование динамического программирования, то надо всего-навсего удовлетворять это требование. Желательно самым прямолинейным и удобным способом, используя специально предназначенные для этого ср-ва.

Если увижу подобное решение в действии, то может быть соглашусь, что IoC — это вчерашний день.
Пока не встречал.

V>Хотя, совсем отрицать полезность IoC тулзовин я не буду. Они хороши низким порогом вхождения, не надо изучать сложный АПИ и особенности некоей скриптовой среды, не надо писать свои DSL и т.д. Повторю себя же рядом — для каких-то миниатюрных задачек вполне пойдет, например для экспериментов, чтобы позапускать что-то в разной конфигурации. Или быстренько что-то сбацать на коленке, добиться работоспособности, получить деньги и разбежаться. Угу. Желательно как можно дальше. Чтобы не участвовать в поддержке и не дай бог в развитии/усложнении проекта. Но ведь сей сценарий как-то не тянет на "много и плотно с этим работал". Не объяснишься?

Да вот я пытаюсь, но что-то мне подсказывает что не смогу. Вы проекты, которым 10 а то и больше лет видели?
А новые совсем свежие в которых по пару десятков реализаций синглтонов? Где кто с кем связан пока выяснишь, так эта инфа уже устареть успевает. А чтобы протестировать что творят я не буду рассказывать. И это как 10 лет назад было так и сейчас есть. Вы вот это все про что рассказываете в Ваших проектах используете? Если да, то забудьте про IoC. Вы его просто переросли. А вот мне еще ой как пригодится
Проектирование велосипедов для слепых жирафов
Re[12]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.05.11 21:38
Оценка: +1
Здравствуйте, vdimas, Вы писали:

V>Итак, что делают IoC фреймворки:

V>- парсят скрипты конфигурации
V>- выполняют скрипты конфигурации неким движком.

Это необязательная часть. Главная часть в них это хранение, доставка зависимостей, управление временем жизни и кое какие детали. Конфигурирование через файлы, автоматический сбор депенденсов — это все буллшит.

V>(Вариант хардкордного ручного конфигурирования контейнера я даже не рассматриваю, ибо это форменный идиотизм — проще связать напрямую без контейнера).


Не проще. Конфигурация в виде кода наглядна и позволяет пользоваться всеми преимущетсвами IDE как например рефакторинг или Find Usages.

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

V>Мы, на основе одного набора компонент, изготовленных предварительно (в compile-time), собираем динамически в рантайм новый целевой компонент/компоненты. Некий XML-конфиг IoC контейнера служит "своеобразным" скриптовым языком программирования. Своеобразным, потому что хуже языка программирования придумать — это надо постараться. Описать на нем один-два "динамических" компонента так еще куда ни шло, но описать некую иерархию или хоть какие-то сценарии на нем... легче застрелиться. Программирование в конфигах IoC, когда сценари получаются довольно сложными (а они рано или поздно таки получаются сложными в серьезных проектах), по моему ИМХО всё это — наглядная демонстрация мема про неправильное удаления гланд.


Проблема не в IoC. Сама задача доставки депенденсов слишком сложная, что бы её решать без каких либо инструментов.

V>Ведь можно взять нормальные скриптовые платформы/библиотеки и делать то же самое с человеческим синтаксисом нормальных скриптовых языков.


Ага, а откуда скрипт будет брать депенденсы ?

V>Хотя, совсем отрицать полезность IoC тулзовин я не буду. Они хороши низким порогом вхождения, не надо изучать сложный АПИ и особенности некоей скриптовой среды, не надо писать свои DSL и т.д.


IoC тулзовины все как одна обладают высоким порогом вхождения. Кроме того, когда проект становится слабо-связным, в ём очень трудно решать некоторые задачи,т.к. нет наглядной картины и не ясно, чего нужно ожидать от кода. Т.е. с монолитом разбираться легко, но есть сложность со внесением изменений. Со слабосвязным проектом разбираться трудно, но легко вносить изменения.
Re[11]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 28.05.11 21:50
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___> Про идею IoC не совсем с Вами соглашусь. Она чуть глубже чем Вы описываете. В идеале зависимостей нет вообще.


Ну ка, поподробнее. Например куда в идеале денется зависимость от корня квадратного в функции вычисления площади треугольника по формуле Герона.
Re[13]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 28.05.11 22:35
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

V>>Постой, ну компонент даже "нескрытые" зависимости должен как-то объявлять и давать возможность их инициализировать? Должна быть инфраструктура в любом случае.

V>>Некие основополагающие интерфейсы/протоколы взаимодействия компонентов. Будь то дотнет, джава, COM или некий скриптовый язык с возможностью расширения нативными пользовательскими типами или функциями. Именно эта инфраструктура и есть те самые "третьесторонние" стандарты, обычно напрямую не связанные с предметной областью целевых задач.
___>Ну во первых начнем с инфраструктуры. Ее отсутствие и есть ключевая фича IoC контейнеров

Нет, инфраструктура есть всегда, иначе "контейнер" не будет работать. (Сам термин "контейнер" крайне неудачный, ИМХО). Пусть даже эта инфраструктура дается "бесплатно", если IoC выполнен на Java или .Net. Тогда он просто пользует имеющуюся рефлексию, и совершает совсем мало собственной работы.

___>Контейнер неинтрузивен и легковесен.


Да не контейнер это нифига. Это енжин по парсингу конфигов и их незамысловатому исполнению. А если брать голый сервис локатор — то это вообще хелпер в десяток-другой строчек (по крайней мере на дотнете), недостойный обсуждения.


___>Именно поэтому с ними как вы выразились "так носятся". Отсюда новшество подхода и все вытекающие преимущества.


Я вижу "новшество подхода" лишь в использовании XML в качестве динамического языка программирования. Причем, в джаве это "новшество" практически во всех фреймворках.


___>Если да, то забудьте про IoC. Вы его просто переросли. А вот мне еще ой как пригодится


Да не могу я его перерости, это один из базовых принципов инженерии и основа любой удачной декомпозиции. Например, на нем держится целиком и полностью функциональное программирование, бо любой первоклассный функциональный объект — это и есть IoC c т.з. вызывающего, если сей функциональный объект идет как параметр. А он не может идти для вызывающего по-другому в "чистом" ФП. И используемый мною алгоритмы STL и многие либы буста в т.ч. целиком и полностью на IoC-принципе лежат. Ты случайно не путаешь IoC-принцип с характеристиками конкретных IoC-фреймворков?

В общем, вопрос относительно этих фреймворков стоит так: почему для реализации требований динамического скриптинга использована его эмуляция на XML вместо специально для этого предназначенных скриптовых языков? Ведь хватает для джавы скриптовых языков, насколько я в курсе.

Ну о чем думали разработчики, ваяя такое:
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
<constructor-arg><ref bean="yetAnotherBean"/></constructor-arg>
<constructor-arg type="int"><value>1</value></constructor-arg>
</bean>


Вместо какого-нить человеческого скрипта:
def exampleBean = new ExampleBean(anotherExampleBean, yetAnotherBean , 1);


Даже если на тот момент еще не было популярных динамических языков , перенесенных на джавовский байт-код, то запрограммировать несложный интерпретатор, который умеет лишь вызывать методы/конструкторы и устанавливать св-ва объектов, не такой уж rocket science.
Re[13]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 28.05.11 23:15
Оценка:
Здравствуйте, Ikemefula, Вы писали:


I>Это необязательная часть. Главная часть в них это хранение, доставка зависимостей, управление временем жизни и кое какие детали. Конфигурирование через файлы, автоматический сбор депенденсов — это все буллшит.


Ты под доставкой зависимостей SL имеешь ввиду? Для него не нужен целый фреймворк, это хелпер на несколько строк.

V>>(Вариант хардкордного ручного конфигурирования контейнера я даже не рассматриваю, ибо это форменный идиотизм — проще связать напрямую без контейнера).


I>Не проще. Конфигурация в виде кода наглядна и позволяет пользоваться всеми преимущетсвами IDE как например рефакторинг или Find Usages.


И нафига тебе некий фрейморк тогда. Сделай себе миниатюрный SL-хелпер и всё. По остальному — это несколько совершенно несвязанных ортогональных задач. Они завязаны во "фреймворк" исключительно через единый парсер и интерпретатор конфига. При "ручном" конфигурировании эти задачи ничего не объединяет. Короче, для ручного подхода скрипач не нужен.


I>Без контейнера тебе придется самому писать диспетчеризацию зависимостей, при определенном размере проекта это становится в крайне сложной задачей.


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

I>Проблема не в IoC. Сама задача доставки депенденсов слишком сложная, что бы её решать без каких либо инструментов.


Можно пример сложностей в доставке зависимостей? А то этого суслика живьем еще никто не видел.

V>>Ведь можно взять нормальные скриптовые платформы/библиотеки и делать то же самое с человеческим синтаксисом нормальных скриптовых языков.


I>Ага, а откуда скрипт будет брать депенденсы ?


А откуда их берет XML? Ровно оттуда же. Вопрос лишь в каком виде идет декларативное описание.

V>>Хотя, совсем отрицать полезность IoC тулзовин я не буду. Они хороши низким порогом вхождения, не надо изучать сложный АПИ и особенности некоей скриптовой среды, не надо писать свои DSL и т.д.


I>IoC тулзовины все как одна обладают высоким порогом вхождения.


Не изобретай. Высокий порог там только в понимании "а на хрена это сделано именно так?" Я его так и не преодолел. XML — самый неподходящий скриптовый язык программирования из мне известных. Сами эти фреймворки выполняют очень малое число операций. Просто всё это нехило замыливается через неудобство использования. Само неудобство использования добавляет сложности, да-а... только это не сложность понимания, это сложность именно использования. Для примера, понять brainfuck можно за 5 минут, а эффективно использовать не научиться за всю жизнь.


I>Кроме того, когда проект становится слабо-связным, в ём очень трудно решать некоторые задачи,т.к. нет наглядной картины и не ясно, чего нужно ожидать от кода. Т.е. с монолитом разбираться легко, но есть сложность со внесением изменений. Со слабосвязным проектом разбираться трудно, но легко вносить изменения.


повторю, разбираться бывает сложно исключительно из-за нечитабельности XML. В тех XML-простынях, что мне доводилось разбираться, достаточно было выполнить описанную логику в виде обычного скрипта, и всей логики было бы на пару экранов кода. Т.е. тьфу полнейшее.
Re[12]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 28.05.11 23:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:


___>> Про идею IoC не совсем с Вами соглашусь. Она чуть глубже чем Вы описываете. В идеале зависимостей нет вообще.


I>Ну ка, поподробнее. Например куда в идеале денется зависимость от корня квадратного в функции вычисления площади треугольника по формуле Герона.


Он имел ввиду, что нет зависимостей от специальных интерфейсов и протоколов, реализующих инфраструктуру фрйемворка. Но он ошибся, т.к. скорее всего подразумевал фреймворк на какой-нить джаве или дотнете, где сия инфраструктура идет "бесплатно".
Re[18]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 29.05.11 01:00
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Нет, там такого как раз и не сказано. Там сказано, что IoC > DI


I>Поскольку IoC шире, чем просто DI, логично предположить, что есть еще IoC но не DI, и, опаньки !, таким оказывается сервис локатор.


Угу, но сама операция обращения к сервис-локатору обычно выполняется в целях DI. Мы вместо кучи синглтонов имеем всего один, который нам эмулирует все остальные. Т.е. обращение к конкретному сервису — DI в действии. А SL — так, промежуточный хелпер. Лишь реализация принципа уменьшения кол-ва внешних протоколов/интерфейсов. Ок, наступлю на твой больной мозоль — уменьшения зависимостей.


I>Соотвественно, если человек путает == и >= , c ним нет смысла спорить


IoC — это принцип, а DI — это одна из техник его реализации. Он не виноват. Просто развели бардак в терминологии из-за всяких "контейнеров IoC", которые суть "фреймворки DI", а дополнительная функциональность контейнера ни к IoC, ни к DI никакого отношения не имеет.
Re[12]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 29.05.11 07:38
Оценка:
Здравствуйте, Ikemefula, Вы писали:

___>> Про идею IoC не совсем с Вами соглашусь. Она чуть глубже чем Вы описываете. В идеале зависимостей нет вообще.


I>Ну ка, поподробнее. Например куда в идеале денется зависимость от корня квадратного в функции вычисления площади треугольника по формуле Герона.

Я не совсем корректно выразился. Просто до этого упоминались некие третьесторонние интерфейсы. Более корректно будет сказать что, нет зависимостей ни от чего, кроме интерфейсов других компонентов, требуемых данному для работы.
А так как эти интерфейсы сами уже ни от чего не зависят, то на этом список зависимостей обрывается. В основном я хотел подчеркнуть что нет зависимостей ни от каких деталей контейнера. Компонент одинаково работает и в контейнере и без контейнера и в другом контейнере. Просто делает свою работу. Ну а отсюда уже все преимущества вытекают.
Проектирование велосипедов для слепых жирафов
Re[14]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 29.05.11 08:28
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Нет, инфраструктура есть всегда, иначе "контейнер" не будет работать. (Сам термин "контейнер" крайне неудачный, ИМХО). Пусть даже эта инфраструктура дается "бесплатно", если IoC выполнен на Java или .Net. Тогда он просто пользует имеющуюся рефлексию, и совершает совсем мало собственной работы.

Ну в этом смысле она етсь. Ее нет а точнее не видно для разработчика компонента. Он пишет код совершенно ничего не зная о контейнере.

___>>Контейнер неинтрузивен и легковесен.

V>Да не контейнер это нифига. Это енжин по парсингу конфигов и их незамысловатому исполнению. А если брать голый сервис локатор — то это вообще хелпер в десяток-другой строчек (по крайней мере на дотнете), недостойный обсуждения.
Ну такой термин имеет некое распространение. Если термин "фреймворк" использовать то дотнетчик спросит "А какой версии?" и можно много спорить про неправильное понимание термина
А SL Вы к чему упомянули? Лично я с Вашим мнением по его поводу согласен по крайней мере еще и в контексте C++ и Java.

___>>Именно поэтому с ними как вы выразились "так носятся". Отсюда новшество подхода и все вытекающие преимущества.

V>Я вижу "новшество подхода" лишь в использовании XML в качестве динамического языка программирования. Причем, в джаве это "новшество" практически во всех фреймворках.
Ну в яве для Spring-а кстати есть альтернатива — аннотации.
Хотя лично мне этот вариант не нравится так как он затрудняет использования одних и тех же компонент в разных конфигурациях.
Новшество было по сравнении с EJB который все же некоторый стандарт.


V>Ну о чем думали разработчики, ваяя такое:

V>
V><bean id="exampleBean" class="examples.ExampleBean">
V><constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
V><constructor-arg><ref bean="yetAnotherBean"/></constructor-arg>
V><constructor-arg type="int"><value>1</value></constructor-arg>
V></bean>
V>


V>Вместо какого-нить человеческого скрипта:

V>
V>def exampleBean = new ExampleBean(anotherExampleBean, yetAnotherBean , 1);
V>


V>Даже если на тот момент еще не было популярных динамических языков , перенесенных на джавовский байт-код, то запрограммировать несложный интерпретатор, который умеет лишь вызывать методы/конструкторы и устанавливать св-ва объектов, не такой уж rocket science.

А вот это я наверно смогу обьяснить. Со своей колокольни конечно.
Первое понятно любому, кто слышал про XML. И всем одинаково понятно. Хотя может и не так красиво.
Второе очень от ситуации зависит. То что для одних "человеческий" скрипт, для других может името очень другое название
Разные проекты бывают, языки, платформы
А еще Вы очень правильно про порог вхождения упомянули в прошлом посте.
В первом случае один язык программирования плюс фреймворк а во втором сильно все сложнее в этом плане.
А команда она разная бывает. Ее то из реального мира набирают. Чем разнообразнее требования, тем сложнее человека найти. Или один кандидат отлично знате один язык программирования а второй два или три но лучше б знал один.
Потом ну запрограммируете Вы _свой_ несложный интерпретатор. А саппортить другому. Он скажет "Что это еще за хрень?" и будет прав.

Так что оба варианта не идеальны но первый проще и во многих случаях его достаточно.
А по поводу дальнейшего расширения и саппорта, то в тех случаях, с которыми я работал, не было не только никаких проблем, а даже намека на проблемы я не припоминаю. У Вас я так понял иные впечатления. У всех колокольни разные
Проектирование велосипедов для слепых жирафов
Re[14]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 09:24
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Ты под доставкой зависимостей SL имеешь ввиду? Для него не нужен целый фреймворк, это хелпер на несколько строк.


Это смотря сколько функционала он будет уметь. Ты в курсе про моникеры ?

I>>Не проще. Конфигурация в виде кода наглядна и позволяет пользоваться всеми преимущетсвами IDE как например рефакторинг или Find Usages.


V>И нафига тебе некий фрейморк тогда. Сделай себе миниатюрный SL-хелпер и всё. По остальному — это несколько совершенно несвязанных ортогональных задач. Они завязаны во "фреймворк" исключительно через единый парсер и интерпретатор конфига. При "ручном" конфигурировании эти задачи ничего не объединяет. Короче, для ручного подхода скрипач не нужен.


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

V>"Диспетчеризация зависимостей" априори нужна там, где мы ей играем. В динамике какой-нить. Для тестов. Иначе ее диспетчеризировать не надо, она сама получается.


Сама она точно не получится. Это всегда нужно писать руками. И это тот код который не нужен в принципе.

I>>Проблема не в IoC. Сама задача доставки депенденсов слишком сложная, что бы её решать без каких либо инструментов.


V>Можно пример сложностей в доставке зависимостей? А то этого суслика живьем еще никто не видел.


Ну это просто. Предтсавим большое приложение средней сложности примерно около 50мб C# кода. Компоненту для своей работы нужна целая куча зависимостей. Часть из низ задаются при старте приложения. Часть передаются в конфиге приложения. Часть из них задаются вызывающим модулем (а у него в свою очередь все точно так же) и остальное докидывает контекст выполнения. Некоторые зависимости должны быть заменяемыми. Некоторые должны быть в единственном экземпляре на модуль или на приложение или на компонент. Некоторые должны уметь ленивую инициализацию, а некоторые должны разрушаться правильным образом.

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

Решение с IoC =

  MegaModule module = container.Resolve<MegaModule>(CallingContext,ExecutionContext);


Код конфигурации выглядит тривиально и задан в декларативном виде.

I>>Ага, а откуда скрипт будет брать депенденсы ?


V>А откуда их берет XML? Ровно оттуда же. Вопрос лишь в каком виде идет декларативное описание.


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

I>>IoC тулзовины все как одна обладают высоким порогом вхождения.


V>Не изобретай. Высокий порог там только в понимании "а на хрена это сделано именно так?" Я его так и не преодолел.


Ну это заметно, что ты не преодолел

>XML — самый неподходящий скриптовый язык программирования из мне известных.


И правильно, нечего им пользоваться.

>Сами эти фреймворки выполняют очень малое число операций. Просто всё это нехило замыливается через неудобство использования. Само неудобство использования добавляет сложности, да-а...


Где ты видишь неудобство использования
MegaModule module = container.Resolve<MegaModule>(CallingContext,ExecutionContext);




V>повторю, разбираться бывает сложно исключительно из-за нечитабельности XML.


XML это отстой. Конфигурировать нужно кодом. Сборку для конфигуряния можно легко и просто сменить. у xml практически нет преимуществ.

И даже если задаёшь кодом, порог вхождения высок.
Re[19]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 09:27
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Угу, но сама операция обращения к сервис-локатору обычно выполняется в целях DI.


Локатор это pull, а di это push, вот и вся разница.

>Мы вместо кучи синглтонов имеем всего один, который нам эмулирует все остальные. Т.е. обращение к конкретному сервису — DI в действии. А SL — так, промежуточный хелпер. Лишь реализация принципа уменьшения кол-ва внешних протоколов/интерфейсов. Ок, наступлю на твой больной мозоль — уменьшения зависимостей.


Все паттерны есть результат этого уменшения зависимостей
Re[5]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 10:02
Оценка:
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>Обрати внимание на последовательность, описание State стало для тебя только шпаргалкой, про которую ты вовремя вспомнил. Собственно, это и есть, наверное, самый приемлемый способ "использования" паттернов: ассоциативное сопоставление. Правда, что-то мне подсказывает, что уж до чего-чего, а до State додуматься просто до элементарного.


И по этой причине это из тех паттернов, которыми пользуются в разы реже чем следовало бы ?
Re[20]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 29.05.11 10:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>Угу, но сама операция обращения к сервис-локатору обычно выполняется в целях DI.


I>Локатор это pull, а di это push, вот и вся разница.


Да, Кэп. Значения частенько извлекаются по pull, а устанавливаются по push.
Re[6]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.05.11 10:31
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, Геннадий Васильев, Вы писали:


ГВ>>Обрати внимание на последовательность, описание State стало для тебя только шпаргалкой, про которую ты вовремя вспомнил. Собственно, это и есть, наверное, самый приемлемый способ "использования" паттернов: ассоциативное сопоставление. Правда, что-то мне подсказывает, что уж до чего-чего, а до State додуматься просто до элементарного.


I>И по этой причине это из тех паттернов, которыми пользуются в разы реже чем следовало бы ?


В разы чаще чем следовало бы. N уникальных классов состояний + вплоть до N*M реализаций методов, невозможность "собрать" и настроить машину состояний в рантайме, стремящийся к 0-ю реюз кода, сложность в поддержке.
Не понимаю, что вообще заставляет людей использовать этот паттерн в случаях, сложнее чем в GoF-е.
Re[15]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 29.05.11 11:01
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Первое понятно любому, кто слышал про XML. И всем одинаково понятно. Хотя может и не так красиво.

___>Второе очень от ситуации зависит. То что для одних "человеческий" скрипт, для других может името очень другое название

Ну понимаешь, в этом т.н. "конфиге" идет перечисление императивных действий, которые необходимо выполнить при создании объекта описываемого типа. Сам характер исполнения сих действий аналогичен работе интерпретатора динамического языка — некий енжин "исполняет" данные. Я просто в упор не понимаю заблуждения по поводу универсальности XML. Дело же не только в структуре XML-документа, про которую большинство разработчиков (согласен) хотя бы слышали. А как же семантика и правила использования тагов, т.е. как же схема док-та? Она же твоим коллегам свыше не дается, зубрить надо. Неужели выучить некую схему XML проще, чем некий простейший DSL из ровно 4-х операторов? В равнозначном ХМL тагов заметно больше, бо в случае ЯП мы вовсю пользуем синтаксис, позиционирование элементов и т.д. А в XML надо полностью описывать AST равнозначного выражения. Ну блин, программировать в AST... Мне даже сложно представить, что можно всерьез оправдывать этот подход.

___>Потом ну запрограммируете Вы _свой_ несложный интерпретатор. А саппортить другому. Он скажет "Что это еще за хрень?" и будет прав.


Почему это "мой"? Один для всего огромного спринга, например. И для других аналогичных проектов тоже.
Re[15]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 29.05.11 12:02
Оценка: 4 (1)
Здравствуйте, Ikemefula, Вы писали:

V>>Ты под доставкой зависимостей SL имеешь ввиду? Для него не нужен целый фреймворк, это хелпер на несколько строк.


I>Это смотря сколько функционала он будет уметь. Ты в курсе про моникеры ?


И? Для SL глубоко пофиг, какой сложности будут фабрики/сервисы, доступ к которым он организует. Да и принцип кодирования ключа сервиса не принципиален. Он мог бы быть произвольным, подходящим под задачу. Это не тот уровень. Засада ведь в том, что используя IoC-фреймворки у тебя под руками лишь некий заведомо ограниченный набор приемов и функциональности, из которых ты должен изворачиваться и пытаться решать свою задачу. Т.е. наверняка начинаешь ограничивать сценарии использования объектов возможностями используемых IoC контейнеров. Это и называется проектировать не с той стороны.

I>Для ручного подхода пожет понадобиться целый вагон функционала.


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

I>Сама она точно не получится. Это всегда нужно писать руками. И это тот код который не нужен в принципе.


Как это не нужен? Ты же в конфиге описываешь на динамическом ЯП создание "компонента" из имеющегося. Если не через конфиг, а захардкодить вручную через АПИ контейнера — то тоже самое, только в профиль — ты описываешь правила создания/инициализации объектов. Почему захардкодить AST будущих прокручиваемых в динамике операций удобней, чем описать их императивно непосредственно в используемом ЯП?

I>>>Проблема не в IoC. Сама задача доставки депенденсов слишком сложная, что бы её решать без каких либо инструментов.


V>>Можно пример сложностей в доставке зависимостей? А то этого суслика живьем еще никто не видел.


I>Ну это просто. Предтсавим большое приложение средней сложности примерно около 50мб C# кода. Компоненту для своей работы нужна целая куча зависимостей. Часть из низ задаются при старте приложения. Часть передаются в конфиге приложения. Часть из них задаются вызывающим модулем (а у него в свою очередь все точно так же) и остальное докидывает контекст выполнения. Некоторые зависимости должны быть заменяемыми. Некоторые должны быть в единственном экземпляре на модуль или на приложение или на компонент. Некоторые должны уметь ленивую инициализацию, а некоторые должны разрушаться правильным образом.


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


Есть такое понятие как контекст. Один из простейших паттернов. В контексте как раз обычно и живут фабрики/сервисы. Код по описанию работы этих фабрик принципиально не может быть больше/сложнее описания их работы в XML или через АПИ твоего контейнера. Оставь от IoC контейнера функциональность только контекста, и он станет не нужен, бо там один-два библиотечных класса это все разруливают, как в хосте дизайнера Windows.Forms, например. Для случая хардкорной конфигурации это overdesign и совершенно неудобный синтаксис описания банальных, вообще-то, действий. Эти IoC-контейнеры изначально были созданы для динамики и только для нее. Так что, если ты где-то используешь IoC без динамики, то ты пользуешь тул не по назначению, это просто привычка к конкретному фреймворку и попытка его везде пихать.

I>Решение с IoC =


I>
I>  MegaModule module = container.Resolve<MegaModule>(CallingContext,ExecutionContext);
I>


Ну и чем оно для случая хардкода будет отличаться от неких executionContext.Resolve<MegaModule>(сallingContext), выполненных по технике мультиметдов (двойной диспетчеризации)? Меньшим кол-вом кода, разве что и его большей понятностью, ибо можно будет использовать непосредственно ЯП, а не накачивать некий фреймворк данными для последующей интерпретации. Это при том, что у тебя не будет той проблем с отладкой, за которую ругают IoC, т.к. в крайнем случае и пошагово пройтись можно будет. А твой IoC — черный ящик, целостность вложенной тобой логики в который, может быть нарушена какой-нить инициализацией, сделанной ПОСЛЕ тебя.

I>Код конфигурации выглядит тривиально и задан в декларативном виде.


Декларативность обычно используется для уменьшения кол-ва буков. Если их больше — нафиг такую декларативность.
Единственная true-декларативность присутствует только в задании отношений типа клиент=>интерфейс=>имплементация. Но это и без декларативности такая же одна строчка инициализации в императиве.

I>>>Ага, а откуда скрипт будет брать депенденсы ?


V>>А откуда их берет XML? Ровно оттуда же. Вопрос лишь в каком виде идет декларативное описание.


I>Эдак ты все проблемы будешь ловить в рантайме, более того, отладчик и подобные инструменты тебе не помогут. XML для описания зависимостей это олдскульная джава десятилетней давности

I>Например с таким подходом ты хрена с два скажешь, где используется инстанс конкретного класса.

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

I>>>IoC тулзовины все как одна обладают высоким порогом вхождения.


V>>Не изобретай. Высокий порог там только в понимании "а на хрена это сделано именно так?" Я его так и не преодолел.


I>Ну это заметно, что ты не преодолел


Ну да, если буквально на каждый аспект сразу же хочется сделать совсем по другому, не столь топорно. Не припомню, чтобы при знакомстве с другими фреймворками это желание было столь близко к 100%. Обычно наоборот — чему-то учишься, что-то интересное подсматриваешь.

>>XML — самый неподходящий скриптовый язык программирования из мне известных.


I>И правильно, нечего им пользоваться.


Да, но сама динамика — это порой объективные требования. Надо просто разглядеть реально происходящее: из имеющихся готовых компонент ты в динамике составляешь новый компонент/компоненты. Даже для самого тривиального случая создания и инициализации единичного объекта простыми типами — это что-то типа обычного наследования с целью переопределения его конструктора. Надо для этого процесса предоставить адекватный инструмент. Да, многие проекты пользуются скриптовыми языками в качестве высокоуровневого клея. Разумеется, в этих проектах никому и в голову не придет пользовать IoC-контейнеры, т.к. скриптовые языки по природе своей куда как богаче, чем ограниченный набор функциональности контейнера.

I>Где ты видишь неудобство использования

I>
I>MegaModule module = container.Resolve<MegaModule>(CallingContext,ExecutionContext);
I>


А включаешь — не работает. Нужно инициализировать контейнер предварительно.

I>XML это отстой. Конфигурировать нужно кодом. Сборку для конфигуряния можно легко и просто сменить. у xml практически нет преимуществ.


Да я уже понял, что ты IoC используешь не по назначению.

I>И даже если задаёшь кодом, порог вхождения высок.


Все, что описывается птичьим языком, вместо нормальных выразительных ЯП, априори будет иметь высокий порог вхождения. Brainfuck я уже упоминал.
Re[21]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 16:53
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Локатор это pull, а di это push, вот и вся разница.


V>Да, Кэп. Значения частенько извлекаются по pull, а устанавливаются по push.


Ты не понял. pull это значит что компонент сам вытягивает и устанавливает нужные ему депенденси, т.е. компонент активно использует локатор. push означает что компоненту не надо знать ничего про локатор, а депенденсы устанавливаются в момент получения ссылки на этот компонет.
Re[7]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 16:55
Оценка:
Здравствуйте, samius, Вы писали:

S>В разы чаще чем следовало бы. N уникальных классов состояний + вплоть до N*M реализаций методов, невозможность "собрать" и настроить машину состояний в рантайме, стремящийся к 0-ю реюз кода, сложность в поддержке.


А что, всегда нужно собирать эту машину состояни в рантайме ? У меня вот получается реюзать. Да и сложности в поддержке особо нет никакой, разумеется, если State правильно организован.

S>Не понимаю, что вообще заставляет людей использовать этот паттерн в случаях, сложнее чем в GoF-е.


Его вообще мало кто применяет даже в подобных случаях.
Re[16]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 17:19
Оценка:
Здравствуйте, vdimas, Вы писали:

V>И? Для SL глубоко пофиг, какой сложности будут фабрики/сервисы, доступ к которым он организует. Да и принцип кодирования ключа сервиса не принципиален. Он мог бы быть произвольным, подходящим под задачу. Это не тот уровень. Засада ведь в том, что используя IoC-фреймворки у тебя под руками лишь некий заведомо ограниченный набор приемов и функциональности, из которых ты должен изворачиваться и пытаться решать свою задачу. Т.е. наверняка начинаешь ограничивать сценарии использования объектов возможностями используемых IoC контейнеров. Это и называется проектировать не с той стороны.


На более менее большом проекте IoC, если ты его не используешь явно, он родится сам собой в виде монстрика из кучи неструктурированых контекстов, фабрик, сервисов и кучи водопроводного кода вперемежку с дублированием

I>>Для ручного подхода пожет понадобиться целый вагон функционала.


V>Дык, вовсе не вагон, если брать функциональность IoC. Но, да, зато вагон произвольно функционала сверху, ибо ничем не связаны.


Именно IoC это вагон функционала.

I>>Сама она точно не получится. Это всегда нужно писать руками. И это тот код который не нужен в принципе.


V>Как это не нужен?


Очень просто — подсчет площади треугольника это полезный код. А код, с помощью которого ты получишь нужную функцию никакой пользой не обладает. Потомму он и не нужен в принципе. IoC позволяет этот код свести к минимуму.

>Ты же в конфиге описываешь на динамическом ЯП создание "компонента" из имеющегося. Если не через конфиг, а захардкодить вручную через АПИ контейнера — то тоже самое, только в профиль — ты описываешь правила создания/инициализации объектов.


Я уже объяснил почему — потому что часто нужно отследить, как используется конкретный класс.

>Почему захардкодить AST будущих прокручиваемых в динамике операций удобней, чем описать их императивно непосредственно в используемом ЯП?


Я не понял вопрос. Покажи пример кода.

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


V>Есть такое понятие как контекст. Один из простейших паттернов. В контексте как раз обычно и живут фабрики/сервисы.


Контексты нужно всегда отделять от IoC. Более того, IoC может передаваться через контекс — это вполне нормально.

>там один-два библиотечных класса это все разруливают


Ты ошибся примерно на порядок.

I>>Решение с IoC =


I>>
I>>  MegaModule module = container.Resolve<MegaModule>(CallingContext,ExecutionContext);
I>>


V>Ну и чем оно для случая хардкода будет отличаться от неких executionContext.Resolve<MegaModule>(сallingContext), выполненных по технике мультиметдов (двойной диспетчеризации)?


Тебе придется самому сопровождать эти контексты, что в итоге выльется в home made IoC, только реюзабельности будет около нуля.

>Меньшим кол-вом кода, разве что и его большей понятностью, ибо можно будет использовать непосредственно ЯП, а не накачивать некий фреймворк данными для последующей интерпретации. Это при том, что у тебя не будет той проблем с отладкой, за которую ругают IoC, т.к. в крайнем случае и пошагово пройтись можно будет. А твой IoC — черный ящик, целостность вложенной тобой логики в который, может быть нарушена какой-нить инициализацией, сделанной ПОСЛЕ тебя.




I>>Код конфигурации выглядит тривиально и задан в декларативном виде.


V>Декларативность обычно используется для уменьшения кол-ва буков. Если их больше — нафиг такую декларативность.


Кого их ?

V>Единственная true-декларативность присутствует только в задании отношений типа клиент=>интерфейс=>имплементация. Но это и без декларативности такая же одна строчка инициализации в императиве.


Покажи мне аналог императивного кода для этой строчки
Register<IClient>((ioc)=>new Client(ioc->Resolve<Scheduler>()), (c)=>SomeInitialize(c));



V>Да какая разница, как были поданы зависимости? После подачи это уже не важно. От тебя тоже скрыто происходящее внутри контейнера и ты можешь только получать готовый результат.


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


V>Да, но сама динамика — это порой объективные требования. Надо просто разглядеть реально происходящее: из имеющихся готовых компонент ты в динамике составляешь новый компонент/компоненты. Даже для самого тривиального случая создания и инициализации единичного объекта простыми типами — это что-то типа обычного наследования с целью переопределения его конструктора. Надо для этого процесса предоставить адекватный инструмент. Да, многие проекты пользуются скриптовыми языками в качестве высокоуровневого клея. Разумеется, в этих проектах никому и в голову не придет пользовать IoC-контейнеры, т.к. скриптовые языки по природе своей куда как богаче, чем ограниченный набор функциональности контейнера.


А ты в курсе, что скриптовому языку нужно явно подложить все нужные депенденсы и делается это как правило или в лоб или тем же ioc ?

I>>Где ты видишь неудобство использования

I>>
I>>MegaModule module = container.Resolve<MegaModule>(CallingContext,ExecutionContext);
I>>


V>А включаешь — не работает. Нужно инициализировать контейнер предварительно.


Да, представь себе. И это даже в случае твоих "выразительных ЯП"


I>>И даже если задаёшь кодом, порог вхождения высок.


V>Все, что описывается птичьим языком, вместо нормальных выразительных ЯП, априори будет иметь высокий порог вхождения.


Твои выразительные Яп сами поднимум порог вхождения.
Re[8]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.05.11 17:36
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


S>>В разы чаще чем следовало бы. N уникальных классов состояний + вплоть до N*M реализаций методов, невозможность "собрать" и настроить машину состояний в рантайме, стремящийся к 0-ю реюз кода, сложность в поддержке.


I>А что, всегда нужно собирать эту машину состояни в рантайме ?

Не всегда. Но зачем мудрить кучу классов, если есть решения проще?

I> У меня вот получается реюзать.

Если не секрет, что в паттерне State получается реюзать? Базовый класс состояния заточен под конкретную задачу.

I> Да и сложности в поддержке особо нет никакой, разумеется, если State правильно организован.

Разумеется это можно обобщить до "если код правильно организован, то сложности в поддержке особо нет никакой".

S>>Не понимаю, что вообще заставляет людей использовать этот паттерн в случаях, сложнее чем в GoF-е.


I>Его вообще мало кто применяет даже в подобных случаях.

И это замечательно, если у людей есть причины не юзать State даже в таких примитивных случаях.
Re[9]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 18:25
Оценка:
Здравствуйте, samius, Вы писали:

I>>А что, всегда нужно собирать эту машину состояни в рантайме ?

S>Не всегда. Но зачем мудрить кучу классов, если есть решения проще?

Покажи пример.

I>> У меня вот получается реюзать.

S>Если не секрет, что в паттерне State получается реюзать? Базовый класс состояния заточен под конкретную задачу.

Если абсолютно буквально как в Gof то да, не получится. Мне кажется или ты в очередной раз хочешь объяснить, что не дай бог буковкастрелочка будет чуток не такая как в GOF, то паттерн уже не паттерн ?

I>> Да и сложности в поддержке особо нет никакой, разумеется, если State правильно организован.

S>Разумеется это можно обобщить до "если код правильно организован, то сложности в поддержке особо нет никакой".

Нет, речь про паттерн.

I>>Его вообще мало кто применяет даже в подобных случаях.

S>И это замечательно, если у людей есть причины не юзать State даже в таких примитивных случаях.

Покажи пример.
Re[10]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.05.11 20:13
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>А что, всегда нужно собирать эту машину состояни в рантайме ?

S>>Не всегда. Но зачем мудрить кучу классов, если есть решения проще?

I>Покажи пример.


I>>> У меня вот получается реюзать.

S>>Если не секрет, что в паттерне State получается реюзать? Базовый класс состояния заточен под конкретную задачу.

I>Если абсолютно буквально как в Gof то да, не получится. Мне кажется или ты в очередной раз хочешь объяснить, что не дай бог буковкастрелочка будет чуток не такая как в GOF, то паттерн уже не паттерн ?

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

Набросок по задаче из GoF:

class TCPConnection
{
    struct StateInfo
    {
        public TCPConnection Context { get; set; }
        public bool CanOpen { get; set; }
        public bool CanClose { get; set; }
        public bool CanSend { get; set; }
    }
    public TCPConnection()
    {
        _stateMachine = new StateMachine<StateInfo>();
        var closed = _stateMachine.CreateState(new StateInfo { Context = this; CanOpen = true; });
        closed.Enter += (s, e) => { Console.WriteLine("Closed"); }
        var listen = _stateMachine.CreateState(new StateInfo { Context = this; CanClose = true; });
        _stateMachine.CreateTransition("open", closed, open);
        ... 
        _stateMachine.Start(closed);
    } 
    
    public void Open()
    {
        if (!_stateMachine.CurrentState.Info.CanOpen)
            throw new InvalidOperationException(); // либо самому отслеживать контекст
        _stateMachine.Transit("open");             // либо позволять машине кидать исключения
    }
}

Инфраструктура тривиальна в исполнении и полностью реюзабельна. Конкретная машина состояний собирается в нескольких строчках хардкода, либо по тому же DSL/XML. Логика работы машины не размазана по толпе классов, а сосредоточена в одном месте, следовательно для поддержки не нужно шарить по разным файлам. Добавление состояний и переходов тривиально, и не тащит за собой внесение новых классов и виртуальных методов.
Уверен, что весь код решения задачи вместе с инфраструктурой будет меньше чем соответствующая реализация State по GoF.
Re[11]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 29.05.11 22:43
Оценка:
Здравствуйте, samius, Вы писали:

I>>Если абсолютно буквально как в Gof то да, не получится. Мне кажется или ты в очередной раз хочешь объяснить, что не дай бог буковкастрелочка будет чуток не такая как в GOF, то паттерн уже не паттерн ?

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

Это ты пути к отступлению заготавливаешь ? Забавно

S>Набросок по задаче из GoF:


S>
S>class TCPConnection
S>{
S>    struct StateInfo
S>    {
S>        public TCPConnection Context { get; set; }
S>        public bool CanOpen { get; set; }
S>        public bool CanClose { get; set; }
S>        public bool CanSend { get; set; }
S>    }
S>    public TCPConnection()
S>    {
S>        _stateMachine = new StateMachine<StateInfo>();
S>        var closed = _stateMachine.CreateState(new StateInfo { Context = this; CanOpen = true; });
S>        closed.Enter += (s, e) => { Console.WriteLine("Closed"); }
S>        var listen = _stateMachine.CreateState(new StateInfo { Context = this; CanClose = true; });
S>        _stateMachine.CreateTransition("open", closed, open);
S>        ... 
S>        _stateMachine.Start(closed);
S>    } 
    
S>    public void Open()
S>    {
S>        if (!_stateMachine.CurrentState.Info.CanOpen)
S>            throw new InvalidOperationException(); // либо самому отслеживать контекст
S>        _stateMachine.Transit("open");             // либо позволять машине кидать исключения
S>    }
S>}
S>

S>Инфраструктура тривиальна в исполнении и полностью реюзабельна. Конкретная машина состояний собирается в нескольких строчках хардкода, либо по тому же DSL/XML. Логика работы машины не размазана по толпе классов, а сосредоточена в одном месте, следовательно для поддержки не нужно шарить по разным файлам. Добавление состояний и переходов тривиально, и не тащит за собой внесение новых классов и виртуальных методов.
S>Уверен, что весь код решения задачи вместе с инфраструктурой будет меньше чем соответствующая реализация State по GoF.

И ты утверждаешь что твое решени это не State ?
Re[12]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 03:58
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>И ты утверждаешь что твое решени это не State ?


Именно. Ничего общего со State, кроме назначения. Это модифицированная "табличная альтернатива", которую сами GoF не считают State-ом.
Re[13]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 08:10
Оценка: -1
Здравствуйте, samius, Вы писали:

I>>И ты утверждаешь что твое решени это не State ?


S>Именно. Ничего общего со State, кроме назначения. Это модифицированная "табличная альтернатива", которую сами GoF не считают State-ом.


"cами GoF не считают State" — это выдумка. State это не один паттерн, это большое семейство паттернов. А ты, похоже, взялся за старое — GoF иначе как буквально понимать отказываешься
Re[14]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 08:31
Оценка: +1
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>И ты утверждаешь что твое решени это не State ?


S>>Именно. Ничего общего со State, кроме назначения. Это модифицированная "табличная альтернатива", которую сами GoF не считают State-ом.


I>"cами GoF не считают State" — это выдумка. State это не один паттерн, это большое семейство паттернов. А ты, похоже, взялся за старое — GoF иначе как буквально понимать отказываешься

Может цитату приведешь из GoF, что это большое семейство?

Когда я вижу фразу

The key idea in this pattern is to introduce an abstract class called TCPState to represent the states of the network connection

у меня не возникает желания приписать к тому же паттерну табличную реализацию, например, или реализацию на условной логике.
Вот еще фразы:

A table-based alternative. In C++ Programming Style [Car92], Cargill describes another way to impose structure on state-driven code: Heuses tables to map inputs to state transitions. For each state, atable maps every possible input to a succeeding state. In effect, this approach converts conditional code (and virtual functions, in the case of the State pattern) into a table look-up.


The key difference between table-driven state machines and the State pattern can be summed up like this: The State pattern models state-specific behavior, whereas the table-driven approach focuses ondefining state transitions.

По-моему выдумщик и толкователь тут ты.
Re[15]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 09:06
Оценка:
Здравствуйте, samius, Вы писали:

S>>>Именно. Ничего общего со State, кроме назначения. Это модифицированная "табличная альтернатива", которую сами GoF не считают State-ом.


I>>"cами GoF не считают State" — это выдумка. State это не один паттерн, это большое семейство паттернов. А ты, похоже, взялся за старое — GoF иначе как буквально понимать отказываешься

S>Может цитату приведешь из GoF, что это большое семейство?

"The State pattern raises a variety of implementation issues" ...

S>

S>A table-based alternative. In C++ Programming Style [Car92], Cargill describes another way to impose structure on state-driven code: Heuses tables to map inputs to state transitions. For each state, atable maps every possible input to a succeeding state. In effect, this approach converts conditional code (and virtual functions, in the case of the State pattern) into a table look-up.


А это один из вариантов. Альтернативная реализация. Что тут непонятно то ? Там говорится "Who defines the state transitions?" — и один из вариантов это как раз table-driven.

S>По-моему выдумщик и толкователь тут ты.


Нет, только ты один. И я не удивлюсь, если ты будешь настаивать на обязательности класса TCPState например в рисовалке
Re[16]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 09:08
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


S>>>>Именно. Ничего общего со State, кроме назначения. Это


I>"The State pattern raises a variety of implementation issues" ...

Да, и они там описаны.

I>А это один из вариантов. Альтернативная реализация. Что тут непонятно то ? Там говорится "Who defines the state transitions?" — и один из вариантов это как раз table-driven.


А неудобные цитаты ты поскипал?

S>>По-моему выдумщик и толкователь тут ты.


I>Нет, только ты один. И я не удивлюсь, если ты будешь настаивать на обязательности класса TCPState например в рисовалке

В хрустальный шар заглянул? Ну-ну.
Re[17]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 09:22
Оценка:
Здравствуйте, samius, Вы писали:

I>>"The State pattern raises a variety of implementation issues" ...

S>Да, и они там описаны.

Там перечислены issue, а не варианты решения, не надо врать.

I>>А это один из вариантов. Альтернативная реализация. Что тут непонятно то ? Там говорится "Who defines the state transitions?" — и один из вариантов это как раз table-driven.


S>А неудобные цитаты ты поскипал?


"The State pattern does not specify which participant defines the criteria for state transitions." — вроде и ежу понятно

"Introducing separate objects for different states makes the transitions more explicit." — табличное задание это всего лишь развитие этой идеи.

I>>Нет, только ты один. И я не удивлюсь, если ты будешь настаивать на обязательности класса TCPState например в рисовалке

S>В хрустальный шар заглянул? Ну-ну.

Заглянул в прежние твои рассуждения относительно визитора, итератора и того же стейта
Re[18]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 09:30
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>"The State pattern raises a variety of implementation issues" ...

S>>Да, и они там описаны.

I>Там перечислены issue, а не варианты решения, не надо врать.

Слово "варианты" ты тоже в шаре увидел?

S>>А неудобные цитаты ты поскипал?


I>"The State pattern does not specify which participant defines the criteria for state transitions." — вроде и ежу понятно



I>"Introducing separate objects for different states makes the transitions more explicit." — табличное задание это всего лишь развитие этой идеи.

Табличный автомат срисовали с OO State! Жги еще!

I>>>Нет, только ты один. И я не удивлюсь, если ты будешь настаивать на обязательности класса TCPState например в рисовалке

S>>В хрустальный шар заглянул? Ну-ну.

I>Заглянул в прежние твои рассуждения относительно визитора, итератора и того же стейта

Угу, из своего хрустального шара заглянул.
Re[19]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 09:51
Оценка:
Здравствуйте, samius, Вы писали:

I>>Там перечислены issue, а не варианты решения, не надо врать.

S>Слово "варианты" ты тоже в шаре увидел?

Ты хочешь что бы я объяснил тебе что такое variety ?

S>>>А неудобные цитаты ты поскипал?


I>>"The State pattern does not specify which participant defines the criteria for state transitions." — вроде и ежу понятно

S>

I>>"Introducing separate objects for different states makes the transitions more explicit." — табличное задание это всего лишь развитие этой идеи.

S> Табличный автомат срисовали с OO State! Жги еще!

Стейт не указывает:

1 какой участник определяет эти transitions,
2 каким образом это должно делаться.

Следовательно ты волен использовать для этого любого участника и волен задавать это как тебе удобно. Удобно для этого использовать автомат в табличном виде — пожалуйста.

Ты же почему то хочешь, что бы было буквально, через присваивание одной единственной переменной О чем и говорю — ты хочешь видеть всё буквально, пока не прочитаешь в другой книге, что "итератор может быть иммутабельным"

P.S. GoF всего лишь описали известные приёмы и дали им названия. Они не изобретали разделение обязанностей и зависимостей а всего то ввели классификацию, этим их книга и ценна.
Re: [C++] о паттернах
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 30.05.11 10:04
Оценка: +1
Здравствуйте, Геннадий Васильев, Вы писали:

ГВ>А вообще говоря, завязывал бы ты с попытками "понять паттерны" — без практики это гнилое занятие, чреватое перекосами.


Да оно, в целом, касается не только в C++.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[20]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 10:10
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>Там перечислены issue, а не варианты решения, не надо врать.

S>>Слово "варианты" ты тоже в шаре увидел?

I>Ты хочешь что бы я объяснил тебе что такое variety ?

Мне твои толкования не интересны

I>>>"Introducing separate objects for different states makes the transitions more explicit." — табличное задание это всего лишь развитие этой идеи.

S>> Табличный автомат срисовали с OO State! Жги еще!

I>Стейт не указывает:


I>1 какой участник определяет эти transitions,

I>2 каким образом это должно делаться.
Верно, но это не доказывает твой поинт что табличный автомат есть развитие идеи "Introducing separate objects for different states".

I>Следовательно ты волен использовать для этого любого участника и волен задавать это как тебе удобно. Удобно для этого использовать автомат в табличном виде — пожалуйста.

Тебе процитировать еще раз ключевую идею State? Впрочем, что толку?

I>Ты же почему то хочешь, что бы было буквально, через присваивание одной единственной переменной О чем и говорю — ты хочешь видеть всё буквально, пока не прочитаешь в другой книге, что "итератор может быть иммутабельным"

Я в твой шар предпочитаю не заглядывать.

I>P.S. GoF всего лишь описали известные приёмы и дали им названия. Они не изобретали разделение обязанностей и зависимостей а всего то ввели классификацию, этим их книга и ценна.

Для тех кто умеет читать и не перевирать фразы в угоду своему толкованию.
Re[17]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 30.05.11 10:55
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Очень просто — подсчет площади треугольника это полезный код. А код, с помощью которого ты получишь нужную функцию никакой пользой не обладает. Потомму он и не нужен в принципе. IoC позволяет этот код свести к минимуму.


Это если логика поучения нужной ф-ии тривиальна, то IoC позволяет. Но вот, для примера, в сервере конференций, надо распознавать ключ моникера и вызывать соотвествующий, чтобы тот уже разбирал специфический URI протокола и создавал сессию по нужному протоколу. На "верхнем уровне" — это очередные 3 строчки.

Или еще пример: есть тонна кодеков и их характеристик + характеристики канала. Далеко не всегда все комбинации совместимы напрямую, есть еще россыпь адаптеров незакодированных форматов сигналов. Что мы делаем? Мы задаем зависимости (вернее уже имеем их — это идентичные параметры канала на одном из концов преобразователя) и вводим ограничения на сложность суммарной цепочки преобразователей. Процесс подбора цепочки преобразований выполняет простейшая машинка на пару экранов кода, что-то вроде той, которая работает в Прологе. Ищет наилучшее решение в момент подключения, либо если через кеширование — все комбинации для динамически подключаемого кодека к уже имеющимся. IoC опять мимо, потому как не умеет он ресолвить зависимости, вот беда. Вас нагло обманывают. Классическая задача поиска целей в ограничениях не поддерживается ни одним IoC-контейнером, они это не умеют. В общем, этот контейнер не ресолвит зависимости, а лишь просматривает ровно один уровень отношений. Ресолвингом это, сорри, не называется. Это безусловная выборка значения по ключу. То, что ключ может быть составной, ничего не меняет.


>>Почему захардкодить AST будущих прокручиваемых в динамике операций удобней, чем описать их императивно непосредственно в используемом ЯП?


I>Я не понял вопрос. Покажи пример кода.


Имелся ввиду пример как здесь: http://www.rsdn.ru/forum/philosophy/4290301.1.aspx
Автор: vdimas
Дата: 29.05.11


V>>Есть такое понятие как контекст. Один из простейших паттернов. В контексте как раз обычно и живут фабрики/сервисы.


I>Контексты нужно всегда отделять от IoC. Более того, IoC может передаваться через контекс — это вполне нормально.


ИМХО, если мы к IoC лезем из кода явно — это нарушение инкапсуляции. Зачем контексту открывает свои кишки? Да и плохо это — иметь один IoC на всех. Как раз наблюдал такой случай, когда делают наследование только затем, чтобы получить ДРУГОЙ тип и дать ему другие зависимости. Вот эти вещи доставляют больше всего.

>>там один-два библиотечных класса это все разруливают


I>Ты ошибся примерно на порядок.


Не, надо смотреть конкретней. SL-это пара классов, дейтсвительно. А конкретные фабрики и сервисы могут быть весьма разнообразны. Даже паттерн chain of esponcibility может разбавляться предикатами в случае нелинейных зависимостей, и эти однострочные вещи в обычном коде ты не выразишь ни через какой контейнер IoC.

Повторюсь, достаточно рассматривать IoC как высокоуровневый клей, аналогичный написанию кода на скриптовом языке, и всё становится на свои места. Кое-какая специфичная функциональность в контейнерах все же есть, но она вполне может быть обыграна библиотекой уже на уровне скриптового языка, либо через биндинг "нативной", по отношению к скриптовому движку, функциональности. Зато в контейнерах нет ср-в для нетривиальной логики, т.е. возможности их программирования очень скудны.

I>Тебе придется самому сопровождать эти контексты, что в итоге выльется в home made IoC, только реюзабельности будет около нуля.


Ну так я пытаюсь спросить, что там поддерживать, если в общем случае, при удачной декомпозиции — пара строк на всё в хардкоде. Да еще в нормальном синтаксисе, с лямбдами и всякими методами-расширениями. Автоматизация DI хороша, когда надо установить мильон св-в и когда эту установку желательно вынести за пределы хардкода, для простоты упомянутого сопровождения. Чтобы по-месту можно было подкрутить чего-нить. Т.е. опять и снова по кругу возвращаемся к динамике. А про динамику свое мнение уже сказал.


V>>Единственная true-декларативность присутствует только в задании отношений типа клиент=>интерфейс=>имплементация. Но это и без декларативности такая же одна строчка инициализации в императиве.


I>Покажи мне аналог императивного кода для этой строчки

I>
I>Register<IClient>((ioc)=>new Client(ioc->Resolve<Scheduler>()), (c)=>SomeInitialize(c));
I>


Нужно смотреть на пример целиком, на регистрацию всех участников и их создание. Потому как в реальной жизни ioc->Resolve<Scheduler>() работает только для безусловных отношений. А если нужна какая-нить нетривиальная логика, то сразу досвидан:

Factory<IClient> clientFactory = (param)=>new Client(schedulingCenter.NonTrivialResolving(param), (c)=>SomeInitialize(c));


Поинт в том, что эта нетривиальная логика должна будет жить ВНЕ контейнера. Хотя она может быть вовсе тривиальной с т.з. общепрограммистких задач. Ну просто не по зубам функциональности IoC-контейнера.

Ладно, пора завязывать, я уже многократно повторяюсь. Пример напоследок.

Есть такой проект — Asterisk. Это ядро системы VoIP, т.е. некий фреймворк, на который можно накручивать всякие близкие задачи. К нему есть такой мильен модулей/плагинов и народ умудряется из них делать такие хитрые комбинации, что в итоге можно из этих кубиков собрать что угодно — от цифровой АТС, сервера конференций, автономных факс-машин, до узлов кластеров VoIP выполняющих load balancing. Так вот, народ фактически сразу столкнулся с тем, что на одних конфигах далеко не уедешь, при попытке из этих "кубиков" собирать сложные и "умные" конструкции. Поэтому полно проектов для биндинга модулей Asterisk на кучу скриптовых языков и даже на Java (угу, тоже неплохой скриптовый язык ). понятное дело, что невероятное кол-во возможных сценариев конфигураций и кастомных приседаний не в состоянии поддержать ни один IoC фреймворк. А всего-то надо вместо ограниченного языка конфигов взять более-менее универсальный. А кое-какую частоисопльзуемую специфику DI выполнить опять же в библиотечном виде.


I>Твои выразительные Яп сами поднимум порог вхождения.


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

Для нейтивного Asteriks пришлось делать некую инфраструктуру http://ru.wikipedia.org/wiki/AGI , угу, но для дотнетов и джав ничего такого делать не надо, бо рефлексия дана свыше бесплатно. Т.е. инфраструктура связи сильно дешевле выходит. Кстати пример проблемно-ориентированного использования скриптового Lua для программирования диал-планов в Asterisk, тоже очень показателен.

Обрати внимание, из нейтива надо делать немало приседаний, чтобы получить биндинги на скрипты, и то народ делает и не жжужит. А из дотнета или джавы, ИМХО, сам бог велел.
Re[22]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 30.05.11 11:17
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Ты не понял. pull это значит что компонент сам вытягивает и устанавливает нужные ему депенденси, т.е. компонент активно использует локатор. push означает что компоненту не надо знать ничего про локатор, а депенденсы устанавливаются в момент получения ссылки на этот компонет.


Я тебе больше скажу, бывает одновременное использование:
interface IValueProvider<T> { T Value { get; } }


Установили этот провайдер компоненту в некое св-во по push, а потом он тянет себе по рull.
А включить воображение, и еще комбинаторных сочетаний накидать можно, если начать имплементировать. В общем, фигня это всё, тут не на чем зацикливаться.

Но порой такие развязки через простейшие "третьесторонние" инфтерфейсы решают локальные задачи по развязке зависимостей не хуже, чем IoC-контейнеры. А в случае требований эффективности в нагрузочных сценариях — гораздо лучше.
Re[21]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 11:45
Оценка:
Здравствуйте, samius, Вы писали:

I>>>>Там перечислены issue, а не варианты решения, не надо врать.

S>>>Слово "варианты" ты тоже в шаре увидел?

I>>Ты хочешь что бы я объяснил тебе что такое variety ?

S>Мне твои толкования не интересны

http://www.merriam-webster.com/dictionary/variety

I>>Стейт не указывает:


I>>1 какой участник определяет эти transitions,

I>>2 каким образом это должно делаться.
S>Верно, но это не доказывает твой поинт что табличный автомат есть развитие идеи "Introducing separate objects for different states".

Да, косточка от арбуза не является арбузом.

I>>Следовательно ты волен использовать для этого любого участника и волен задавать это как тебе удобно. Удобно для этого использовать автомат в табличном виде — пожалуйста.

S>Тебе процитировать еще раз ключевую идею State? Впрочем, что толку?

Ты процитировал не ту идею.

I>>Ты же почему то хочешь, что бы было буквально, через присваивание одной единственной переменной О чем и говорю — ты хочешь видеть всё буквально, пока не прочитаешь в другой книге, что "итератор может быть иммутабельным"

S>Я в твой шар предпочитаю не заглядывать.

В свой загляни и обнаружишь, что cам же и привел пример иммутабельного итератора после того, как отрицал существование подобного

I>>P.S. GoF всего лишь описали известные приёмы и дали им названия. Они не изобретали разделение обязанностей и зависимостей а всего то ввели классификацию, этим их книга и ценна.

S>Для тех кто умеет читать и не перевирать фразы в угоду своему толкованию.

В GoF буквально написано следующее — паттерны не нужно воспринимать буквально
Re[18]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 12:38
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Очень просто — подсчет площади треугольника это полезный код. А код, с помощью которого ты получишь нужную функцию никакой пользой не обладает. Потомму он и не нужен в принципе. IoC позволяет этот код свести к минимуму.


V>Это если логика поучения нужной ф-ии тривиальна, то IoC позволяет. Но вот, для примера, в сервере конференций, надо распознавать ключ моникера и вызывать соотвествующий, чтобы тот уже разбирал специфический URI протокола и создавал сессию по нужному протоколу. На "верхнем уровне" — это очередные 3 строчки.


Какая разница сколько строчек. Ты пойми, деньги бизнес платит не за моникеры, а за полезные для него функции.

V>Или еще пример: есть тонна кодеков и их характеристик + характеристики канала. Далеко не всегда все комбинации совместимы напрямую, есть еще россыпь адаптеров незакодированных форматов сигналов. Что мы делаем? Мы задаем зависимости (вернее уже имеем их — это идентичные параметры канала на одном из концов преобразователя) и вводим ограничения на сложность суммарной цепочки преобразователей. Процесс подбора цепочки преобразований выполняет простейшая машинка на пару экранов кода, что-то вроде той, которая работает в Прологе. Ищет наилучшее решение в момент подключения, либо если через кеширование — все комбинации для динамически подключаемого кодека к уже имеющимся. IoC опять мимо, потому как не умеет он ресолвить зависимости, вот беда. Вас нагло обманывают. Классическая задача поиска целей в ограничениях не поддерживается ни одним IoC-контейнером, они это не умеют.


Напиши, ктож мешает то ? Фреймворк не может поддеживать все возможные сценарии И потому всегда есть возможность расширения.

I>>Я не понял вопрос. Покажи пример кода.


V>Имелся ввиду пример как здесь: http://www.rsdn.ru/forum/philosophy/4290301.1.aspx
Автор: vdimas
Дата: 29.05.11


И чем применение динамического языка лучше такого же задания например в виде C# кода ?

I>>Контексты нужно всегда отделять от IoC. Более того, IoC может передаваться через контекс — это вполне нормально.


V>ИМХО, если мы к IoC лезем из кода явно — это нарушение инкапсуляции.


Покажи пример лучше.

V>Зачем контексту открывает свои кишки? Да и плохо это — иметь один IoC на всех. Как раз наблюдал такой случай, когда делают наследование только затем, чтобы получить ДРУГОЙ тип и дать ему другие зависимости. Вот эти вещи доставляют больше всего.


Это приседания из за кривого IoC или рук

I>>Ты ошибся примерно на порядок.


V>Не, надо смотреть конкретней. SL-это пара классов, дейтсвительно. А конкретные фабрики и сервисы могут быть весьма разнообразны. Даже паттерн chain of esponcibility может разбавляться предикатами в случае нелинейных зависимостей, и эти однострочные вещи в обычном коде ты не выразишь ни через какой контейнер IoC.


Если довести до абсурда, то окажется что SL это hashtable

V>Повторюсь, достаточно рассматривать IoC как высокоуровневый клей, аналогичный написанию кода на скриптовом языке, и всё становится на свои места. Кое-какая специфичная функциональность в контейнерах все же есть, но она вполне может быть обыграна библиотекой уже на уровне скриптового языка, либо через биндинг "нативной", по отношению к скриптовому движку, функциональности. Зато в контейнерах нет ср-в для нетривиальной логики, т.е. возможности их программирования очень скудны.


Нетривиальную логику придется писать и в твоем скриптовом языке.

I>>Тебе придется самому сопровождать эти контексты, что в итоге выльется в home made IoC, только реюзабельности будет около нуля.


V>Ну так я пытаюсь спросить, что там поддерживать, если в общем случае, при удачной декомпозиции — пара строк на всё в хардкоде. Да еще в нормальном синтаксисе, с лямбдами и всякими методами-расширениями. Автоматизация DI хороша, когда надо установить мильон св-в и когда эту установку желательно вынести за пределы хардкода, для простоты упомянутого сопровождения. Чтобы по-месту можно было подкрутить чего-нить. Т.е. опять и снова по кругу возвращаемся к динамике. А про динамику свое мнение уже сказал.


А про контексты ты уже забыл что ли ?

I>>Покажи мне аналог императивного кода для этой строчки

I>>
I>>Register<IClient>((ioc)=>new Client(ioc->Resolve<Scheduler>()), (c)=>SomeInitialize(c));
I>>


V>Нужно смотреть на пример целиком, на регистрацию всех участников и их создание. Потому как в реальной жизни ioc->Resolve<Scheduler>() работает только для безусловных отношений. А если нужна какая-нить нетривиальная логика, то сразу досвидан:


V>
V>Factory<IClient> clientFactory = (param)=>new Client(schedulingCenter.NonTrivialResolving(param), (c)=>SomeInitialize(c));
V>


И что здесь не так ? Те же яйцы только сбоку.

V>Поинт в том, что эта нетривиальная логика должна будет жить ВНЕ контейнера. Хотя она может быть вовсе тривиальной с т.з. общепрограммистких задач. Ну просто не по зубам функциональности IoC-контейнера.


Посмотри внимательно на "(c)=>SomeInitialize(c)"


I>>Твои выразительные Яп сами поднимум порог вхождения.


V>Нет, порог вхождения поднимает не сами скриптовые языки, бо они обычно проще используемых нескриптовых, а их АПИ для биндинга пользовательских типов, имею ввиду характер и способ расширения движка скриптового языка. Вот это единственная "точка входа", требующая программиста-профессионала для решения. А остальное в скриптах потом накручивают даже люди, для которых программирование не является основным видом деятельности.


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

V>Обрати внимание, из нейтива надо делать немало приседаний, чтобы получить биндинги на скрипты, и то народ делает и не жжужит. А из дотнета или джавы, ИМХО, сам бог велел.


Скрипты используются для того, что бы дать возможность часто изменять конфигурацию. Не вижу причин, чем бы скрипты могли помешать тому же DI Добавляется всего лишь новый способ доставки зависимостей.
Re[22]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 12:47
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>Следовательно ты волен использовать для этого любого участника и волен задавать это как тебе удобно. Удобно для этого использовать автомат в табличном виде — пожалуйста.

S>>Тебе процитировать еще раз ключевую идею State? Впрочем, что толку?

I>Ты процитировал не ту идею.

Я процитировал то что там написано, а не то что ты выдумал.

I>>>Ты же почему то хочешь, что бы было буквально, через присваивание одной единственной переменной О чем и говорю — ты хочешь видеть всё буквально, пока не прочитаешь в другой книге, что "итератор может быть иммутабельным"

S>>Я в твой шар предпочитаю не заглядывать.

I>В свой загляни и обнаружишь, что cам же и привел пример иммутабельного итератора после того, как отрицал существование подобного

Разве что в твоей транскрипции GoF-а.

I>>>P.S. GoF всего лишь описали известные приёмы и дали им названия. Они не изобретали разделение обязанностей и зависимостей а всего то ввели классификацию, этим их книга и ценна.

S>>Для тех кто умеет читать и не перевирать фразы в угоду своему толкованию.

I>В GoF буквально написано следующее — паттерны не нужно воспринимать буквально

И ты слишком буквально подошел к этому. Вообще не воспринял.
Re[23]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 12:50
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Ты не понял. pull это значит что компонент сам вытягивает и устанавливает нужные ему депенденси, т.е. компонент активно использует локатор. push означает что компоненту не надо знать ничего про локатор, а депенденсы устанавливаются в момент получения ссылки на этот компонет.


V>Я тебе больше скажу, бывает одновременное использование:

V>
V>interface IValueProvider<T> { T Value { get; } } 
V>


V>Установили этот провайдер компоненту в некое св-во по push, а потом он тянет себе по рull.


Что с того ?
Re[23]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 12:55
Оценка:
Здравствуйте, samius, Вы писали:

I>>Ты процитировал не ту идею.

S>Я процитировал то что там написано, а не то что ты выдумал.

Ты процитировал то, что тебе показалось главным

I>>В свой загляни и обнаружишь, что cам же и привел пример иммутабельного итератора после того, как отрицал существование подобного

S>Разве что в твоей транскрипции GoF-а.

В следующий раз, когда ты начнешь отрицать, я дам тебе ссылку на твое отрицание и даже на отрицание отрицания

I>>В GoF буквально написано следующее — паттерны не нужно воспринимать буквально

S>И ты слишком буквально подошел к этому. Вообще не воспринял.

Вопрос в тему — кто на рыболовном судне больше всего ловит рыбы ? Капитан, матросы, кок, гальюнщик ? А может владелец судна ? А может менеджеры рыболовной флотилии ?

Дай ответ на этот вопрос и тебе станет ясно, почему transition можно задавать в т.ч. табличным автоматом и это по прежнему останется State.
Re[24]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 13:05
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>Ты процитировал не ту идею.

S>>Я процитировал то что там написано, а не то что ты выдумал.

I>Ты процитировал то, что тебе показалось главным

Я же не мог процитировать то, что показалось главным тебе. Этого ведь нет в GoF-е.

I>В следующий раз, когда ты начнешь отрицать, я дам тебе ссылку на твое отрицание и даже на отрицание отрицания

Если ты от этого станешь лушче понимать что написано — велкам.

I>Вопрос в тему — кто на рыболовном судне больше всего ловит рыбы ? Капитан, матросы, кок, гальюнщик ? А может владелец судна ? А может менеджеры рыболовной флотилии ?


I>Дай ответ на этот вопрос и тебе станет ясно, почему transition можно задавать в т.ч. табличным автоматом и это по прежнему останется State.


Я вижу что в поиске ответа на судне тебя занесло в офисы менеджеров рыболовной флотилии. Как обычно.
Ответь на вопрос, что отличает State от табличной альтернативы. (Hint: в GoF, кстати, есть этот ответ. И я даже его цитировал.)
Если не сможешь ответить, то о чем дальше разговаривать?
Re[25]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 13:29
Оценка:
Здравствуйте, samius, Вы писали:

I>>Ты процитировал то, что тебе показалось главным

S>Я же не мог процитировать то, что показалось главным тебе. Этого ведь нет в GoF-е.

Есть, просто ты сам прицепился к конкретному примеру и проигнорировал абстракцию.

I>>Дай ответ на этот вопрос и тебе станет ясно, почему transition можно задавать в т.ч. табличным автоматом и это по прежнему останется State.


S>Я вижу что в поиске ответа на судне тебя занесло в офисы менеджеров рыболовной флотилии. Как обычно.


Ты не увиливай, а давай внятный ответ.

S>Ответь на вопрос, что отличает State от табличной альтернативы. (Hint: в GoF, кстати, есть этот ответ. И я даже его цитировал.)


Представь себе, реализация паттерна сама паттерном не является, т.е. всегда есть отличие между абстракцией и конкретной реализацией. На это отличие и было указано как раз там, где приводились различные реализации этого самого паттерна State. Все они до единой отличются от абстрактной схемы.

S>Если не сможешь ответить, то о чем дальше разговаривать?


см выше. Ты можешь объяснить внятно, в какой момент State перестаёт быть State если я буду применять различные способы задания этих самых transition ?

Разница в твоем примере и в том, что в GoF, если устранить введенное тобой дублирование функционала, исключительно в схеме задания этих самых transitions.

И именно про это сказано, что State не указывает ни участника, ни схему задания Следовательно для задания transition можно использовать всё что угодно.
Re[26]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 13:50
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Здравствуйте, samius, Вы писали:


I>>>Ты процитировал то, что тебе показалось главным

S>>Я же не мог процитировать то, что показалось главным тебе. Этого ведь нет в GoF-е.

I>Есть, просто ты сам прицепился к конкретному примеру и проигнорировал абстракцию.

Покажи

I>>>Дай ответ на этот вопрос и тебе станет ясно, почему transition можно задавать в т.ч. табличным автоматом и это по прежнему останется State.


S>>Я вижу что в поиске ответа на судне тебя занесло в офисы менеджеров рыболовной флотилии. Как обычно.


I>Ты не увиливай, а давай внятный ответ.

Внятный ответ на невнятный вопрос — не ко мне.

S>>Ответь на вопрос, что отличает State от табличной альтернативы. (Hint: в GoF, кстати, есть этот ответ. И я даже его цитировал.)


I>Представь себе, реализация паттерна сама паттерном не является, т.е. всегда есть отличие между абстракцией и конкретной реализацией. На это отличие и было указано как раз там, где приводились различные реализации этого самого паттерна State. Все они до единой отличются от абстрактной схемы.

Еще раз. Фраза
"The key difference between table-driven state machines and the State pattern" означает как минимум, что авторы противопоставляют эти вещи, а не считают их одним и тем же. Это для тебя непостижимо?

S>>Если не сможешь ответить, то о чем дальше разговаривать?


I>см выше. Ты можешь объяснить внятно, в какой момент State перестаёт быть State если я буду применять различные способы задания этих самых transition ?

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

The key idea in this pattern is to introduce an abstract class called TCPState... Subclasses of TCPState implement state-specific behavior.

Ты видишь у меня абстрактный класс? Наследование может где-то видишь? Может где-то видишь реализацию state-specific behavior?

I>Разница в твоем примере и в том, что в GoF, если устранить введенное тобой дублирование функционала, исключительно в схеме задания этих самых transitions.

Ты очень внимателен К деталям

I>И именно про это сказано, что State не указывает ни участника, ни схему задания Следовательно для задания transition можно использовать всё что угодно.

Можно, но разница не только в этом.
Re[19]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 30.05.11 14:11
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Нетривиальную логику придется писать и в твоем скриптовом языке.


Нетривиальная с т.з. IoC контейнера будет любая логика, которую он не умеет. Речь о том, чтобы не распылять конфигурационные задачи. А то часть из них будет делаться ср-вами IoC, т.е. даже в динамике без перекомпиляций, а часть инициализационной логики надо будет хардкодить и перекомпилировать бинарники, коль логика эта будет корректироваться. Я лишь спрашиваю — почему бы сразу не пользовать такой динамический тул для конфигурации, для которого не проблема поставить пару if-ов?

I>А про контексты ты уже забыл что ли ?


Так у вас контексты не по назначению идут. Такое ощущение, что не IoC контексты обслуживает, а наоборот — они обслуживают IoC, являясь для пользователей частью ключа при ресолвинге зависимостей.

V>>
V>>Factory<IClient> clientFactory = (param)=>new Client(schedulingCenter.NonTrivialResolving(param), (c)=>SomeInitialize(c));
V>>


I>И что здесь не так ? Те же яйцы только сбоку.


Правильно, те же. Загвоздка в некоем NonTrivialResolving, логику которого не получилочь спрятать в контейнер, т.е. часть задач относительно конфигурирования тянется в хардкод, профанируя всю идею.

V>>Поинт в том, что эта нетривиальная логика должна будет жить ВНЕ контейнера. Хотя она может быть вовсе тривиальной с т.з. общепрограммистких задач. Ну просто не по зубам функциональности IoC-контейнера.


I> Посмотри внимательно на "(c)=>SomeInitialize(c)"


Ну да, еще один хардкод. В чем смысл выделенного IoC тогда?

Я уже признавался, что просто хочу понять, зачем он нужен. Для целей динамики — тут мне всё понятно и прозрачно. Без перекомпиляции конфигурим как хотим. Претензии здесь только к синтаксису языка конфигурирования и бедным его возможностям. А для хардкода... Ну не знаю... По одному паттерну по месту — и всех делов. Там же серьезная разница получается в том случае, если не сводить все сценарии в один IoC, т.е. каждый из сценариев в отдельности от остальных обычно обесценивается до тривиального. Да, иногда до той самой хеш-таблицы и операций с ней в одну строку. Или chain of responcibility, тоже популярная тривиальная схема накручивания контекстов, идет еще со времен первых версий Лиспа. А инициализация полей у тебя и так прописана в хардкоде.


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


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


I>Скрипты используются для того, что бы дать возможность часто изменять конфигурацию. Не вижу причин, чем бы скрипты могли помешать тому же DI Добавляется всего лишь новый способ доставки зависимостей.


А зачем дублировать функциональность? Вводишь в некий компонент возможность управлять его параметрами прозрачно через скрипты, т.е. выносишь его зависимости в публичное АПИ — вот тебе IoC в действии. Прикрутил скрипт-енжин, получил фреймворк DI. Ну и тяжелая артиллерия, в виде проблемно-ориентированных DSL будет в буквально в одном шаге доступности. (иногда достаточно просто списка алиасов идентификаторов к имеющемуся скриптовому языку и/или к прикладным типам из "глубоких" неймспейсов)
Re[20]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 15:44
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Нетривиальная с т.з. IoC контейнера будет любая логика, которую он не умеет. Речь о том, чтобы не распылять конфигурационные задачи. А то часть из них будет делаться ср-вами IoC, т.е. даже в динамике без перекомпиляций, а часть инициализационной логики надо будет хардкодить и перекомпилировать бинарники, коль логика эта будет корректироваться. Я лишь спрашиваю — почему бы сразу не пользовать такой динамический тул для конфигурации, для которого не проблема поставить пару if-ов?


Я уже объяснял — это резко завышает планку вхождения в проект и создает сложности с отладкой.

I>>А про контексты ты уже забыл что ли ?


V>Так у вас контексты не по назначению идут. Такое ощущение, что не IoC контексты обслуживает, а наоборот — они обслуживают IoC, являясь для пользователей частью ключа при ресолвинге зависимостей.


Покажи как применить контекст по назначению.

I>>И что здесь не так ? Те же яйцы только сбоку.


V>Правильно, те же. Загвоздка в некоем NonTrivialResolving, логику которого не получилочь спрятать в контейнер, т.е. часть задач относительно конфигурирования тянется в хардкод, профанируя всю идею.


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

I>> Посмотри внимательно на "(c)=>SomeInitialize(c)"


V>Ну да, еще один хардкод. В чем смысл выделенного IoC тогда?


Конфигурация выносится в одно место и больше не надо бегать по разным файлам и искать, где у какой инстанс используется.

V>Я уже признавался, что просто хочу понять, зачем он нужен. Для целей динамики — тут мне всё понятно и прозрачно. Без перекомпиляции конфигурим как хотим. Претензии здесь только к синтаксису языка конфигурирования и бедным его возможностям. А для хардкода... Ну не знаю...


Что лучше, один раз задать в файле инициализацию и сто раз использовать, или же сто раз писать один и тот же код ?

>А инициализация полей у тебя и так прописана в хардкоде.


Где ты здесь видишь "инициализация полей у тебя и так прописана в хардкоде"
Component c = container.Resolve<Component>();



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


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


"до запуска" — неужели не понятно ? Как ты вообще без запуска приложения сможешь разобраться, где что используется ?

I>>Скрипты используются для того, что бы дать возможность часто изменять конфигурацию. Не вижу причин, чем бы скрипты могли помешать тому же DI Добавляется всего лишь новый способ доставки зависимостей.


V>А зачем дублировать функциональность?


Это никакое не дублирование, потому что для твоих скриптов все равно придется делать доставку депенденсов.

>Вводишь в некий компонент возможность управлять его параметрами прозрачно через скрипты, т.е. выносишь его зависимости в публичное АПИ — вот тебе IoC в действии. Прикрутил скрипт-енжин, получил фреймворк DI.


Покажи на примере, как это будет вызываться — конфигурация, активация, вызов и тд, со всеми потрохами.
Re[21]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 30.05.11 19:36
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Покажи на примере, как это будет вызываться — конфигурация, активация, вызов и тд, со всеми потрохами.


Конфигурация — это иерархический список параметризуемых значений, либо кода по вычислению значений.
Прямо как-нить в лоб:
var interfaceId1 = "Namespace1.Interface1";
var interfaceId2 = "Namespace1.Interface2";
var objectId1 = "Namespace3.Class4";
var objectId2 = "Namespace5.Class6";

// (1)
var networkConfig = {
  host: "127.0.0.1";
  port: 12345;
  protocol: "TCP"
}
//(1)

clientConfig = function(config) {
  this.@type = (config.network.protocol == "TCP") ? objectId1 : objectId2;

  this.@init = function(config) { 
    this.SomeProperty1 = config.server().SomeProperty;
    this.SomeProperty2 = 123;
  };
};

serverConfig = /* нечто аналогичное clientConfig */;

//(2)
var config = {
  network: networkConfig,
  client: function() { return clientConfig(this); },
  server: function() { return serverConfig(this); }
};
//(2)


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

Некоторые св-ва можно принять как зарезервированные, например "@type" и "@init", или еще какие-нить дополнительные проблемно-ориентированные, и обрабатывать их специальным способом еще до подачи на универсальную "применялку" св-в. Это будет уже некая проблемная ориентированность, которая может помочь сократить объемы конфигов еще многократно, хотя в сравнении с XML и так очень неплохо выходит.

Это все навскидку, понятное дело.

Когда-то в одном из продуктов примерный подход использовался для описания большого числа сценариев тестирования системы из 3-х распределенных участников. Сценарии тестирования задавались похожими конфиг-файлами (только в размере раз в 10 поболе), которые подвергались простой предварительной склейке по шаблону. Например, код аналогичный м/у тегами (1) шел в отдельном конфигурационном файле в примерно таком виде:
  host: "127.0.0.1";
  port: 12345;
  protocol: "TCP"

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

Аналогично (2) — этот момент был "захардкожен" в общем для всех конфигов шаблоне скрипта, в который вклеивались содержимое отдельных файлов-конфигов. Почему слово "захардкожен" в кавычках — понятно, думаю.

ДО запуска всегда можно просмотреть получающуюся иерархию конфига. Помимо ресолвинга зависимостей, основная часть кода таких конфигов — это всё-таки установка всяческих значений, в т.ч. нетривиальная, с некоторыми вычислениями. Переписанные на IoC XML эти конфиги превратились бы в многокилометровые и совершенно неюзабельные простыни. Ничего бы не взлетело.

Я понимаю, что полный список задач IoC может быть пошире, я лишь показываю один из простейших путей реализации. Если же скриптовый язык сможет непосредственно создавать объекты низлежащей среды, то функциональность может получится еще удобнее и богаче.

Отдельно здесь идет вопрос безопасности. Я совершал пару телодвижений по ограничению списка используемых типов и функциональности, чтобы через подмену скрипта (или из-за грубых ошибок) нельзя было понасоздавать и юзать как угодно объекты произвольных типов. В XML IoC эта проблема никак не решается. В нем можно создать, инициализировать и запускать абсолютно произвольные объекты из всех доступных библиотек.
Re[22]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 19:57
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Конфигурация — это иерархический список параметризуемых значений, либо кода по вычислению значений.

V>Прямо как-нить в лоб:
V>
V>var interfaceId1 = "Namespace1.Interface1";
V>var interfaceId2 = "Namespace1.Interface2";
V>var objectId1 = "Namespace3.Class4";
V>var objectId2 = "Namespace5.Class6";

// кто будет следить за этими строками ?

V>// (1)
V>var networkConfig = {
V>  host: "127.0.0.1";
V>  port: 12345;
V>  protocol: "TCP"
V>}
V>//(1)

V>clientConfig = function(config) {
V>  this.@type = (config.network.protocol == "TCP") ? objectId1 : objectId2;

V>  this.@init = function(config) { 
V>    this.SomeProperty1 = config.server().SomeProperty;
V>    this.SomeProperty2 = 123;
V>  };
V>};

V>serverConfig = /* нечто аналогичное clientConfig */;

V>//(2)
V>var config = {
V>  network: networkConfig,
V>  client: function() { return clientConfig(this); },
V>  server: function() { return serverConfig(this); }
V>};
V>//(2)
V>


V>Итого, задача скрипта — выполнить логику вычисления конфигурационных параметров и создать объекты скриптовой машины. Сами эти объекты — это просто набор св-в, эдакий словарик ключ-значение. Небольшой хелпер затем "применяет" значения с-в по всему графу через рефлексию. Иногда через алиасы, что бывает удобно. Значением св-ва может быть либо простое значение, либо объект среды, либо объект скриптового языка, либо функция, которую надо вызвать для получения значения и затем аналогично применить. В сам скрипт-енжин обычно добавляют глобально-видимые пользовательские функции.


Ты вероятно привел не тот пример. Все это делает обычный IoC только это будет строго типизированым со всей поддержкой IDE.

Т.е. у тебя IoC на JS единсвтенное достоинство которого это JS.

V>Некоторые св-ва можно принять как зарезервированные, например "@type" и "@init", или еще какие-нить дополнительные проблемно-ориентированные, и обрабатывать их специальным способом еще до подачи на универсальную "применялку" св-в. Это будет уже некая проблемная ориентированность, которая может помочь сократить объемы конфигов еще многократно, хотя в сравнении с XML и так очень неплохо выходит.


А на C# текста будет еще меньше

V>Это все навскидку, понятное дело.


V>ДО запуска всегда можно просмотреть получающуюся иерархию конфига. Помимо ресолвинга зависимостей, основная часть кода таких конфигов — это всё-таки установка всяческих значений, в т.ч. нетривиальная, с некоторыми вычислениями.


Нетривиальные вычисления все равно надо тестировать, а простой просмотр конфига недостаточно, т.к. нет поддержки компилятора и IDE.

>Переписанные на IoC XML эти конфиги превратились бы в многокилометровые и совершенно неюзабельные простыни. Ничего бы не взлетело.


А переписать на C# и все будет понятно.

V>Я понимаю, что полный список задач IoC может быть пошире, я лишь показываю один из простейших путей реализации. Если же скриптовый язык сможет непосредственно создавать объекты низлежащей среды, то функциональность может получится еще удобнее и богаче.


Если в проекте предполагается смена конфигураций по сто раз на день, это понятно. Но ты уверен что это всегда нужно ?

V>Отдельно здесь идет вопрос безопасности. Я совершал пару телодвижений по ограничению списка используемых типов и функциональности, чтобы через подмену скрипта (или из-за грубых ошибок) нельзя было понасоздавать и юзать как угодно объекты произвольных типов. В XML IoC эта проблема никак не решается. В нем можно создать, инициализировать и запускать абсолютно произвольные объекты из всех доступных библиотек.


Дался тебе этот xml Забудь про него. C# — наш выбор !
Re[27]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 20:40
Оценка:
Здравствуйте, samius, Вы писали:

I>>Есть, просто ты сам прицепился к конкретному примеру и проигнорировал абстракцию.

S>Покажи

Я процитировал твою же цитату. TcpState это никакая не абстракция, а конкретный пример.

I>>Представь себе, реализация паттерна сама паттерном не является, т.е. всегда есть отличие между абстракцией и конкретной реализацией. На это отличие и было указано как раз там, где приводились различные реализации этого самого паттерна State. Все они до единой отличются от абстрактной схемы.

S>Еще раз. Фраза
S>"The key difference between table-driven state machines and the State pattern" означает как минимум, что авторы противопоставляют эти вещи, а не считают их одним и тем же. Это для тебя непостижимо?

Конечно. Две разные реализации одно и того же паттерна не являются одной и той же сущностью

I>>см выше. Ты можешь объяснить внятно, в какой момент State перестаёт быть State если я буду применять различные способы задания этих самых transition ?

S>Ты опять в своем духе, как с рыбой. Кто на судне ловит больше рыбы, может владелец, который не на судне?

Неправильный ответ. Как может ловить рыбу человек который не на судне ?

S>Ты не там увидел отличие. Чихать, как заданы переходы, если не выполняется ключевая идея паттерна.

S>

S>The key idea in this pattern is to introduce an abstract class called TCPState... Subclasses of TCPState implement state-specific behavior.

S>Ты видишь у меня абстрактный класс? Наследование может где-то видишь? Может где-то видишь реализацию state-specific behavior?

Ты привел описание конкретной реализацию, ты хоть сам то это понимаешь ? Ты уже третий раз пытаешься ухватиться за строчку текста которая относится к конкретной реализации. Конкретной, а не абстракции !

I>>И именно про это сказано, что State не указывает ни участника, ни схему задания Следовательно для задания transition можно использовать всё что угодно.

S>Можно, но разница не только в этом.

Только в этом.
Re[21]: [C++] о паттернах
От: vdimas Россия  
Дата: 30.05.11 21:12
Оценка:
Здравствуйте, samius, Вы писали:

S>Верно, но это не доказывает твой поинт что табличный автомат есть развитие идеи "Introducing separate objects for different states".


Коллеги, у вас натурально спор идет о моделях автомата Мили vs Мура.

Там, где состояние автомата однозначно определяет его выходное значение — это автомат Мура. А если вычисления значений зависят не только от состояний, но и от внешних входных сигналов — то это автомат Мили.

Соответственно, в таблице для автомата Мура два заголовка — это ID состояния и выходной сигнал, а в Мили мы имеем один заголовок — только ID состояния, но в каждой ячейке автомата у нас появляется дополнительное значение выхода на каждый входной сигнал. Паттерн State по-сути предлагает вместо определения значения сигналов автомата в каждой ячейке описать их функционально — через определения ф-ии для каждого из состояний. Т.е. каждому состоянию будет соответствовать своя ф-ия, которая будет вычислять значения для каждого входного сигнала. Т.к. входных прикладных сигналов в общем случае более одного (т.е. более одного полезного метода, вызываемого в каждом состоянии), то вместо одной ф-ии используется целый их набор — интерфейс.

По сути паттерн State — это дешевый способ из Мура получить Мили. Значением низлежащего автомата Мура будут эти объекты State, а у же в них реализованы ф-ии для дополнения модели до Мили.

Единственно что можно добавить из многих опытов использования всевозможных автоматных моделей — таки лучше логику хождения по таблице из тел методов этих объектов State выносить нафиг. Чтобы эта логика не замыливалась и вы не искали кто куда и зачем сбросил/перевел автомат. Для реализации этой идеи порой приходится вводить т.н. сурогатные сигналы, т.е. несуществующие в предметной области сигналы, а исключительно представляющие из себя коды логических событий, по которым мы будем менять состояние. В этом случае получается реализовать в повторно-применимом виде всю механику хождения по состояниям ВНЕ целевого объекта. Т.е. вся схема делится на внешнюю обслуживающую — автомат Мура, и прикладную — это реализация функциональности, зависящей от состояний (сам паттерн State). Задача прикладной части — выдавать коды упомянутых логических сигналов наружу, а задача управляющей схемы — по этим сигналам сменять объекты State у целевой. Помимо того, что эти две схемы теперь получается легко и независимо тестировать, так сама управляющая схема может быть выполнена как угодно — не обязательно по таблице (бо способов эмуляции автомата Мура более одного). Но целевому объекту эти тонкости реализации внешней, по отношению к нему схемы, естественно будут до лампочки.

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

Итак, в модели Мура существует зависимость: состояние->значение выхода. Но зависимость эта односторонняя, т.е. несколько состояний могут иметь один и тот же выходной сигнал, следовательно, по выходному сигналу не всегда можно сказать, в каком состоянии находится автомат. Возвращаемся к паттерну State. В нем выходным сигналом служит некий конкретный объект State, определяющий поведение всей схемы в некотором состоянии. Это поведение и есть целевое во всей задаче и именно от него мы отталкиваемся во время разработки. И не всегда замечаем, что одно и то же поведение запросто может соответствовать нескольким состояниям. А чем же тогда эти состояния отличаются? — естественно логикой перехода в следующие состояния в зависимости от поступающих логических же событий. Итого, наткнувшись на сию ситуацию и не заметив, что один и тот же объект State используется для разных состояний, в попытках реализовать различия этой логики перехода в следующие состояния, применяются россыпи булевых флагов или дополнительных enum для описания "substates" и т.д. из этой области. Всё вместе оно может привести логику перехода по состояниям из простейшей в нечто трудно отслеживаемое. А потом коллеги делятся на форумах тем, что на паттерне State довольно-таки сложно реализовать сложные автоматы (сорри за тафталогию).
Re[7]: [C++] о паттернах
От: vdimas Россия  
Дата: 30.05.11 21:16
Оценка:
Здравствуйте, Abyx, Вы писали:

A>грустно вздохнем, предвидя кучу проблем в будущем, и напишем как придумается. как будто могут быть варианты %)


Куда катится мир?

Раньше программисты грустно вздыхали от того, что решают похожие проблемы уже не в первый раз. Теперь вздыхают от того, что проблема попалась "непохожая".
Re[22]: [C++] о паттернах
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 22:14
Оценка:
Здравствуйте, vdimas, Вы писали:

V>По сути паттерн State — это дешевый способ из Мура получить Мили. Значением низлежащего автомата Мура будут эти объекты State, а у же в них реализованы ф-ии для дополнения модели до Мили.


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

V>Ну а теперь самый большой бонус, который почти никто никогда не видит, и необнаружение которого вызывает кучу лишнего кода при попытках сделать на паттерне State что-то чуть сложнее чем тривиальное.


Да ладно

V>Итого, наткнувшись на сию ситуацию и не заметив, что один и тот же объект State используется для разных состояний, в попытках реализовать различия этой логики перехода в следующие состояния, применяются россыпи булевых флагов или дополнительных enum для описания "substates" и т.д. из этой области. Всё вместе оно может привести логику перехода по состояниям из простейшей в нечто трудно отслеживаемое. А потом коллеги делятся на форумах тем, что на паттерне State довольно-таки сложно реализовать сложные автоматы (сорри за тафталогию).


Вроде и ежу понятно, что если состояния выбраны неправильно, то придется писать целую кучу логики

Одно из применений этого паттерна — устранить спагетти-цепочки ифов.
Re[23]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 30.05.11 22:34
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Т.е. у тебя IoC на JS единсвтенное достоинство которого это JS.


IoC — это всего-навсего принцип, подход к решению задачи. IoC относится к проектированию АПИ целевых объектов, а с помощью скрипта мы лишь наcилуем их, совершая над ними акты DI. Здесь скрипт (JS не самый удобный, если честно) был как альтернатива аналогичным скриптам XML.


I>А на C# текста будет еще меньше


Как бы мне посмотреть на достаточно сложную конфигурацию на IoC в хардкоде.
Может в личку закинешь кусок кода? А то пока с чем сталкивался — там где оправдан хардкор, без специальных IoC-контейнеров тоже в малое кол-во строк обходилось.


I>Нетривиальные вычисления все равно надо тестировать, а простой просмотр конфига недостаточно, т.к. нет поддержки компилятора и IDE.


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

>>Переписанные на IoC XML эти конфиги превратились бы в многокилометровые и совершенно неюзабельные простыни. Ничего бы не взлетело.


I>А переписать на C# и все будет понятно.


Угу, код он и в Африке код. О чем и речь.

I>Если в проекте предполагается смена конфигураций по сто раз на день, это понятно. Но ты уверен что это всегда нужно ?


Конкретно в нашем применении — каждый тест целиком описывался такого рода конфигом. Поэтому было нужно. Попробовал пару контейнеров IoC, ужаснулся от того, что получалось в итоге на XML, и потратил пару дней на прикручивание скрипта.
Re[22]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 22:37
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


S>>Верно, но это не доказывает твой поинт что табличный автомат есть развитие идеи "Introducing separate objects for different states".


V>Коллеги, у вас натурально спор идет о моделях автомата Мили vs Мура.

Нет, спор идет о том, считают ли GoF табличный автомат частным случаем паттерна State или нет.

V>Итого, наткнувшись на сию ситуацию и не заметив, что один и тот же объект State используется для разных состояний, в попытках реализовать различия этой логики перехода в следующие состояния, применяются россыпи булевых флагов или дополнительных enum для описания "substates" и т.д. из этой области. Всё вместе оно может привести логику перехода по состояниям из простейшей в нечто трудно отслеживаемое. А потом коллеги делятся на форумах тем, что на паттерне State довольно-таки сложно реализовать сложные автоматы (сорри за тафталогию).

20 классов непросто даже без флагов.
Re[24]: [C++] о паттернах (доп.)
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 30.05.11 22:42
Оценка:
Здравствуйте, vdimas, Вы писали:

V>IoC — это всего-навсего принцип, подход к решению задачи.


А я то думал это тарелка борща

>IoC относится к проектированию АПИ целевых объектов, а с помощью скрипта мы лишь наcилуем их, совершая над ними акты DI. Здесь скрипт (JS не самый удобный, если честно) был как альтернатива аналогичным скриптам XML.


Похоже, у тебя какой то нездоровый интерес к xmL. У тебя по любому получается DI только писаный и в C# и в JS

V>Как бы мне посмотреть на достаточно сложную конфигурацию на IoC в хардкоде.

V>Может в личку закинешь кусок кода? А то пока с чем сталкивался — там где оправдан хардкор, без специальных IoC-контейнеров тоже в малое кол-во строк обходилось.

Представь себе примерно страницу кода инициализации — все депенденсы. И так на каждый компонент, с учетом того, что депенденсы нужно брать не где попало, а в правильном контексте.

I>>Нетривиальные вычисления все равно надо тестировать, а простой просмотр конфига недостаточно, т.к. нет поддержки компилятора и IDE.


V>Разумеется, можно протестировать. Подсистема, "накатывающая" граф значений верхнеуровневого скриптового объекта должна уметь предоставлять его в своем публичном АПИ, и тестируй себе.


Чем это лучше кода на C# ?


I>>Если в проекте предполагается смена конфигураций по сто раз на день, это понятно. Но ты уверен что это всегда нужно ?


V>Конкретно в нашем применении — каждый тест целиком описывался такого рода конфигом. Поэтому было нужно. Попробовал пару контейнеров IoC, ужаснулся от того, что получалось в итоге на XML, и потратил пару дней на прикручивание скрипта.


Посмотри Funq — там нет никакого xml.
Re[23]: [C++] о паттернах
От: vdimas Россия  
Дата: 30.05.11 23:00
Оценка:
Здравствуйте, Ikemefula, Вы писали:

V>>По сути паттерн State — это дешевый способ из Мура получить Мили. Значением низлежащего автомата Мура будут эти объекты State, а у же в них реализованы ф-ии для дополнения модели до Мили.


I>Паттерн стейт это тупо автомат Мура. При чем здесь Мили ?


Ты скипнул, где я постарался обрисовать, при чем он здесь. В автомате Мура паттерн State не нужен, по определению автомата Мура.


V>>Итого, наткнувшись на сию ситуацию и не заметив, что один и тот же объект State используется для разных состояний, в попытках реализовать различия этой логики перехода в следующие состояния, применяются россыпи булевых флагов или дополнительных enum для описания "substates" и т.д. из этой области. Всё вместе оно может привести логику перехода по состояниям из простейшей в нечто трудно отслеживаемое. А потом коллеги делятся на форумах тем, что на паттерне State довольно-таки сложно реализовать сложные автоматы (сорри за тафталогию).


I>Вроде и ежу понятно, что если состояния выбраны неправильно, то придется писать целую кучу логики


Фишка в том, что один и тот же объект State может соответствовать разным состояниям. А это потенциальные сложности логики переходов, коль эту логику пытаются реализовать в самих конкретных объектах State.

I>Одно из применений этого паттерна — устранить спагетти-цепочки ифов.


Недавно комментировал эту точку зрения: http://www.rsdn.ru/forum/philosophy/4287664.1.aspx
Автор: vdimas
Дата: 27.05.11


Могу лишь добавить, что в классике ф-ии (или значения) автомата Мили находятся в ячейках таблицы. Так вот, в паттерне State мы низлежащим автоматом получаем "столбец" таблицы, а вызывая конкретный метод — обращаемся к строке, попадая в нужную ячейку исходной модели.

В общем, есть еще способы диспетчеризации ф-ий Мили, помимо цепочек if-фов и паттерна State.
Re[22]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.05.11 23:27
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>Соответственно, в таблице для автомата Мура два заголовка — это ID состояния и выходной сигнал, а в Мили мы имеем один заголовок — только ID состояния, но в каждой ячейке автомата у нас появляется дополнительное значение выхода на каждый входной сигнал. Паттерн State по-сути предлагает вместо определения значения сигналов автомата в каждой ячейке описать их функционально — через определения ф-ии для каждого из состояний. Т.е. каждому состоянию будет соответствовать своя ф-ия, которая будет вычислять значения для каждого входного сигнала. Т.к. входных прикладных сигналов в общем случае более одного (т.е. более одного полезного метода, вызываемого в каждом состоянии), то вместо одной ф-ии используется целый их набор — интерфейс.


V>По сути паттерн State — это дешевый способ из Мура получить Мили. Значением низлежащего автомата Мура будут эти объекты State, а у же в них реализованы ф-ии для дополнения модели до Мили.

Способ диспетчеризации не столь важен для получения Мили из Мура. В одном случае переход может быть просто по таблице — в другом — по vtbl, в третьем — по набору флагов текущего состояния. Любой вариант дешев. В варианте, который я представил, выходы для состояний описывают флаги.

Куда важнее, как именно описаны функции выходных сигналов. Либо мы видим их в матрице сразу все, либо каждую строку матрицы в отдельном файле/классе. Считаю что описывать выходы с помощью классов дорого в плане разработки. Если, конечно нет соответствующего state-machine codegenerator-а + DSL для описания машины. Но зачем они нужны, если есть пути проще? Хотя, в GoF-е разделение описаний по разным классам выдается за преимущество. У Боба Мартина разделение в State описано как фича самого подхода, вместе с недостатками и преимуществами.
Re[23]: [C++] о паттернах
От: vdimas Россия  
Дата: 31.05.11 07:47
Оценка: +1
Здравствуйте, samius, Вы писали:

V>>Коллеги, у вас натурально спор идет о моделях автомата Мили vs Мура.

S>Нет, спор идет о том, считают ли GoF табличный автомат частным случаем паттерна State или нет.

Конечно не считают, ведь паттерн не делает никаких предположений о том, как происходит смена состояний. Я просто дорисовал отсутствующие в паттерне части и высказал мнение, на что это похоже.

V>>Итого, наткнувшись на сию ситуацию и не заметив, что один и тот же объект State используется для разных состояний, в попытках реализовать различия этой логики перехода в следующие состояния, применяются россыпи булевых флагов или дополнительных enum для описания "substates" и т.д. из этой области. Всё вместе оно может привести логику перехода по состояниям из простейшей в нечто трудно отслеживаемое. А потом коллеги делятся на форумах тем, что на паттерне State довольно-таки сложно реализовать сложные автоматы (сорри за тафталогию).

S>20 классов непросто даже без флагов.

Порядка 20 состояний — это не самый большой автомат. ИМХО, автоматный подход требует хотя бы минимального сопровождения, необходимо иметь перед глазами как граф переходов, так и табличный вариант в модели Мили (если нам мало перейти в некое состояние, но мы еще хотим выполнять в нем полезную работу, функционально зависящую от входных сигналов). Понятное дело, что без всего этого удержать в голове взаимную логику из 20-ти классов будет непросто.
Re[25]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 31.05.11 14:48
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>... с учетом того, что депенденсы нужно брать не где попало, а в правильном контексте.


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


I>Посмотри Funq — там нет никакого xml.


А есть у него поддержка динамического конфигурирования? Ну, чтобы без перекомпиляции всего.
Re[13]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 31.05.11 16:27
Оценка:
Здравствуйте, vdimas, Вы писали:

I>>Ну ка, поподробнее. Например куда в идеале денется зависимость от корня квадратного в функции вычисления площади треугольника по формуле Герона.


V>Он имел ввиду, что нет зависимостей от специальных интерфейсов и протоколов, реализующих инфраструктуру фрйемворка. Но он ошибся, т.к. скорее всего подразумевал фреймворк на какой-нить джаве или дотнете, где сия инфраструктура идет "бесплатно".

Выделенное только мне напоминает выводы из собственных предположений?
А меня спросить сложно о том, что же я таки подразумевал? Я же вроде всегда отвечаю. Или так может не получится доказать свою значимость любой ценой?
На дотнете никогда не писал. На джаве писал и не на "какой-нить" а на 1.4 и 1.5
На С++ писал. Там нет рефлекшина и DI реализуется при помощи макросов или кодогенерации.
Зависимостей от контейнера там тоже не было. Никакой инфраструктуры тоже.

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

Но давайте вернемся в реальность. У меня личный вопрос.
Вы недавно запостили вакансию для разработчика с одновременным опытом Java и C++
А можно у Вас поинтересоваться Вашей личной ролью в проекте, для которого люди набираются. Точнее вопросы такие:
1. Будете ли Вы собеседовать кандидата как тех директор, менеджер, тимлид или просто технический специалист?
2. Будете ли Вы выступать в роли руководителя для людей прошедших собеседование?
Если не секрет конечно
Проектирование велосипедов для слепых жирафов
Re[14]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 31.05.11 18:59
Оценка:
Здравствуйте, robin_of_the_wood, Вы писали:

___>Выделенное только мне напоминает выводы из собственных предположений?


Нет, я убедился перед этим на примере еще одного поста.

___>А меня спросить сложно о том, что же я таки подразумевал? Я же вроде всегда отвечаю. Или так может не получится доказать свою значимость любой ценой?

___>На дотнете никогда не писал. На джаве писал и не на "какой-нить" а на 1.4 и 1.5
___>На С++ писал. Там нет рефлекшина и DI реализуется при помощи макросов или кодогенерации.
___>Зависимостей от контейнера там тоже не было. Никакой инфраструктуры тоже.

При чем тут зависимость от контейнера? Разве про это было замечание? Речь была об инфраструктуре, без которой не работает динамическое конфигурирование IoC. Чтобы установить некое произвольное св-во заведомо неизвестного объекта, или вызвать его конструктор/метод с параметрами, имея в распоряжении лишь строковое имя св-ва или метода, надо иметь механизм для этого. В джавах и дотнетах это делается через рефлексию, в COM-через IDispatch, либо через построение аксцессоров по информации из typelib. Для С++ тоже должна быть некая инфраструктура, для построения и вызова аксессоров св-в. Пусть на макросах или кодогенерации, не суть. Могу еще порекомендовать CORBA IDL и пользовать только генеренные по ним прокси без сетевой части. Всё равно это и будет инфраструктура, обеспечивающая требования получения и установки св-в/вызова методов и т.д. в рантайм по строковым идентификаторам.

___>Ну да ладно. Я не в обиде. Тут забавно. Вот где настоящая инверсия. IoC и даже поза "она сверху" отдыхают.

___>Проваливший собеседование тут поучает собеседователей какие надо было ему да и остальным вопросы задавать.
___>Понявший надобность виртуального деструктора — предатель великой и могучей безграмотности.
___>Не осиливший нечто поучает осиливших какое это нечто плохое и кривое и вообще.
___>Предположения вида "А вот Вы наверно в таком вот случае точно неправильно поступите" являются отправными точками для построения причинно-следственных связей.
___>Ну это понятно. На то и форум. Может для кого-то это единственный случай поговорить в поучительном тоне и наконец получить недостижимые в жизни ощущения. С этим вроде тоже все ясно.

Я лишь в 3-й раз уже замечаю, что тебя озадачивает применяемый термин "инфраструктура". Тут как бы в пучину терминологического спора не свалиться, уже стоит начинать быть аккуратным... Но спич любопытный вышел, независимо ни от чего... Я аж еще раз прочел. Если мне столько же нальешь, тоже могу мысль продолжить. Вывод в конце, правда, провокационный получился, таким макаром быть пойманным на автобиографичности недолго... но его и отрецензировать можно. Не пропадать же остальному.

___>Вы недавно запостили вакансию для разработчика с одновременным опытом Java и C++

___>А можно у Вас поинтересоваться Вашей личной ролью в проекте, для которого люди набираются. Точнее вопросы такие:
...

Это какая-то ошибка. Последний раз я постил вакансии, скажем так, относительно давно.

Ну и насчет IoC — контейнеров... Да, я хочу чтобы меня убедили, на достаточно объемных примерах, например. Чтобы мне было чем ответить, показав тоже самое в других техниках. А как ты хотел увидеть спор? Да, оппонент и должен искать наиболее неудобные моменты, а ты, если вызвался, мог бы аргументировать по делу. А пока я вижу лишь мину "познавшего нечто". А мина эта не работает, хотя бы потому, что "запчасти" от любого рядового IoC-контейнера используются сплошь и рядом, в любом более-менее большом проекте. Просто отсутствие требования динамического конфигурирования объясняет отсутствие в проекте некоего готового фреймворка для этого, так на уровне решений/паттернов по месту всё и живет прекрасным образом. Да еще бывают требования эффективности, чем не могут похвастаться IoC контейнеры.

Вот, еще один сторонник IoC-контейнеров в этом споре утверждает, что они хороши для "хардкордного" использования, т.е. для сценариев без динамики тоже. А что тогда от контейнера остается в плане IoC? Пара паттернов в одном месте? По предложенной им же ссылке "легковесного контейнера" лежит именно пара реализованных паттернов, всё вместе общей трудоемкостью примерно на 4 часа работы. Дык, народ и сам прекрасно в таких случаях делает аналогичное. Просто при непосредственном использовании в коде хорошо становится видно, что потребность DI и функции контейнера компонентов — это ортогональные задачи, которые не всегда нужны обе одновременно.

В общем, практически все свои претензии к виденным сценариям использования IoC я уже высказал отсюда http://www.rsdn.ru/forum/philosophy/4292110.1.aspx
Автор: vdimas
Дата: 30.05.11
и ниже по ветке. А так же поделился с коллегами кое-какими наблюдениями из своего опыта.
Re[17]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 01.06.11 21:29
Оценка:
Здравствуйте, Sinclair, Вы писали:

I>>Доставка депенденсов, точно так же как и с DI

S>Простите, но вы, наверное, как-то по другому трактуете термин "инверсия". В моём понимании это "разворот", "отражение", "смена знака".
S>Если раньше A зависел от B, а теперь оба зависят от IB, то это нифига не инверсия. Это — абстракция.

SL — это лишь дополнительный уровень DI для нужд целевого DI.

Без SL пришлось бы писать несколько сценариев доставки зависимостей целевым объектам под каждую конкретную конфигурацию. ИМХО, стоит начать делать DI "в лоб", и при попытке повторно использовать код инициализации, сам собой получается SL, как ср-во абстрагирования от россыпи конкретных синглтонов. Вместо россыпи синглтонов теперь один, который отдает остальные по ключу type id [публичного] интерфейса требуемого синглтона. Иногда логику усложняют с помощью т.н. "контекстов". В каждом контексте — свой набор экземпляров синглтонов.

А то, что IoC-контейнеры имеют неверное название — уже подмечалось.
Re[18]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 01.06.11 22:08
Оценка:
Здравствуйте, vdimas, Вы писали:


S>>Если раньше A зависел от B, а теперь оба зависят от IB, то это нифига не инверсия. Это — абстракция.


V>SL — это лишь дополнительный уровень DI для нужд целевого DI.


У вас какой то непавильный SL. SL есть определенная схема для т.н. доставки зависимостей. Ни больше, ни меньше. Это значит, что когда вам нужна ссылка на чтото нужны, вы сами вытягиваете её у SL. DI вам делеет угол. Так вот для DI все зависимости бесполезные, то есть, он их использует как данные. Структура этого функционала похожа на структуру SL, но это ничего не значит.
Поймите простую вещь — доступ по ключу не делает реализацию Хештейблом.

V>А то, что IoC-контейнеры имеют неверное название — уже подмечалось.


Какие вы задачи ставите перед IoC ?
Re[24]: [C++] о паттернах
От: Sharad-Waador  
Дата: 01.06.11 22:13
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>По сути паттерн State — это дешевый способ из Мура получить Мили. Значением низлежащего автомата Мура будут эти объекты State, а у же в них реализованы ф-ии для дополнения модели до Мили.


I>>Паттерн стейт это тупо автомат Мура. При чем здесь Мили ?


V>Ты скипнул, где я постарался обрисовать, при чем он здесь. В автомате Мура паттерн State не нужен, по определению автомата Мура.


Хочу прояснить, в ответ на "Паттерн стейт это тупо автомат Мура." вы выдали "автомате Мура паттерн State не нужен, по определению автомата Мура". Боюсь показаться навязчивым, но ваше высказывание похоже на "а у вас негров линчуют".

V>В общем, есть еще способы диспетчеризации ф-ий Мили, помимо цепочек if-фов и паттерна State.


"Одно из применений этого паттерна" и здесь, на мой взгляд, нестыковка. Я хочу понять, о чем вы говорите и никак не пойму.
Re[10]: [C++] о паттернах (доп.)
От: mrTwister Россия  
Дата: 02.06.11 06:19
Оценка:
Здравствуйте, vdimas, Вы писали:


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

Например, когда я читаю код и вижу слово "Facade" в названии интерфейса, я понимаю, что за этим интерфейсом скрывается некоторая большая подсистема. И ведь для того, чтобы это понять, мне не пришлось перелопатить кучу кода. Так и с остальными паттернами. Если их использовать правильно, то код становится гораздо более легкочитаемым.
лэт ми спик фром май харт
Re[10]: [C++] о паттернах (доп.)
От: mrTwister Россия  
Дата: 02.06.11 06:26
Оценка: +2
Здравствуйте, vdimas, Вы писали:


V>И что характерно, ввиду совместимости функциональных объектов только лишь по сигнатурам и отсутствия необходимости ресолвить конфликты номативной типизации, эти приемы ФП в отдельные паттерны никто не выделяет.


Вот ни разу не припомню такого, чтобы при написании адаптера у исходного и результирующего интерфейсов бы совпадали сигнатуры. В реальной жизни такого не бывает. Как правило, адаптер еще выполняет некоторые простые преобразования, так что структурная типизация тут бы все равно не помогла.
лэт ми спик фром май харт
Re[19]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 02.06.11 09:02
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

V>>SL — это лишь дополнительный уровень DI для нужд целевого DI.


SW>У вас какой то непавильный SL. SL есть определенная схема для т.н. доставки зависимостей. Ни больше, ни меньше.


Вообще-то я хоть конкретно сказал, что это за схема. Это абстракция синглтона, вместо кучи конкретных, имеем один абстрактный, который дает остальные по ключу. Разумеется, это DI, потому как инициализацию синглтонов выполняет "левый" код, по отношению к коду, который выполняет аспекты инициализации целевых конкретных объектов.

А вот эти эпитеты насчет "определенная схема" пора бы уже в топку. Давай будем ясно и по существу.

SW>Это значит, что когда вам нужна ссылка на что-то нужны, вы сами вытягиваете её у SL.


Кто "вы"? Я считаю, что с SL напрямую должен общаться исключительно код инициализации, который делает объекту DI. А прикладной код общается пусть через прикладные интерфейсы. Обращаться к контейнерам IoC в прикладном коде — большая ошибка. Заверните эти интимные подробности в публичное АПИ доступного контекста и не отсвечивайте внутренностями проекта.

SW>Какие вы задачи ставите перед IoC ?


DI, контейнер объектов + динамическое конфигурирование. И что мы видим? IoC-принцип шире техники DI, а остальное к IoC вообще никаким боком.
Re[25]: [C++] о паттернах
От: vdimas Россия  
Дата: 02.06.11 10:01
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

V>>Ты скипнул, где я постарался обрисовать, при чем он здесь. В автомате Мура паттерн State не нужен, по определению автомата Мура.


SW>Хочу прояснить, в ответ на "Паттерн стейт это тупо автомат Мура." вы выдали "автомате Мура паттерн State не нужен, по определению автомата Мура". Боюсь показаться навязчивым, но ваше высказывание похоже на "а у вас негров линчуют".


Ну, дело в том, что у автомата Мура есть вполне конкретное определение. И оно противоречит проблематике паттерна State, т.е. уже видно, что паттерн State подходящ для реализации другой автоматной модели.

А когда кажется — креститься надо.

V>>В общем, есть еще способы диспетчеризации ф-ий Мили, помимо цепочек if-фов и паттерна State.


SW>"Одно из применений этого паттерна" и здесь, на мой взгляд, нестыковка. Я хочу понять, о чем вы говорите и никак не пойму.


Подразумевается, что читатель знает, или захочет узнать об различиях моделей.
Re[20]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 02.06.11 11:24
Оценка:
Здравствуйте, vdimas, Вы писали:

SW>>У вас какой то непавильный SL. SL есть определенная схема для т.н. доставки зависимостей. Ни больше, ни меньше.


V>Вообще-то я хоть конкретно сказал, что это за схема. Это абстракция синглтона, вместо кучи конкретных, имеем один абстрактный, который дает остальные по ключу. Разумеется, это DI, потому как инициализацию синглтонов выполняет "левый" код, по отношению к коду, который выполняет аспекты инициализации целевых конкретных объектов.


SL не имеет никакого отношения к Синглтону.

SW>>Это значит, что когда вам нужна ссылка на что-то нужны, вы сами вытягиваете её у SL.


V>Кто "вы"? Я считаю, что с SL напрямую должен общаться исключительно код инициализации, который делает объекту DI.


Ты волен считать всё что угодно. SL часто выставляется наружу как часть API при чем без каких либо DI.

>А прикладной код общается пусть через прикладные интерфейсы. Обращаться к контейнерам IoC в прикладном коде — большая ошибка. Заверните эти интимные подробности в публичное АПИ доступного контекста и не отсвечивайте внутренностями проекта.


Сделай поиск в МСДН по свойству ServiceProvider.

SW>>Какие вы задачи ставите перед IoC ?


V>DI, контейнер объектов + динамическое конфигурирование. И что мы видим? IoC-принцип шире техники DI, а остальное к IoC вообще никаким боком.


Чем же заполнена разница между IoC и DI если "остальное к IoC вообще никаким боком"?
Re[26]: [C++] о паттернах
От: Sharad-Waador  
Дата: 02.06.11 11:29
Оценка:
Здравствуйте, vdimas, Вы писали:

V>>>Ты скипнул, где я постарался обрисовать, при чем он здесь. В автомате Мура паттерн State не нужен, по определению автомата Мура.


SW>>Хочу прояснить, в ответ на "Паттерн стейт это тупо автомат Мура." вы выдали "автомате Мура паттерн State не нужен, по определению автомата Мура". Боюсь показаться навязчивым, но ваше высказывание похоже на "а у вас негров линчуют".


V>Ну, дело в том, что у автомата Мура есть вполне конкретное определение. И оно противоречит проблематике паттерна State, т.е. уже видно, что паттерн State подходящ для реализации другой автоматной модели.


В автомате Мура выходной сигнал зависит только от состояния. Что получим, если рассмотрим функцию как выходной сигнал ?
Re[27]: [C++] о паттернах
От: vdimas Россия  
Дата: 02.06.11 16:10
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>В автомате Мура выходной сигнал зависит только от состояния. Что получим, если рассмотрим функцию как выходной сигнал ?


Декомпозицию, друг мой. Но далеко не самую чистую, коль результат работы этой ф-ии имеет побочным эффектом смену состояния автомата. И это реальная проблема петтерна State, которую каждый решает в меру своей испорченности. Проблема во входных сигналах, нарушающих всю красоту декомпозиции. Что есть входные сигналы для автомата? — это те, воздействия которых могут привести к смене его состояния. Особенности этой завязки на входные сигналы, и как это всё лечить (после множества опробованных схем), я уже описал здесь: http://www.rsdn.ru/forum/philosophy/4293053.aspx
Автор: vdimas
Дата: 31.05.11

Для реализации этой идеи порой приходится вводить т.н. сурогатные сигналы, т.е. несуществующие в предметной области сигналы, а исключительно представляющие из себя коды логических событий, по которым мы будем менять состояние. В этом случае получается реализовать в повторно-применимом виде всю механику хождения по состояниям ВНЕ целевого объекта. Т.е. вся схема делится на внешнюю обслуживающую — автомат Мура, и прикладную — это реализация функциональности, зависящей от состояний (сам паттерн State).


Это простой пусть, повышающий тестопригодность, бо позволяет провести теперь уже чистую декомпозицию составных частей нашего решения, а "функция как выходной сигнал" является ф-ией без побочных эффектов с т.з. автоматной части (не важно, что там в прикладной).

Да, через декомпозицию можно построить автомат в внешним АПИ Мили на основе Мура внутри, в чем проблема-то? Синхронные Мили так и делают, например микропрограммные. Асинхронные в железной логике наоборот — выгодней строить сразу Мили, из-за доступной параллельности вычислений.
Re[28]: [C++] о паттернах
От: Sharad-Waador  
Дата: 02.06.11 16:54
Оценка:
Здравствуйте, vdimas, Вы писали:

SW>>В автомате Мура выходной сигнал зависит только от состояния. Что получим, если рассмотрим функцию как выходной сигнал ?


V>Декомпозицию, друг мой.


Декомпозиция здесь ни при чём, она в любом случае будет. Если функцию будем рассматривать как выходной сигнал, то окажется так, что этот выходной сигнал зависит только от состояния. И какой это автомат, где выходные сигналы зависят только от состояния ?
Re[21]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 02.06.11 17:28
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>SL не имеет никакого отношения к Синглтону.


Они пытаюся решить одну и ту же проблематику. Обычно же синглтонами являются фабрики или сервисы.

SW>Ты волен считать всё что угодно. SL часто выставляется наружу как часть API при чем без каких либо DI.


Наружу — это куда?

SW>Сделай поиск в МСДН по свойству ServiceProvider.


И?

Я рефлектором нашел несколько:
System.Windows.Application.ServiceProvider — internal
System.Windows.DeferrableContent.ServiceProvider — internal

Два публичных в неких наследниках EventArgs:
System.Windows.Markup.XamlSetMarkupExtensionEventArgs.ServiceProvider

А в MSDN публичные только из области Microsoft.VisualStudio.Data или Microsoft.VisualStudio.Shell.

Ну и в классической ComponentModel, насколько ты помнишь, всё protected, а инфраструктура устанавливает компоненту в дизайн-тайм SL (ISite) через DI.

SW>Чем же заполнена разница между IoC и DI если "остальное к IoC вообще никаким боком"?


Рядом были приведены отличия IoC от DI.
Re[22]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 02.06.11 17:59
Оценка:
Здравствуйте, vdimas, Вы писали:

SW>>SL не имеет никакого отношения к Синглтону.


V>Они пытаюся решить одну и ту же проблематику. Обычно же синглтонами являются фабрики или сервисы.


Ни в коем случае. Синглтон используют для управления зависимостями, но это как раз пример антипаттерна.

SW>>Ты волен считать всё что угодно. SL часто выставляется наружу как часть API при чем без каких либо DI.


V>Наружу — это куда?


public

SW>>Сделай поиск в МСДН по свойству ServiceProvider.


V>И?

V>Два публичных в неких наследниках EventArgs:
V>А в MSDN публичные только из области Microsoft.VisualStudio.Data или Microsoft.VisualStudio.Shell.
V>Ну и в классической ComponentModel, насколько ты помнишь, всё protected, а инфраструктура устанавливает компоненту в дизайн-тайм SL (ISite) через DI.

IServiceProvider это как раз из классической ComponentModel. Он может инжектиться, может не инжектиться, совершенно неважно "какая там унутре неонка". Главное что интерфейс public и используется для разрешения зависимостей. Используется в тех случаях, когда внешнему относительно фреймворка коду нужно передать управление вместе с необходимыми зависимостями без привязки к конкретным методам, классам, интерфейсам.

SW>>Чем же заполнена разница между IoC и DI если "остальное к IoC вообще никаким боком"?


V>Рядом были приведены отличия IoC от DI.


Приведи пример IoC который не DI.
Re[10]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 02.06.11 19:30
Оценка:
Здравствуйте, vdimas, Вы писали:

V>"Взаимопроникновений" гораздо больше, и без подписей к квадратикам до половины паттернов ты просто не распознаешь, ибо схема и принцип исполнения одни и те же, просто в голове мы даем разное толкование одному и тому же происходящему.


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

V>Включаем воображение и хулиганим: стратегия — это такое иммутабельное состояние. Наоборот: смена стратегий — это суть паттерна State. И первое и второе — разновидность делегирования. Фабрика — опять делегирование. Делегирование, в свою очередь, может на адаптерах выполняться, коль мы хотим делегировать некую функциональность некоему постороннему объекту, с несовместимым для ожидаемого интерфейсом.


Обязанности и зависимости — вот главное. Чем отличается стратегия от стейта ? Можно рассматривать стейт как смену стратегий, но поймите, стейт и стратегия это понятия одного уровня, они не являются родовыми понятиями друг для друга. Следовательно ваше определение всего лишь игра слов. Разница между двумя патернами в обязанностях. У стейта обязанности постоянны на всем времени жизни экземпляра. У стейта обязанности изменяются на всем времени жизни экземпляра.
Именно это и определяет разницу между паттернами. То есть, что бы получить эту самую разницу, паттерны нужно выражать в базовых понятиях, а не друг через друга. Базовые понятия это обязанности и зависимости.

V>На самом деле в GOF чуть ли не половина всех паттернов — это развитие темы делегирования + адаптеры.


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

V>Остается позавидовать функциональщикам, у которых все функциональные типы совместимы по сигнатуре, и такие вещи как адаптеры/стратегии/IoC делаются в одну строчку через частичное применение или через замыкания. Потому что функциональный объект — это и есть воплощение делегирования, а последнее — суть удобный механизм абстрагирования. И что характерно, ввиду совместимости функциональных объектов только лишь по сигнатурам и отсутствия необходимости ресолвить конфликты номативной типизации, эти приемы ФП в отдельные паттерны никто не выделяет. Так и остаются они замыканими и частичными применениями, из которых через комбинаторные сочетания и вложенности можно породить просто мильон сценариев, гораздо больше, чем в GOF. Не зря функциональщики вывели 3 базовых комбинатора, и сказали — теперь хоть обкомбинируйтесь, только не засирайте нам мозги вашими частностями.


Функциональщики рассматривают обязанности и зависимости в чистом виде. MVC ООП == функция ФП. ни больше, ни меньше.

V>ИМХО, в 3 кита ООП можно добавить всего один прикладной костыль — адаптер, служащий для приведения/адаптирования несовместимых интерфейсов или деталей реализации. Суть делегирования/абстрагирования заложена в самом полиморфизме, поэтому всё уже придумано до нас. Пользуйтесь.


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

V>Не, реально, в чистом виде UnitOfWork не существует. Это не объект, не интерфейс, это больше словесное описание происходящего. А если взять реализации из реальных примеров, то его обощенный интерфейс максимум будет такой:

V>
V>class UnitOfWork {
V>public:
V>  virtual void commit() = 0; 
V>protected:
V>  virtual ~UnitOfWork() = 0; 
V>};
V>


Это архитектурный паттерн. Такие паттерны вырождаются в одну единственную функцию ООП здесь не поможет.
Re[23]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 02.06.11 21:12
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

V>>Они пытаюся решить одну и ту же проблематику. Обычно же синглтонами являются фабрики или сервисы.


SW>Ни в коем случае. Синглтон используют для управления зависимостями, но это как раз пример антипаттерна.


К чему относится твое "ни в коем случае"? Решают не одну и ту же проблематику? Серьезно?

Антипаттерном он становится только тогда, когда надо абстрагироваться от технических подробностей реализации синглтона. А если по задаче не надо — никакой не антипаттерн. Ну ок, пусть иногда надо — какие проблемы? Используем некий сервис доступа к сигнлтону, вместо непосредственного чтения статического поля некоторого конкретного типа. Последовательность действий разработчика ничем не отличается от совершаемого в других сценариях, не связанных ни с синглтонами, ни с SL, но где возникает потребность абстрагирования. И если ты не видишь этот простейший переход из одной модели в другую через всего-навсего через одну операцию абстрагирования, то можно прямо сейчас сворачивать любые обсуждения. Мне неинтересно.

SW>>>Ты волен считать всё что угодно. SL часто выставляется наружу как часть API при чем без каких либо DI.


V>>Наружу — это куда?


SW>public


Настаиваешь? Ошибся ты. Почти везде internal, в нескольких местах Protected. Посмотрел я подробнее на сценарий, где он выставлен как паблик в качестве EventArgs — руки поотрывал бы. Джавистами оттуда за версту пахнет. Один случай из боле десятка.

SW>IServiceProvider это как раз из классической ComponentModel. Он может инжектиться, может не инжектиться, совершенно неважно "какая там унутре неонка". Главное что интерфейс public и используется для разрешения зависимостей.


Мало ли, что сам интерфейс public. Зато не доступен как паблик его экземпляр. Ты в рантайме попроси Site у компонента — он будет null. Т.е. не то, чтобы некий "пустой" SL, а вообще null. Почему так сделано? — ИМХО прозрачно, достаточно обозреть ComponentModel.Design. Проблема нарушения инкапсуляции в том, что класс Component объявлен в одной сборке, а установка ему ISite в design time происходит из другой. Во всех остальных случаях, где дело дальше одной сборки не идет, я наблюдаю internal. Взял бы ты лучше рефлектор в руки, и поизучал бы имеющиеся сценарии вокруг IServiceProvider. Потом продолжим, если желание останется.


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


Это слишком обще сказано. Вообще без привязки не бывает. Разве что в динамических языках. А у нас запрашивающий знает о нужных ему интерфейсах. Поэтому я не согласен, про отсутствие привязки. Мы в SL всего-навсего абстрагировались от способа получения сервиса. Путем опять же, такого же банального сервиса. Да, один сервис раздает другие. А те, в свою очредь, могут раздавать конкретные значения или другие объекты и т.д. Что вы наворачиваете в этой простой схеме лишнего, как толкователи из учебника по советской литературе?

В общем, с ног на голову. SL — несомненно удобная вещь. Но происходящее по смыслу относится к тем подробностям, которые принято скрывать. Там, где выставляют "точку входа" для SL как public — это только потому, что по-другому не получается передать эту точку конкретному потребителю. А ты из этого делаешь далеко идущие выводы. Цимус в том, что конкретный потребитель SL, в свою очередь, может быть вовсе не публичным классом/компонентом. Итого, через паблик интерфейс идут одни кишки для потребления в других кишках, и я уже насчитал 2 человека, которые согласны эту схему из вынужденной перевести в разряд рекомендуемой. От непонимания. От попытки везде использовать то, чем научились пользоваться, даже если не очень подходит под задачу. В таких случаях можно было бы завернуть SL в абстракцию хендла на момент передачи, или еще как-нибудь, хотя бы затем, чтобы не давать в публичный доступ потенциально-опасные кишки, через которые можно все поломать.


SW>Приведи пример IoC который не DI.


Приводили уже: http://www.rsdn.ru/forum/philosophy/4285704.1.aspx
Автор: samius
Дата: 26.05.11
Re[24]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 02.06.11 22:20
Оценка: :)
Здравствуйте, vdimas, Вы писали:

SW>>Ни в коем случае. Синглтон используют для управления зависимостями, но это как раз пример антипаттерна.


V>К чему относится твое "ни в коем случае"? Решают не одну и ту же проблематику? Серьезно?


Абсолютно.

V>Антипаттерном он становится только тогда, когда надо абстрагироваться от технических подробностей реализации синглтона. А если по задаче не надо — никакой не антипаттерн. Ну ок, пусть иногда надо — какие проблемы? Используем некий сервис доступа к сигнлтону, вместо непосредственного чтения статического поля некоторого конкретного типа. Последовательность действий разработчика ничем не отличается от совершаемого в других сценариях, не связанных ни с синглтонами, ни с SL, но где возникает потребность абстрагирования. И если ты не видишь этот простейший переход из одной модели в другую через всего-навсего через одну операцию абстрагирования, то можно прямо сейчас сворачивать любые обсуждения. Мне неинтересно.


Правильное применение синглтона это один синглтон на весь проект Таким объектом может являться DI, а может какой нибудь рутовый объект. В библиотеках вроде MFC или ATL это theApp и тд. При этом прямой доступ к этому экземпляру считается моветоном.

SW>>>>Ты волен считать всё что угодно. SL часто выставляется наружу как часть API при чем без каких либо DI.


V>>>Наружу — это куда?


SW>>public


V>Настаиваешь? Ошибся ты. Почти везде internal, в нескольких местах Protected. Посмотрел я подробнее на сценарий, где он выставлен как паблик в качестве EventArgs — руки поотрывал бы. Джавистами оттуда за версту пахнет. Один случай из боле десятка.


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

V>Мало ли, что сам интерфейс public. Зато не доступен как паблик его экземпляр.


У меня доступен Например в OData фреймворк запрашивает через SL определенные интерфейсы от клиента. Это один из примеров использования. Второй пример использования см выше. По большому счету, основных сценариев два — клиент->сервер и сервер->клиент.
В первом случае сервер вытягивает у клиента значение, так как не знает деталей реализации клиента. Во втором случае клиент вытягивает у сервера значение, потому что сервер защищает внутренности. И в том и в другом случае применение DI с такой же легкостью просто невозможно. Например:

PageRefresh += (s, a) =>
{
   IPaginationService svc = a.Ctx.Provider.GetService(typeof(IPaginationService));

   ExternalStaticHelper.DoRefresh(svc);
}


Будь добр, покажи как такого же эффекта можно добиться не используя SL и не нарушая инкапсуляции.

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


V>Это слишком обще сказано. Вообще без привязки не бывает. Разве что в динамических языках. А у нас запрашивающий знает о нужных ему интерфейсах. Поэтому я не согласен, про отсутствие привязки. Мы в SL всего-навсего абстрагировались от способа получения сервиса. Путем опять же, такого же банального сервиса. Да, один сервис раздает другие. А те, в свою очредь, могут раздавать конкретные значения или другие объекты и т.д. Что вы наворачиваете в этой простой схеме лишнего, как толкователи из учебника по советской литературе?


Привязка к интерфейсам это нормально. А вот привязка к методам, свойствам, экземплярам это уже нарушение инкапсуляции. См пример выше.

V>В общем, с ног на голову. SL — несомненно удобная вещь. Но происходящее по смыслу относится к тем подробностям, которые принято скрывать.


Для этого SL и нужен.

SW>>Приведи пример IoC который не DI.


V>Приводили уже: http://www.rsdn.ru/forum/philosophy/4285704.1.aspx
Автор: samius
Дата: 26.05.11


>Ну нет ничего другого.
SL, Template method, глобальная переменная, передача аргументом метода/конструктора, и даже явное создание экземляра в коде компоненты (было упомянуто Фаулером и процитировано тобой).


Это оно ? По моему SL здесь идёт первым в списке. Далее какой то разброд и шатание
Re[25]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 02.06.11 22:45
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, vdimas, Вы писали:


V>>Мало ли, что сам интерфейс public. Зато не доступен как паблик его экземпляр.


SW>У меня доступен Например в OData фреймворк запрашивает через SL определенные интерфейсы от клиента. Это один из примеров использования. Второй пример использования см выше. По большому счету, основных сценариев два — клиент->сервер и сервер->клиент.

SW>В первом случае сервер вытягивает у клиента значение, так как не знает деталей реализации клиента. Во втором случае клиент вытягивает у сервера значение, потому что сервер защищает внутренности. И в том и в другом случае применение DI с такой же легкостью просто невозможно. Например:

SW>
SW>PageRefresh += (s, a) =>
SW>{
SW>   IPaginationService svc = a.Ctx.Provider.GetService(typeof(IPaginationService));

SW>   ExternalStaticHelper.DoRefresh(svc);
SW>}
SW>


С DI только проще

PageRefresh += (s, a) =>
{
   a.Ctx.DI.Resolve<IExternalHelper>().DoRefresh();
}


SW>Будь добр, покажи как такого же эффекта можно добиться не используя SL и не нарушая инкапсуляции.

SL это нарушение инкапсуляции разве что чуть меньшее, чем объявление публичных полей.

SW>>>Приведи пример IoC который не DI.


V>>Приводили уже: http://www.rsdn.ru/forum/philosophy/4285704.1.aspx
Автор: samius
Дата: 26.05.11


SW>

>>Ну нет ничего другого.
SW>SL, Template method, глобальная переменная, передача аргументом метода/конструктора, и даже явное создание экземляра в коде компоненты (было упомянуто Фаулером и процитировано тобой).


SW>Это оно ? По моему SL здесь идёт первым в списке. Далее какой то разброд и шатание

дык требовался IoC без DI, разве нет? А по поводу разброда и шатания можно подробнее?
Re[26]: [C++] о паттернах (доп.)
От: rameel https://github.com/rsdn/CodeJam
Дата: 03.06.11 07:37
Оценка:
Здравствуйте, samius, Вы писали:

S>SL это нарушение инкапсуляции разве что чуть меньшее, чем объявление публичных полей.


Почему?
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Re[26]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 03.06.11 08:03
Оценка:
Здравствуйте, samius, Вы писали:

SW>>
SW>>PageRefresh += (s, a) =>
SW>>{
SW>>   IPaginationService svc = a.Ctx.Provider.GetService(typeof(IPaginationService));

SW>>   ExternalStaticHelper.DoRefresh(svc);
SW>>}
SW>>


S>С DI только проще

S>
S>PageRefresh += (s, a) =>
S>{
S>   a.Ctx.DI.Resolve<IExternalHelper>().DoRefresh();
S>}
S>


Не проще. Откуда взялась ссылка на статический класс ? А что делать, если строчек чуть больше ?

SW>>Будь добр, покажи как такого же эффекта можно добиться не используя SL и не нарушая инкапсуляции.

S>SL это нарушение инкапсуляции разве что чуть меньшее, чем объявление публичных полей.

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

SW>>

>>>Ну нет ничего другого.
SW>>SL, Template method, глобальная переменная, передача аргументом метода/конструктора, и даже явное создание экземляра в коде компоненты (было упомянуто Фаулером и процитировано тобой).


SW>>Это оно ? По моему SL здесь идёт первым в списке. Далее какой то разброд и шатание

S>дык требовался IoC без DI, разве нет? А по поводу разброда и шатания можно подробнее?

Можно.
  var dep1 = new Dep1();
  var dep2 = GetDep2();
  var c = new Component(dep1,dep2);
  c.Init(g_dep3);


Использовано все перечисленное, а IoC не просматривается а значит перечисленое не является IoC.
Re[27]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.06.11 08:37
Оценка: +1
Здравствуйте, rameel, Вы писали:

R>Здравствуйте, samius, Вы писали:


S>>SL это нарушение инкапсуляции разве что чуть меньшее, чем объявление публичных полей.


R>Почему?

Инкапсуляция — это сокрытие. А SL — это открытие. Пусть не в виде "здесь есть такие публичные поля", но в виде "эта штука должна уметь возвращать IFoo". А это все равно значит расширение контракта, следовательно об инкапсуляции говорить не приходится. Отличие от публичного поля лишь в способе доступа.
Re[27]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.06.11 08:59
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>С DI только проще

S>>
S>>PageRefresh += (s, a) =>
S>>{
S>>   a.Ctx.DI.Resolve<IExternalHelper>().DoRefresh();
S>>}
S>>


SW>Не проще. Откуда взялась ссылка на статический класс ? А что делать, если строчек чуть больше ?

Я показал как это могло бы выглядеть с DI. Что за ссылка на статический класс? Я не знаю, что это такое.
Что делать — я не знаю. Мне казалось, что я опроверг утверждение "И в том и в другом случае применение DI с такой же легкостью просто невозможно.". Что с этим делать — не мне решать.

S>>SL это нарушение инкапсуляции разве что чуть меньшее, чем объявление публичных полей.


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

SL требует знаний о том что нечто умеет возвращать реализацию. И не важно, через поле оно его возвращает или еще как. Пусть SL инкапсулирует способ получения реализации интерфейса, но не сам факт.
По своей сути SL родственен такому подходу
var someService = (ISomService)foo.GetType().GetField("_someService").GetValue(foo, null);

разве меньше писанины и деталей. Но тот факт что по некому ключу можно получить некую реализацию делает их схожими.

SW>>>Это оно ? По моему SL здесь идёт первым в списке. Далее какой то разброд и шатание

S>>дык требовался IoC без DI, разве нет? А по поводу разброда и шатания можно подробнее?

SW>Можно.

SW>
SW>  var dep1 = new Dep1();
SW>  var dep2 = GetDep2();
SW>  var c = new Component(dep1,dep2);
SW>  c.Init(g_dep3);
SW>


SW>Использовано все перечисленное, а IoC не просматривается а значит перечисленое не является IoC.

class Component
{
    public Component(IDep1 dep1, IDep2 dep2) {...}
    public void Init(IDep3 dep3) {...}

Так IoC все еще не просматривается? Если просматривается, то налицо ошибка в выводах. Если нет — то очевидно недопонимание IoC.
Re[28]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 03.06.11 10:10
Оценка:
Здравствуйте, samius, Вы писали:

S>>>С DI только проще

S>>>
S>>>PageRefresh += (s, a) =>
S>>>{
S>>>   a.Ctx.DI.Resolve<IExternalHelper>().DoRefresh();
S>>>}
S>>>


SW>>Не проще. Откуда взялась ссылка на статический класс ? А что делать, если строчек чуть больше ?

S>Я показал как это могло бы выглядеть с DI. Что за ссылка на статический класс? Я не знаю, что это такое.

И я не знаю и мне не понятно что является эквивалентом моего ExternalStaticHelper в случае с DI. Если для одного метода создавать по классу что бы использовать DI это перебор.

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

S>SL требует знаний о том что нечто умеет возвращать реализацию. И не важно, через поле оно его возвращает или еще как. Пусть SL инкапсулирует способ получения реализации интерфейса, но не сам факт.

То есть знания о контракте, а не о конкретных деталях реализации как проперти, классы, сборки и тд.

S>По своей сути SL родственен такому подходу

S>
S>var someService = (ISomService)foo.GetType().GetField("_someService").GetValue(foo, null);
S>


S>разве меньше писанины и деталей. Но тот факт что по некому ключу можно получить некую реализацию делает их схожими.


Похожи с той разницей, что один случай нарушает инкапсуляюцию, а другой не нарушает.

SW>>Можно.

SW>>
SW>>  var dep1 = new Dep1();
SW>>  var dep2 = GetDep2();
SW>>  var c = new Component(dep1,dep2);
SW>>  c.Init(g_dep3);
SW>>


SW>>Использовано все перечисленное, а IoC не просматривается а значит перечисленое не является IoC.

S>
S>class Component
S>{
S>    public Component(IDep1 dep1, IDep2 dep2) {...}
S>    public void Init(IDep3 dep3) {...}
S>

S>Так IoC все еще не просматривается? Если просматривается, то налицо ошибка в выводах. Если нет — то очевидно недопонимание IoC.

Принимаем зависимости через конструктор — IoC. Через метод — IoC. Через глобальную переменную — IoC. Через проперти — IoC. Через переопределямый метод — снова IoC. Выходит , что чуть более чем все класссы .Net фреймворка реализуют IoC. Между тем IoC это или тот код, который пичкает компонент зависимостями, или тот код, который использует компонент что бы вытянуть зависимости. Очевидно, в данной реализации нет ни того, ни другого, а следовательно класс Component никакого отношения к IoC не имеет.
Re[29]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.06.11 11:03
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Не проще. Откуда взялась ссылка на статический класс ? А что делать, если строчек чуть больше ?

S>>Я показал как это могло бы выглядеть с DI. Что за ссылка на статический класс? Я не знаю, что это такое.

SW>И я не знаю и мне не понятно что является эквивалентом моего ExternalStaticHelper в случае с DI. Если для одного метода создавать по классу что бы использовать DI это перебор.

Это не перебор, это IoC.

S>>SL требует знаний о том что нечто умеет возвращать реализацию. И не важно, через поле оно его возвращает или еще как. Пусть SL инкапсулирует способ получения реализации интерфейса, но не сам факт.


SW>То есть знания о контракте, а не о конкретных деталях реализации как проперти, классы, сборки и тд.


S>>По своей сути SL родственен такому подходу

S>>
S>>var someService = (ISomService)foo.GetType().GetField("_someService").GetValue(foo, null);
S>>


S>>разве меньше писанины и деталей. Но тот факт что по некому ключу можно получить некую реализацию делает их схожими.


SW>Похожи с той разницей, что один случай нарушает инкапсуляюцию, а другой не нарушает.

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

SW>>>Использовано все перечисленное, а IoC не просматривается а значит перечисленое не является IoC.

S>>
S>>class Component
S>>{
S>>    public Component(IDep1 dep1, IDep2 dep2) {...}
S>>    public void Init(IDep3 dep3) {...}
S>>

S>>Так IoC все еще не просматривается? Если просматривается, то налицо ошибка в выводах. Если нет — то очевидно недопонимание IoC.

SW>Принимаем зависимости через конструктор — IoC. Через метод — IoC. Через глобальную переменную — IoC. Через проперти — IoC. Через переопределямый метод — снова IoC. Выходит , что чуть более чем все класссы .Net фреймворка реализуют IoC.

не все, но довольно часто. Predicate<T> — проявление IoC, IComparer — тоже. IEnumerable по отношению к System.Linq.Enumerable — тоже.
SW>Между тем IoC это или тот код, который пичкает компонент зависимостями, или тот код, который использует компонент что бы вытянуть зависимости.
IoC это принцип, а не "тот код".

SW>Очевидно, в данной реализации нет ни того, ни другого, а следовательно класс Component никакого отношения к IoC не имеет.

Очевидно, Component не имеет зависимости от реализаций IDep*. А следовательно направление зависимостей в коде инвертировано по отношению к традиционным зависимостям процедурного подхода.
Re[30]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 03.06.11 12:14
Оценка:
Здравствуйте, samius, Вы писали:

SW>>И я не знаю и мне не понятно что является эквивалентом моего ExternalStaticHelper в случае с DI. Если для одного метода создавать по классу что бы использовать DI это перебор.

S>Это не перебор, это IoC.

В проекте где пару тысяч методов вроде тех, что я показал придется создать еще и пару тысяч фейковых классов, что бы работать с DI и ни одного такого класса, что бы работать с SL.

SW>>Похожи с той разницей, что один случай нарушает инкапсуляюцию, а другой не нарушает.

S>Инкапсуляция — термин гораздо более широкий, чем только лишь сокрытие поля. Каких-то уточнений по поводу сокрытия данных я не вижу, значит подразумеваю что термин использован в широком смысле. А в широком нарушают оба.

В одном случае открывается контракт. В другом — пропертя, что автоматически привязывает к классу и сборке, или хотя бы имя ключа. Контракт и пропертя абсолютно несравнимы между собой.

SW>>Принимаем зависимости через конструктор — IoC. Через метод — IoC. Через глобальную переменную — IoC. Через проперти — IoC. Через переопределямый метод — снова IoC. Выходит , что чуть более чем все класссы .Net фреймворка реализуют IoC.

S>не все, но довольно часто. Predicate<T> — проявление IoC, IComparer — тоже. IEnumerable по отношению к System.Linq.Enumerable — тоже.
SW>>Между тем IoC это или тот код, который пичкает компонент зависимостями, или тот код, который использует компонент что бы вытянуть зависимости.
S>IoC это принцип, а не "тот код".

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

SW>>Очевидно, в данной реализации нет ни того, ни другого, а следовательно класс Component никакого отношения к IoC не имеет.

S>Очевидно, Component не имеет зависимости от реализаций IDep*. А следовательно направление зависимостей в коде инвертировано по отношению к традиционным зависимостям процедурного подхода.

Для IoC этого еще недостаточно.
Re[31]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.06.11 12:26
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>И я не знаю и мне не понятно что является эквивалентом моего ExternalStaticHelper в случае с DI. Если для одного метода создавать по классу что бы использовать DI это перебор.

S>>Это не перебор, это IoC.

SW>В проекте где пару тысяч методов вроде тех, что я показал придется создать еще и пару тысяч фейковых классов, что бы работать с DI и ни одного такого класса, что бы работать с SL.

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

SW>>>Похожи с той разницей, что один случай нарушает инкапсуляюцию, а другой не нарушает.

S>>Инкапсуляция — термин гораздо более широкий, чем только лишь сокрытие поля. Каких-то уточнений по поводу сокрытия данных я не вижу, значит подразумеваю что термин использован в широком смысле. А в широком нарушают оба.

SW>В одном случае открывается контракт. В другом — пропертя, что автоматически привязывает к классу и сборке, или хотя бы имя ключа. Контракт и пропертя абсолютно несравнимы между собой.

Пропертя это не контракт уже?

S>>IoC это принцип, а не "тот код".


SW>Если сравнить с твоим кодом, то окажется, что чуть более чем все классы реализуют этот принцип.

И что тебя смущает в этом?

S>>Очевидно, Component не имеет зависимости от реализаций IDep*. А следовательно направление зависимостей в коде инвертировано по отношению к традиционным зависимостям процедурного подхода.


SW>Для IoC этого еще недостаточно.

Разверни. Какой именно формулировкой IoC ты пользуешься, и чего там должно быть достаточно?
Re[32]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 03.06.11 13:32
Оценка: -1
Здравствуйте, samius, Вы писали:

SW>>В проекте где пару тысяч методов вроде тех, что я показал придется создать еще и пару тысяч фейковых классов, что бы работать с DI и ни одного такого класса, что бы работать с SL.

S>Если нужна пара тысячь таких методов, то и решение с SL отстойно.

А для десятка методов понаписывать десять фейковых классов это нормально ? Нет ниакой проблемы сделать SL доступным клиентам, это общий подход.

SW>>В одном случае открывается контракт. В другом — пропертя, что автоматически привязывает к классу и сборке, или хотя бы имя ключа. Контракт и пропертя абсолютно несравнимы между собой.

S>Пропертя это не контракт уже?

Да, пропертя не является эквивалентом понятия контракт и это очевидно.

SW>>Если сравнить с твоим кодом, то окажется, что чуть более чем все классы реализуют этот принцип.

S>И что тебя смущает в этом?

Ничего. Это настолько общая трактовка, что смысла в ней вообще никакого нет.

W>>Для IoC этого еще недостаточно.

S>Разверни. Какой именно формулировкой IoC ты пользуешься, и чего там должно быть достаточно?

Сейчас под IoC подразумевают всегда IoC-контейнер.
Re[33]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.06.11 13:54
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>В проекте где пару тысяч методов вроде тех, что я показал придется создать еще и пару тысяч фейковых классов, что бы работать с DI и ни одного такого класса, что бы работать с SL.

S>>Если нужна пара тысячь таких методов, то и решение с SL отстойно.

SW>А для десятка методов понаписывать десять фейковых классов это нормально ? Нет ниакой проблемы сделать SL доступным клиентам, это общий подход.

Я не вижу проблемы. Ты просил пример, где без SL — я привел. Откуда ж я знал что у тебя то десятки, то пара тысяч таких методов?

SW>>>В одном случае открывается контракт. В другом — пропертя, что автоматически привязывает к классу и сборке, или хотя бы имя ключа. Контракт и пропертя абсолютно несравнимы между собой.

S>>Пропертя это не контракт уже?

SW>Да, пропертя не является эквивалентом понятия контракт и это очевидно.

"Очевидно" вместо аргументов не канает, особенно в ответ на вопрос, который подразумевает что для собеседника это не очевидно.

SW>>>Если сравнить с твоим кодом, то окажется, что чуть более чем все классы реализуют этот принцип.

S>>И что тебя смущает в этом?

SW>Ничего. Это настолько общая трактовка, что смысла в ней вообще никакого нет.

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

W>>>Для IoC этого еще недостаточно.

S>>Разверни. Какой именно формулировкой IoC ты пользуешься, и чего там должно быть достаточно?

SW>Сейчас под IoC подразумевают всегда IoC-контейнер.

Ты забыл уточнить кто именно. Желательно со ссылками. "Сейчас", "подразумевают", "всегда" — это как-бы за всех. Если это так, то тебя не затруднит привести ссылки. Если затруднит — не говори за всех, а только за себя.
Я уже в свою очередь приводил цитату

some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.

Если ты говоришь именно об этих людях, то ты ссылаешься на людей, которые "confuse" по мнению Фаулера.
Re[34]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 03.06.11 15:38
Оценка: -1
Здравствуйте, samius, Вы писали:

SW>>>>В проекте где пару тысяч методов вроде тех, что я показал придется создать еще и пару тысяч фейковых классов, что бы работать с DI и ни одного такого класса, что бы работать с SL.

S>>>Если нужна пара тысячь таких методов, то и решение с SL отстойно.

SW>>А для десятка методов понаписывать десять фейковых классов это нормально ? Нет ниакой проблемы сделать SL доступным клиентам, это общий подход.

S>Я не вижу проблемы. Ты просил пример, где без SL — я привел. Откуда ж я знал что у тебя то десятки, то пара тысяч таких методов?

Неверно. Я просил пример, где решение без SL будет лучше. Выходит, что для десятков методов твое решение не подходит. Для тысяч тоже не подходит. А для чего подходит ?

SW>>Да, пропертя не является эквивалентом понятия контракт и это очевидно.

S>"Очевидно" вместо аргументов не канает, особенно в ответ на вопрос, который подразумевает что для собеседника это не очевидно.

А какой ты ответ ожидал на вопрос, "Пропертя это не контракт уже?" ? Вот чисто ради интереса, что ты хотел спросить или может сказать своим вопросом ?

SW>>Сейчас под IoC подразумевают всегда IoC-контейнер.

S>Ты забыл уточнить кто именно. Желательно со ссылками. "Сейчас", "подразумевают", "всегда" — это как-бы за всех. Если это так, то тебя не затруднит привести ссылки. Если затруднит — не говори за всех, а только за себя.

В современной литературе IoC не встречается отдельно от фреймворка или контейнера.

S>Я уже в свою очередь приводил цитату

S>

S>some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.

S>Если ты говоришь именно об этих людях, то ты ссылаешься на людей, которые "confuse" по мнению Фаулера.

Внезапно Фаулер вдруг сказал тоже самое что и я
Re[35]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 03.06.11 19:53
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>Я не вижу проблемы. Ты просил пример, где без SL — я привел. Откуда ж я знал что у тебя то десятки, то пара тысяч таких методов?


SW>Неверно. Я просил пример, где решение без SL будет лучше. Выходит, что для десятков методов твое решение не подходит. Для тысяч тоже не подходит. А для чего подходит ?

Да, для ручного подставления зависимостей в статические методы DI контейнеры не очень подходят. Кто же знал, что у тебя там тысячи статических методов, которым зависимости никак не передать, кроме как врукопашку?

SW>>>Да, пропертя не является эквивалентом понятия контракт и это очевидно.

S>>"Очевидно" вместо аргументов не канает, особенно в ответ на вопрос, который подразумевает что для собеседника это не очевидно.

SW>А какой ты ответ ожидал на вопрос, "Пропертя это не контракт уже?" ? Вот чисто ради интереса, что ты хотел спросить или может сказать своим вопросом ?

Я хотел убедиться, действительно ли ты не считаешь свойство контрактом? Думал что возможно ты располагаешь какими-то аргументами кроме любимого "очевидно"? По ответу полагаю что да, не считаешь, и нет, не располагаешь.

SW>>>Сейчас под IoC подразумевают всегда IoC-контейнер.

S>>Ты забыл уточнить кто именно. Желательно со ссылками. "Сейчас", "подразумевают", "всегда" — это как-бы за всех. Если это так, то тебя не затруднит привести ссылки. Если затруднит — не говори за всех, а только за себя.

SW>В современной литературе IoC не встречается отдельно от фреймворка или контейнера.

Ну вот, опять ответ за всю современную литературу без единой ссылки.
И причем тут современная литература? Т.е. 20 лет с лишним упорно называли IoC-ом что-то одно, а потом пришла современная литература и показала как правильно?
Ты, случаем, не препод по совместительству? Кучка "очевидно" + ни одной ссылки как-бы намекают.

S>>

S>>some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.

S>>Если ты говоришь именно об этих людях, то ты ссылаешься на людей, которые "confuse" по мнению Фаулера.

SW>Внезапно Фаулер вдруг сказал тоже самое что и я

Он сказал то, что ты упорно демонстрируешь.
Re[29]: [C++] о паттернах
От: vdimas Россия  
Дата: 05.06.11 11:21
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Декомпозиция здесь ни при чём, она в любом случае будет. Если функцию будем рассматривать как выходной сигнал, то окажется так, что этот выходной сигнал зависит только от состояния. И какой это автомат, где выходные сигналы зависят только от состояния ?


Хм... Это такая принципиальная позиция, не читать ответы оппонентов? Отвечай тогда на свои собственные посты, а не на мои.

Да, через декомпозицию можно построить автомат с внешним АПИ Мили на основе Мура внутри, в чем проблема-то? Синхронные Мили так и делают, например микропрограммные. Асинхронные в железной логике наоборот — выгодней строить сразу Мили, из-за доступной параллельности вычислений.


Смысл рассматривать один из внутренних блоков, который всегда приватный? Это интимные вопросы реализации, которые не видны в публичном доступе. Это относится к паттерну State, если мы всё еще о нем, а не о чем-то новом, которое ты не озвучил.
Re[15]: [C++] о паттернах (доп.)
От: robin_of_the_wood Россия  
Дата: 05.06.11 14:53
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Я лишь в 3-й раз уже замечаю, что тебя озадачивает применяемый термин "инфраструктура". Тут как бы в пучину терминологического спора не свалиться, уже стоит начинать быть аккуратным... Но спич любопытный вышел, независимо ни от чего... Я аж еще раз прочел. Если мне столько же нальешь, тоже могу мысль продолжить. Вывод в конце, правда, провокационный получился, таким макаром быть пойманным на автобиографичности недолго... но его и отрецензировать можно. Не пропадать же остальному.

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

___>>Вы недавно запостили вакансию для разработчика с одновременным опытом Java и C++

___>>А можно у Вас поинтересоваться Вашей личной ролью в проекте, для которого люди набираются. Точнее вопросы такие:
V>Это какая-то ошибка. Последний раз я постил вакансии, скажем так, относительно давно.
Ой. Дико извиняюсь. Это я напутал. Каюсь. Вопрос снят

V>Ну и насчет IoC — контейнеров... Да, я хочу чтобы меня убедили, на достаточно объемных примерах, например. Чтобы мне было чем ответить, показав тоже самое в других техниках. А как ты хотел увидеть спор? Да, оппонент и должен искать наиболее неудобные моменты, а ты, если вызвался, мог бы аргументировать по делу. А пока я вижу лишь мину "познавшего нечто". А мина эта не работает, хотя бы потому, что "запчасти" от любого рядового IoC-контейнера используются сплошь и рядом, в любом более-менее большом проекте. Просто отсутствие требования динамического конфигурирования объясняет отсутствие в проекте некоего готового фреймворка для этого, так на уровне решений/паттернов по месту всё и живет прекрасным образом. Да еще бывают требования эффективности, чем не могут похвастаться IoC контейнеры.

Да я просто поделился личным опытом. Никого ни в чем убеждать не собираюсь. А про эффективность это откуда взялось?
IoC контейнеры обычно раздают зависимости перед стартом. В одном потоке. Это очень эффективно кроме того, что позволяет обнаружить проблемы с инициализацией _до_ старта а не когда-нибудь потом. Иногда это очень важно. Потом происходит старт всего приложения и запуск многих потоков. И там уже любая инициализация требует синхронизации. Только на этом можно выиграть. А по поводу мины — ее нет. Просто когда два разных человека рассказывают о своем опыте работы с той же самой или с похожими вещами и один из них заявляет "Не, неправильно. Надо вот так", мне это странным кажется. Я стараюсь так не делать. Точки зрения разными бывают и это как минимум понимать надо

V>Вот, еще один сторонник IoC-контейнеров в этом споре утверждает, что они хороши для "хардкордного" использования, т.е. для сценариев без динамики тоже. А что тогда от контейнера остается в плане IoC? Пара паттернов в одном месте? По предложенной им же ссылке "легковесного контейнера" лежит именно пара реализованных паттернов, всё вместе общей трудоемкостью примерно на 4 часа работы. Дык, народ и сам прекрасно в таких случаях делает аналогичное. Просто при непосредственном использовании в коде хорошо становится видно, что потребность DI и функции контейнера компонентов — это ортогональные задачи, которые не всегда нужны обе одновременно.

Ну вот судя по отсутсвию единого мнения я бы не сказал, что "народ и сам прекрасно в таких случаях делает аналогичное". Скорее все по разному делают. Отсюда и споры. Ну так это и хорошо.

V>В общем, практически все свои претензии к виденным сценариям использования IoC я уже высказал отсюда http://www.rsdn.ru/forum/philosophy/4292110.1.aspx
Автор: vdimas
Дата: 30.05.11
и ниже по ветке. А так же поделился с коллегами кое-какими наблюдениями из своего опыта.

За это спасибо. Наличие иной точки зрения да еще и с аргументами для меня как минимум интересно
Проектирование велосипедов для слепых жирафов
Re[28]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 06.06.11 01:57
Оценка:
Здравствуйте, samius, Вы писали:

R>>Почему?

S>Инкапсуляция — это сокрытие. А SL — это открытие. Пусть не в виде "здесь есть такие публичные поля", но в виде "эта штука должна уметь возвращать IFoo". А это все равно значит расширение контракта, следовательно об инкапсуляции говорить не приходится. Отличие от публичного поля лишь в способе доступа.

Да, SL — это аналог динамического расширения контракта, ты прав. И проблемы тут как в любой динамике — наличие неких контрактов обеспечивается не статической схемой отношений типов, а в голове разработчика (реже в документации).

В дотнете SL используется в основном для того, чтобы зависимости компонента от сборок design-time не тянуть в run-time. А зачем народ его использует направо и налево полностью в рантайм окружении, да еще в примитивных ситуациях из менее десятка взаимодействующих типов? Обрубают себе статический контроль компилятором, только и всего.
Re[29]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.06.11 04:50
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


R>>>Почему?

S>>Инкапсуляция — это сокрытие. А SL — это открытие. Пусть не в виде "здесь есть такие публичные поля", но в виде "эта штука должна уметь возвращать IFoo". А это все равно значит расширение контракта, следовательно об инкапсуляции говорить не приходится. Отличие от публичного поля лишь в способе доступа.

V>Да, SL — это аналог динамического расширения контракта, ты прав. И проблемы тут как в любой динамике — наличие неких контрактов обеспечивается не статической схемой отношений типов, а в голове разработчика (реже в документации).


V>В дотнете SL используется в основном для того, чтобы зависимости компонента от сборок design-time не тянуть в run-time. А зачем народ его использует направо и налево полностью в рантайм окружении, да еще в примитивных ситуациях из менее десятка взаимодействующих типов? Обрубают себе статический контроль компилятором, только и всего.


Имхо, основных причин несколько:
1) собственно ради ослабления контроля компилятором, ради удаления нежелательных зависимостей между классами/модулями, вплоть до развязывания назревающих циклических зависимостей между сборками. Точнее не так. Зависимости все-таки остаются, но они переносятся на другой этап компиляции (JIT в случае дотнета). Собственно, тот же трюк, как с библиотеками шаблонов в C++, когда компилятору не нужна директива #include "Foo.h" в фале vector что бы создать std::vector<Foo>.
Иногда эту проблему лучше решать переносом типов в другие модули, создание "абстрактных" сборок с объявлениями интерфейсов.
2) Статический SL замещается динамическим по прозаическим причинам — стало слишком много сервисов, которыми нужно рулить, лениво вписывать поля и методы доступа для очередного сервиса. И тут нельзя сказать что замена плохая, просто надо представлять себе что она не бесплатная и статические зависимости переносятся из кода в "голову" разработчика.
3) Работа со слабо-связанными компонентами типа плагинов, или чего-то вроде Enterprise Library, когда части системы узнают друг-друга только в рантайме. Потрясающая гибкость и подменяемость модулей уровня динамических языков, естественно с соответствующими проблемами в рантайме.
Re[30]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 06.06.11 09:10
Оценка:
Здравствуйте, samius, Вы писали:

R>>>>Почему?

S>>>Инкапсуляция — это сокрытие. А SL — это открытие. Пусть не в виде "здесь есть такие публичные поля", но в виде "эта штука должна уметь возвращать IFoo". А это все равно значит расширение контракта, следовательно об инкапсуляции говорить не приходится. Отличие от публичного поля лишь в способе доступа.

V>>Да, SL — это аналог динамического расширения контракта, ты прав. И проблемы тут как в любой динамике — наличие неких контрактов обеспечивается не статической схемой отношений типов, а в голове разработчика (реже в документации).


V>>В дотнете SL используется в основном для того, чтобы зависимости компонента от сборок design-time не тянуть в run-time. А зачем народ его использует направо и налево полностью в рантайм окружении, да еще в примитивных ситуациях из менее десятка взаимодействующих типов? Обрубают себе статический контроль компилятором, только и всего.


S>Имхо, основных причин несколько:

S>1) собственно ради ослабления контроля компилятором, ради удаления нежелательных зависимостей между классами/модулями, вплоть до развязывания назревающих циклических зависимостей между сборками. Точнее не так. Зависимости все-таки остаются, но они переносятся на другой этап компиляции (JIT в случае дотнета). Собственно, тот же трюк, как с библиотеками шаблонов в C++, когда компилятору не нужна директива #include "Foo.h" в фале vector что бы создать std::vector<Foo>.
S>Иногда эту проблему лучше решать переносом типов в другие модули, создание "абстрактных" сборок с объявлениями интерфейсов.

Зависимости всегда должны быть однонаправленные. Хотя да, сама MS подает не лучший пример в плане циклических ссылок сборок. А ситуация с разделением mscorlib и System — это из-за связки нескольких технических моментов:
— в дотнете быстрее загрузить одну относительно большую сборку, чем россыпь мелких;
— в то же время, не хочется грузить кучу лишнего функционала, который не всегда нужен, поэтому System вынесен отдельно.

S>3) Работа со слабо-связанными компонентами типа плагинов, или чего-то вроде Enterprise Library, когда части системы узнают друг-друга только в рантайме. Потрясающая гибкость и подменяемость модулей уровня динамических языков, естественно с соответствующими проблемами в рантайме.


Это понятно. Изначально эти IoC-контейнеры для динамики и шли, когда связь компонент происходила через скрипты конфигурации.
Re[33]: [C++] о паттернах (доп.)
От: vdimas Россия  
Дата: 06.06.11 09:41
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Сейчас под IoC подразумевают всегда IoC-контейнер.


Где вы этой травы берете? Поаккуратнее с терминологией надо быть. Называть вещи своими именами.

The Unity Application Block (Unity) is a lightweight, extensible dependency injection container ...

Re[36]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 06.06.11 10:42
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Неверно. Я просил пример, где решение без SL будет лучше. Выходит, что для десятков методов твое решение не подходит. Для тысяч тоже не подходит. А для чего подходит ?

S>Да, для ручного подставления зависимостей в статические методы DI контейнеры не очень подходят. Кто же знал, что у тебя там тысячи статических методов, которым зависимости никак не передать, кроме как врукопашку?

А ты всё еще размещаешь функционал в методах модели ? Тогда мне сложно объяснить, откуда берется много статических методов.

SW>>А какой ты ответ ожидал на вопрос, "Пропертя это не контракт уже?" ? Вот чисто ради интереса, что ты хотел спросить или может сказать своим вопросом ?

S>Я хотел убедиться, действительно ли ты не считаешь свойство контрактом? Думал что возможно ты располагаешь какими-то аргументами кроме любимого "очевидно"? По ответу полагаю что да, не считаешь, и нет, не располагаешь.

Свойство может удовлетворять контракту и при этом оно не является контрактом.

SW>>В современной литературе IoC не встречается отдельно от фреймворка или контейнера.

S>Ну вот, опять ответ за всю современную литературу без единой ссылки.
S>И причем тут современная литература? Т.е. 20 лет с лишним упорно называли IoC-ом что-то одно, а потом пришла современная литература и показала как правильно?
S>Ты, случаем, не препод по совместительству? Кучка "очевидно" + ни одной ссылки как-бы намекают.

За двадцать лет многое изменилось.

S>>>

S>>>some people confuse the general principle here with the specific styles of inversion of control (such as dependency injection) that these containers use.

S>>>Если ты говоришь именно об этих людях, то ты ссылаешься на людей, которые "confuse" по мнению Фаулера.

SW>>Внезапно Фаулер вдруг сказал тоже самое что и я

S>Он сказал то, что ты упорно демонстрируешь.

When these containers talk about how they are so useful because they implement "Inversion of Control" I end up very puzzled. Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.

Re[30]: [C++] о паттернах
От: Sharad-Waador  
Дата: 06.06.11 10:44
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Смысл рассматривать один из внутренних блоков, который всегда приватный? Это интимные вопросы реализации, которые не видны в публичном доступе. Это относится к паттерну State, если мы всё еще о нем, а не о чем-то новом, которое ты не озвучил.


Я рассматриваю State, а не транзишн. В State в классической реализации выходной сигнал зависит только от состояния.
Re[31]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.06.11 11:58
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, vdimas, Вы писали:


V>>Смысл рассматривать один из внутренних блоков, который всегда приватный? Это интимные вопросы реализации, которые не видны в публичном доступе. Это относится к паттерну State, если мы всё еще о нем, а не о чем-то новом, которое ты не озвучил.


SW>Я рассматриваю State, а не транзишн. В State в классической реализации выходной сигнал зависит только от состояния.

А ты заглядывал в классическую реализацию, хотя бы в GoF?
Re[37]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.06.11 12:11
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>Да, для ручного подставления зависимостей в статические методы DI контейнеры не очень подходят. Кто же знал, что у тебя там тысячи статических методов, которым зависимости никак не передать, кроме как врукопашку?


SW>А ты всё еще размещаешь функционал в методах модели ? Тогда мне сложно объяснить, откуда берется много статических методов.

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

S>>Я хотел убедиться, действительно ли ты не считаешь свойство контрактом? Думал что возможно ты располагаешь какими-то аргументами кроме любимого "очевидно"? По ответу полагаю что да, не считаешь, и нет, не располагаешь.


SW>Свойство может удовлетворять контракту и при этом оно не является контрактом.

Если можно обратиться — значит контракт. Возражения?

SW>>>В современной литературе IoC не встречается отдельно от фреймворка или контейнера.

S>>Ну вот, опять ответ за всю современную литературу без единой ссылки.
S>>И причем тут современная литература? Т.е. 20 лет с лишним упорно называли IoC-ом что-то одно, а потом пришла современная литература и показала как правильно?
S>>Ты, случаем, не препод по совместительству? Кучка "очевидно" + ни одной ссылки как-бы намекают.

SW>За двадцать лет многое изменилось.

Т.е. аргументов не будет?

SW>>>Внезапно Фаулер вдруг сказал тоже самое что и я

S>>Он сказал то, что ты упорно демонстрируешь.

SW>

SW>When these containers talk about how they are so useful because they implement "Inversion of Control" I end up very puzzled. Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels.

Прогресс налицо. Появилась хоть какая-то цитата. Одна беда — она она провоцирует еще больше вопросов. А именно:
* Понимаешь ли ты, что именно ты процитировал?
* Если понимаешь, то каким боком это относится хоть к одному твоему тезису?
Если к этому

SW>>>В современной литературе IoC не встречается отдельно от фреймворка или контейнера.

то процитированное несет в себе ортогональную мысль.

Я в замешательстве от попыток связать процитированное тобой с предметом обсуждения.
Re[32]: [C++] о паттернах
От: Sharad-Waador  
Дата: 06.06.11 16:51
Оценка:
Здравствуйте, samius, Вы писали:

V>>>Смысл рассматривать один из внутренних блоков, который всегда приватный? Это интимные вопросы реализации, которые не видны в публичном доступе. Это относится к паттерну State, если мы всё еще о нем, а не о чем-то новом, которое ты не озвучил.


SW>>Я рассматриваю State, а не транзишн. В State в классической реализации выходной сигнал зависит только от состояния.

S>А ты заглядывал в классическую реализацию, хотя бы в GoF?

А ты перестал опохмеляться по утрам ?
Re[38]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 06.06.11 17:12
Оценка:
Здравствуйте, samius, Вы писали:

SW>>А ты всё еще размещаешь функционал в методах модели ? Тогда мне сложно объяснить, откуда берется много статических методов.

S>Тебе будет сложно объяснить, потому как ты упускаешь что кроме методов модели и статических методов, есть еще куча мест, где можно размещать функционал.

Назови несколько примеров, где можно разместить Extension методы.

SW>>Свойство может удовлетворять контракту и при этом оно не является контрактом.

S>Если можно обратиться — значит контракт. Возражения?

С таким подходом всё становится контрактом И я даже не знаю, что в этом случае не будет контрактом.

S>>>И причем тут современная литература? Т.е. 20 лет с лишним упорно называли IoC-ом что-то одно, а потом пришла современная литература и показала как правильно?

S>>>Ты, случаем, не препод по совместительству? Кучка "очевидно" + ни одной ссылки как-бы намекают.

SW>>За двадцать лет многое изменилось.

S>Т.е. аргументов не будет?

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

var dep1 = new Dep1();
var dep2 = new Dep2();
Component c = new Component(dep1,dep2);

c.Method();


С твоей точки зрения здесь уже реализован IoC потому как ты рассматриваешь это исключительно как переход от процедурнго к ОО-подходу и здесь всё как у Фаулера " my car is special because it has wheels". IoC же работает и в ОО-подходе и в функциональном и в любом другом. Если ты посмотришь внимательно, то быстро поймешь, что практически везде вызывающий код можно сделать вызываемым.
Что делает вызывающий код в примере выше ? Разумеется, инициализацию. Стало быть после "инверсии" эта инициализация станет вызываемой. Решений ровно два — push и pull. Pull — получаем сервис локатор. Push — получаем dependency injection. В свою очередь и это можно инвертировать по тому же принципу — вызывающий код становится вызываемым и так можно инвертировать до бесконечности.

S>Прогресс налицо. Появилась хоть какая-то цитата. Одна беда — она она провоцирует еще больше вопросов. А именно:

S>* Понимаешь ли ты, что именно ты процитировал?

Ты прекратил опохмеляться ?

S>* Если понимаешь, то каким боком это относится хоть к одному твоему тезису?


Если прекратил, то почему тебе нужна подзарядка ?

S>то процитированное несет в себе ортогональную мысль.


Фаулер говорит, что из за того, что люди понимают IoC слишком буквально, смысла в этом понятии нет никакого и я с ним полностью согласен. В

S>Я в замешательстве от попыток связать процитированное тобой с предметом обсуждения.


Надеюсь, этих попыток было больше нуля.
Re[33]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.06.11 18:05
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Я рассматриваю State, а не транзишн. В State в классической реализации выходной сигнал зависит только от состояния.

S>>А ты заглядывал в классическую реализацию, хотя бы в GoF?

SW>А ты перестал опохмеляться по утрам ?

Ниужели мой вопрос поставил тебя в то положение, в которое ты хочешь меня поставить своим ответом? Если да, то разбирайся в вопросах до того как делать многозначительные заявления. Если нет — то выразить свое нежелание общаться на эту тему можно было более дипломатично.
Re[39]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.06.11 18:32
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>Тебе будет сложно объяснить, потому как ты упускаешь что кроме методов модели и статических методов, есть еще куча мест, где можно размещать функционал.


SW>Назови несколько примеров, где можно разместить Extension методы.

О, ну конечно! Extension методы ради Extension методов. Нужно было напилить Extension методов что бы мужественно решать проблемы по пропихиванию в них зависимостей в таких количествах.

S>>Если можно обратиться — значит контракт. Возражения?


SW>С таким подходом всё становится контрактом И я даже не знаю, что в этом случае не будет контрактом.

Так ты согласился?

SW>>>За двадцать лет многое изменилось.

S>>Т.е. аргументов не будет?

SW>Нужно смотреть немного шире, чем буквально. Важно понять, что инверсия никакая не инверсия а "инверсия" Классический подход — вызыващий код становится вызываемым.

Именно так и рождаются толкования, когда хочется понять не то, что написано автором, а то что хочется.

SW>
SW>var dep1 = new Dep1();
SW>var dep2 = new Dep2();
SW>Component c = new Component(dep1,dep2);

SW>c.Method();
SW>


SW>С твоей точки зрения здесь уже реализован IoC потому как ты рассматриваешь это исключительно как переход от процедурнго к ОО-подходу и здесь всё как у Фаулера " my car is special because it has wheels".

Неверно. Здесь IoC не потому что ОО, а потому что зависимости приходят извне. Заметь, в STL нет OO, а IoC там вовсю используется.
SW>IoC же работает и в ОО-подходе и в функциональном и в любом другом. Если ты посмотришь внимательно, то быстро поймешь, что практически везде вызывающий код можно сделать вызываемым.
IoC не делает вызывающий код вызываемым.

SW>Что делает вызывающий код в примере выше ? Разумеется, инициализацию. Стало быть после "инверсии" эта инициализация станет вызываемой. Решений ровно два — push и pull. Pull — получаем сервис локатор. Push — получаем dependency injection. В свою очередь и это можно инвертировать по тому же принципу — вызывающий код становится вызываемым и так можно инвертировать до бесконечности.

Фаулер:

In this article I dig into how this pattern works, under the more specific name of "Dependency Injection", and contrast it with the Service Locator alternative. The choice between them is less important than the principle of separating configuration from use.


S>>Прогресс налицо. Появилась хоть какая-то цитата. Одна беда — она она провоцирует еще больше вопросов. А именно:

S>>* Понимаешь ли ты, что именно ты процитировал?

SW>Ты прекратил опохмеляться ?

Вижу тебе так понравилась чья-то выходка, что ты ее решил повторить дважды

S>>* Если понимаешь, то каким боком это относится хоть к одному твоему тезису?


SW>Если прекратил, то почему тебе нужна подзарядка ?


S>>то процитированное несет в себе ортогональную мысль.


SW>Фаулер говорит, что из за того, что люди понимают IoC слишком буквально, смысла в этом понятии нет никакого и я с ним полностью согласен. В


S>>Я в замешательстве от попыток связать процитированное тобой с предметом обсуждения.


SW>Надеюсь, этих попыток было больше нуля.

Ты делаешь все что бы свести их к отрицательному числу.
Re[34]: [C++] о паттернах
От: Sharad-Waador  
Дата: 06.06.11 22:26
Оценка: -1 :)
Здравствуйте, samius, Вы писали:

S>>>А ты заглядывал в классическую реализацию, хотя бы в GoF?


SW>>А ты перестал опохмеляться по утрам ?

S>Ниужели мой вопрос поставил тебя в то положение, в которое ты хочешь меня поставить своим ответом? Если да, то разбирайся в вопросах до того как делать многозначительные заявления. Если нет — то выразить свое нежелание общаться на эту тему можно было более дипломатично.

Краткость — сестра таланта. Тренируйся.
Re[40]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 06.06.11 22:33
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Назови несколько примеров, где можно разместить Extension методы.

S>О, ну конечно! Extension методы ради Extension методов. Нужно было напилить Extension методов что бы мужественно решать проблемы по пропихиванию в них зависимостей в таких количествах.

Это считать ответом ?

SW>>С таким подходом всё становится контрактом И я даже не знаю, что в этом случае не будет контрактом.

S>Так ты согласился?

Свести к абсурду можно любую идею и у тебя это хорошо вышло.

S>Именно так и рождаются толкования, когда хочется понять не то, что написано автором, а то что хочется.


У автора не истина в последней инстанции, а всего лишь мнение. С этого начинается понимание.

SW>>С твоей точки зрения здесь уже реализован IoC потому как ты рассматриваешь это исключительно как переход от процедурнго к ОО-подходу и здесь всё как у Фаулера " my car is special because it has wheels".

S>Неверно. Здесь IoC не потому что ОО, а потому что зависимости приходят извне.

Назови примеры, когда зависимости в ОО приходят не извне

SW>>IoC же работает и в ОО-подходе и в функциональном и в любом другом. Если ты посмотришь внимательно, то быстро поймешь, что практически везде вызывающий код можно сделать вызываемым.

S>IoC не делает вызывающий код вызываемым.

Это большое заблуждение.

S>Фаулер:

S>

S>In this article I dig into how this pattern works, under the more specific name of "Dependency Injection", and contrast it with the Service Locator alternative. The choice between them is less important than the principle of separating configuration from use.


Отделение конфигурции от использования это инверсия, т.к. вызывающий становится вызываемым.

SW>>Ты прекратил опохмеляться ?

S>Вижу тебе так понравилась чья-то выходка, что ты ее решил повторить дважды

Многим людям не нравятся их собственные методы. Ты один из таких.

SW>>Надеюсь, этих попыток было больше нуля.

S>Ты делаешь все что бы свести их к отрицательному числу.

Если это правда, то число этих попыток никогда не было больше нуля.
Re[41]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 06.06.11 23:08
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Назови несколько примеров, где можно разместить Extension методы.

S>>О, ну конечно! Extension методы ради Extension методов. Нужно было напилить Extension методов что бы мужественно решать проблемы по пропихиванию в них зависимостей в таких количествах.

SW>Это считать ответом ?

Считай это частью диагноза

SW>>>С таким подходом всё становится контрактом И я даже не знаю, что в этом случае не будет контрактом.

S>>Так ты согласился?

SW>Свести к абсурду можно любую идею и у тебя это хорошо вышло.


S>>Именно так и рождаются толкования, когда хочется понять не то, что написано автором, а то что хочется.


SW>У автора не истина в последней инстанции, а всего лишь мнение. С этого начинается понимание.

Понимание кончается там, где начинаешь считать абсурдом и мнением то что написал не ты.

SW>>>С твоей точки зрения здесь уже реализован IoC потому как ты рассматриваешь это исключительно как переход от процедурнго к ОО-подходу и здесь всё как у Фаулера " my car is special because it has wheels".

S>>Неверно. Здесь IoC не потому что ОО, а потому что зависимости приходят извне.

SW>Назови примеры, когда зависимости в ОО приходят не извне

public Component()
{
   _dep1 = new Dep1();
}



SW>>>IoC же работает и в ОО-подходе и в функциональном и в любом другом. Если ты посмотришь внимательно, то быстро поймешь, что практически везде вызывающий код можно сделать вызываемым.

S>>IoC не делает вызывающий код вызываемым.

SW>Это большое заблуждение.

Может опровергнешь мое утверждение примером, разнообразия ради?

S>>Фаулер:

S>>

S>>In this article I dig into how this pattern works, under the more specific name of "Dependency Injection", and contrast it with the Service Locator alternative. The choice between them is less important than the principle of separating configuration from use.


SW>Отделение конфигурции от использования это инверсия, т.к. вызывающий становится вызываемым.


SW>>>Ты прекратил опохмеляться ?

S>>Вижу тебе так понравилась чья-то выходка, что ты ее решил повторить дважды

SW>Многим людям не нравятся их собственные методы. Ты один из таких.

Мне не нравятся твои методы.

SW>>>Надеюсь, этих попыток было больше нуля.

S>>Ты делаешь все что бы свести их к отрицательному числу.

SW>Если это правда, то число этих попыток никогда не было больше нуля.

В милое логическое противоречие ты себя поставил этим утверждением.
Re[42]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 07.06.11 09:12
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Это считать ответом ?

S>Считай это частью диагноза

Ты долго с собой боролся

SW>>У автора не истина в последней инстанции, а всего лишь мнение. С этого начинается понимание.

S>Понимание кончается там, где начинаешь считать абсурдом и мнением то что написал не ты.

Здесь все в порядке — абсурдным я считаю только часть написаного тобой в этом топике.

SW>>>>IoC же работает и в ОО-подходе и в функциональном и в любом другом. Если ты посмотришь внимательно, то быстро поймешь, что практически везде вызывающий код можно сделать вызываемым.

S>>>IoC не делает вызывающий код вызываемым.

SW>>Это большое заблуждение.

S>Может опровергнешь мое утверждение примером, разнообразия ради?

Опровергнуть можно только проверяемые, фальсифицируемые утверждения, к которым твоё "IoC не делает вызывающий код вызываемым" никак не относится.

SW>>Многим людям не нравятся их собственные методы. Ты один из таких.

S>Мне не нравятся твои методы.

Еще бы, я ведь просто отфутболиваю тебе твоё же.

SW>>Если это правда, то число этих попыток никогда не было больше нуля.

S>В милое логическое противоречие ты себя поставил этим утверждением.

Здесь нет противоречия
Re[43]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.06.11 10:19
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>У автора не истина в последней инстанции, а всего лишь мнение. С этого начинается понимание.

S>>Понимание кончается там, где начинаешь считать абсурдом и мнением то что написал не ты.

SW>Здесь все в порядке — абсурдным я считаю только часть написаного тобой в этом топике.

Оставлю это твоей проблемой.

SW>>>>>IoC же работает и в ОО-подходе и в функциональном и в любом другом. Если ты посмотришь внимательно, то быстро поймешь, что практически везде вызывающий код можно сделать вызываемым.

S>>>>IoC не делает вызывающий код вызываемым.

SW>>>Это большое заблуждение.

S>>Может опровергнешь мое утверждение примером, разнообразия ради?

SW>Опровергнуть можно только проверяемые, фальсифицируемые утверждения, к которым твоё "IoC не делает вызывающий код вызываемым" никак не относится.

Вот еще одна логическая лужа, в которую ты сел. Ты понял о чем речь, классифицировал это утвреждение как заблуждение, но не смог его фальсифицировать. Это можно было бы сделать тривиально, если бы ты был прав. Достаточно было бы привести IoC, который вызывающий код делает вызываемым.
Судя по твоим словам, ты фальсифицировал нефальсифицируемое.

SW>>>Многим людям не нравятся их собственные методы. Ты один из таких.

S>>Мне не нравятся твои методы.

SW>Еще бы, я ведь просто отфутболиваю тебе твоё же.

Давай разберемся

SW>>Я рассматриваю State, а не транзишн. В State в классической реализации выходной сигнал зависит только от состояния.
S>А ты заглядывал в классическую реализацию, хотя бы в GoF?

А ты перестал опохмеляться по утрам ?

Я спросил тебя, видел ли ты классическую реализацию State. Имею поводы, т.к. во-первых, ты неоднократно ссылался на "современную" литературу и отвергал классику в аспекте IoC. Во-вторых, реализация State в GoF представляет собой типичный автомат Мили, т.к. выходная функция зависит от входного сигнала в том числе. Вот и встал вопрос, какую именно реализацию State ты считаешь классической, и видел ли ты то что в GoF?
Однако, по существу вопроса у тебя ответа не нашлось, что видимо и послужило поводом к демонстрации манер.


SW>>>Если это правда, то число этих попыток никогда не было больше нуля.

S>>В милое логическое противоречие ты себя поставил этим утверждением.

SW>Здесь нет противоречия
Re[44]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 07.06.11 11:40
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Опровергнуть можно только проверяемые, фальсифицируемые утверждения, к которым твоё "IoC не делает вызывающий код вызываемым" никак не относится.

S>Вот еще одна логическая лужа, в которую ты сел. Ты понял о чем речь, классифицировал это утвреждение как заблуждение, но не смог его фальсифицировать.

Я классифицировал это утверждение как нефальсифицируемое.

>Это можно было бы сделать тривиально, если бы ты был прав. Достаточно было бы привести IoC, который вызывающий код делает вызываемым.


Этого недостаточно.

S>Судя по твоим словам, ты фальсифицировал нефальсифицируемое.


Нечего фальсифицировать

S>>А ты заглядывал в классическую реализацию, хотя бы в GoF?

S>Я спросил тебя, видел ли ты классическую реализацию State. Имею поводы, т.к. во-первых, ты неоднократно ссылался на "современную" литературу и отвергал классику в аспекте IoC. Во-вторых, реализация State в GoF представляет собой типичный автомат Мили, т.к. выходная функция зависит от входного сигнала в том числе.

Не зависит от входного сигнала, а исключительно от состояния.
Re[45]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 07.06.11 13:54
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>Я классифицировал это утверждение как нефальсифицируемое.


SW>Нечего фальсифицировать

И тем не менее, это же не я придумал:

SW>Это большое заблуждение.

Если утверждаешь что это заблуждение — опровергай. Если утверждаешь что оно нефальсифицируемое — не называй это заблуждением. Палишься на элементарной логике.

S>>Я спросил тебя, видел ли ты классическую реализацию State. Имею поводы, т.к. во-первых, ты неоднократно ссылался на "современную" литературу и отвергал классику в аспекте IoC. Во-вторых, реализация State в GoF представляет собой типичный автомат Мили, т.к. выходная функция зависит от входного сигнала в том числе.


SW>Не зависит от входного сигнала, а исключительно от состояния.

Следовательно, твоя интерпретация примера GoF передает физическому соединению одинаковую команду на сигналы Close, Open и т.п., принятые в некотором из состояний.
Re[46]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 07.06.11 14:42
Оценка: :)
Здравствуйте, samius, Вы писали:

SW>>Нечего фальсифицировать

S>И тем не менее, это же не я придумал:
S>

SW>>Это большое заблуждение.

S>Если утверждаешь что это заблуждение — опровергай. Если утверждаешь что оно нефальсифицируемое — не называй это заблуждением. Палишься на элементарной логике.

Нефальсифицируемое -> заблуждение. Это и есть элементарная логика. Ты пойми, никто не опровергает теорию "зелёных невидимых гномиков"

SW>>Не зависит от входного сигнала, а исключительно от состояния.

S>Следовательно, твоя интерпретация примера GoF передает физическому соединению одинаковую команду на сигналы Close, Open и т.п., принятые в некотором из состояний.
S>

Ты попутал функцию и результат этой функции и меня это не удивляет.
Re[31]: [C++] о паттернах
От: vdimas Россия  
Дата: 07.06.11 19:48
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

V>>Смысл рассматривать один из внутренних блоков, который всегда приватный? Это интимные вопросы реализации, которые не видны в публичном доступе. Это относится к паттерну State, если мы всё еще о нем, а не о чем-то новом, которое ты не озвучил.


SW>Я рассматриваю State, а не транзишн. В State в классической реализации выходной сигнал зависит только от состояния.


Где это ты видел в паттерне "выходные сигналы"?
Хорошо смотрел? В "State в классической реализации" от состояния зависит поведение, но это же есть классическое определение автомата Мили.
Re[32]: [C++] о паттернах
От: Sharad-Waador  
Дата: 08.06.11 04:31
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Где это ты видел в паттерне "выходные сигналы"?

V>Хорошо смотрел? В "State в классической реализации" от состояния зависит поведение, но это же есть классическое определение автомата Мили.

А в автомате мура поведение не зависит от состояния ?
Re[33]: [C++] о паттернах
От: vdimas Россия  
Дата: 08.06.11 06:50
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>А в автомате мура поведение не зависит от состояния ?


Самое время определиться, что есть "поведение".
Re[47]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 11:37
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>И тем не менее, это же не я придумал:

S>>

SW>>>Это большое заблуждение.

S>>Если утверждаешь что это заблуждение — опровергай. Если утверждаешь что оно нефальсифицируемое — не называй это заблуждением. Палишься на элементарной логике.

SW>Нефальсифицируемое -> заблуждение. Это и есть элементарная логика. Ты пойми, никто не опровергает теорию "зелёных невидимых гномиков"

Логика железная Согласно ей, твоя классификация моего утверждения — тоже заблуждение.

SW>>>Не зависит от входного сигнала, а исключительно от состояния.

S>>Следовательно, твоя интерпретация примера GoF передает физическому соединению одинаковую команду на сигналы Close, Open и т.п., принятые в некотором из состояний.
S>>

SW>Ты попутал функцию и результат этой функции и меня это не удивляет.

Ну-ка, подробнее! У тебя функция не зависит от сигнала, а ее результат зависит? Или у тебя результат — это функция, полученная частичным применением? Теоретики автоматостроения просто прифигели бы от такого сведения Мили к Муру.
Re[34]: [C++] о паттернах
От: Sharad-Waador  
Дата: 08.06.11 12:14
Оценка:
Здравствуйте, vdimas, Вы писали:

SW>>А в автомате мура поведение не зависит от состояния ?


V>Самое время определиться, что есть "поведение".


Определяйся, я ж только за.
Re[48]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 08.06.11 12:20
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Нефальсифицируемое -> заблуждение. Это и есть элементарная логика. Ты пойми, никто не опровергает теорию "зелёных невидимых гномиков"

S>Логика железная Согласно ей, твоя классификация моего утверждения — тоже заблуждение.

Ни в коем случае.

SW>>Ты попутал функцию и результат этой функции и меня это не удивляет.

S>Ну-ка, подробнее! У тебя функция не зависит от сигнала, а ее результат зависит? Или у тебя результат — это функция, полученная частичным применением? Теоретики автоматостроения просто прифигели бы от такого сведения Мили к Муру.

Смотри внимательно:
Close() { return ctx.Connection.Close(); }
Close() { throw new exception(); }

Выходной сигнал — Close, он изменяется в зависимости от состояния.
Re[49]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 12:24
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Нефальсифицируемое -> заблуждение. Это и есть элементарная логика. Ты пойми, никто не опровергает теорию "зелёных невидимых гномиков"

S>>Логика железная Согласно ей, твоя классификация моего утверждения — тоже заблуждение.

SW>Ни в коем случае.

Если так, то доказывай его.

S>>Ну-ка, подробнее! У тебя функция не зависит от сигнала, а ее результат зависит? Или у тебя результат — это функция, полученная частичным применением? Теоретики автоматостроения просто прифигели бы от такого сведения Мили к Муру.


SW>Смотри внимательно:

SW>Close() { return ctx.Connection.Close(); }
SW>Close() { throw new exception(); }

SW>Выходной сигнал — Close, он изменяется в зависимости от состояния.

Только речь о сигналах, а не о состояниях. Проспись.
Re[50]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 08.06.11 16:58
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Ни в коем случае.

S>Если так, то доказывай его.

"IoC не делает вызывающий код вызываемым". Самый простой способ — IoC вообще ничего не может делать, потому что это принцип, а не живое существо Отсюда ты сам догадаешься, что же за высказывание ты родил.

S>>>Ну-ка, подробнее! У тебя функция не зависит от сигнала, а ее результат зависит? Или у тебя результат — это функция, полученная частичным применением? Теоретики автоматостроения просто прифигели бы от такого сведения Мили к Муру.


SW>>Смотри внимательно:

SW>>Close() { return ctx.Connection.Close(); }
SW>>Close() { throw new exception(); }

SW>>Выходной сигнал — Close, он изменяется в зависимости от состояния.

S>Только речь о сигналах, а не о состояниях. Проспись.

"Выходной сигнал — Close..." И кому нужно проспаться ?
Re[51]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 17:06
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Ни в коем случае.

S>>Если так, то доказывай его.

SW>"IoC не делает вызывающий код вызываемым". Самый простой способ — IoC вообще ничего не может делать, потому что это принцип, а не живое существо Отсюда ты сам догадаешься, что же за высказывание ты родил.

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

S>>>>Ну-ка, подробнее! У тебя функция не зависит от сигнала, а ее результат зависит? Или у тебя результат — это функция, полученная частичным применением? Теоретики автоматостроения просто прифигели бы от такого сведения Мили к Муру.


SW>>>Выходной сигнал — Close, он изменяется в зависимости от состояния.

S>>Только речь о сигналах, а не о состояниях. Проспись.

SW>"Выходной сигнал — Close..." И кому нужно проспаться ?

Тебе. Ты же утверждаешь, что выходной сигнал зависит только от состояния, следовательно не зависит от входного. По твоей логике реакцией на входной сигнал Open будет тоже Close.
Re[52]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 08.06.11 18:30
Оценка:
Здравствуйте, samius, Вы писали:

SW>>"IoC не делает вызывающий код вызываемым". Самый простой способ — IoC вообще ничего не может делать, потому что это принцип, а не живое существо Отсюда ты сам догадаешься, что же за высказывание ты родил.

S>Подтверждением моего высказывания ты доказываешь верность предположения что это заблуждение?

И где ты увидел подтверждение ? Покажи, может я чего пропустил.

SW>>>>Выходной сигнал — Close, он изменяется в зависимости от состояния.

S>>>Только речь о сигналах, а не о состояниях. Проспись.

SW>>"Выходной сигнал — Close..." И кому нужно проспаться ?

S>Тебе. Ты же утверждаешь, что выходной сигнал зависит только от состояния, следовательно не зависит от входного. По твоей логике реакцией на входной сигнал Open будет тоже Close.

Это твоя логика, а не моя и похоже, с тобой вообще не о чем говорить, т.к. про автоматы Мура ты только слышал. При получении сигнала Open реакцией будет смена состояния, а не выходной сигнал Close !!!
Кроме того, выходной сигнал это не один Close(или Open,Send), а конкретный набор Close,Open,Send и набор появляется не как попало, а в конкретном состоянии.
Разницу чувствуешь между своей и моей логикой ?
В двоичном автомате Close может быть двух уровней — 0 и 1. В нашем случае этих "уровней" может быть сколько угодно.
Последняя разница — в конкретной реализации State входные сигналы могут быть совмещены с выходными.
То есть,
в состоянии открыто
Open даёт исключение,
Close закрывает и переключает состояние на закрыто,
Send отсылает
в состоянии закрыто
Open открывает и переключает в состояние открыто,
Close дает исключение,
Send дает исключение
— классика Мили с учетом особенности State.
Всё, ликбез окончен и считай это твоим точным диагнозом.
Re[53]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 18:54
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>"IoC не делает вызывающий код вызываемым". Самый простой способ — IoC вообще ничего не может делать, потому что это принцип, а не живое существо Отсюда ты сам догадаешься, что же за высказывание ты родил.

S>>Подтверждением моего высказывания ты доказываешь верность предположения что это заблуждение?

SW>И где ты увидел подтверждение ? Покажи, может я чего пропустил.

Выделил. Вообще ничего не может — это более широкое утверждение чем то что "IoC не делает нечто".

SW>>>"Выходной сигнал — Close..." И кому нужно проспаться ?

S>>Тебе. Ты же утверждаешь, что выходной сигнал зависит только от состояния, следовательно не зависит от входного. По твоей логике реакцией на входной сигнал Open будет тоже Close.

SW>Это твоя логика, а не моя и похоже, с тобой вообще не о чем говорить, т.к. про автоматы Мура ты только слышал. При получении сигнала Open реакцией будет смена состояния, а не выходной сигнал Close !!!

Ты же утверждал что реакция будет зависеть от состояния? Это ведь не я утверждал.

SW>Кроме того, выходной сигнал это не один Close(или Open,Send), а конкретный набор Close,Open,Send и набор появляется не как попало, а в конкретном состоянии.

Вижу что про автоматы ты только слышал.

SW>Разницу чувствуешь между своей и моей логикой ?

Прости, между моей логикой и чем? Я ошибался, считая что она у тебя есть.

SW>В двоичном автомате Close может быть двух уровней — 0 и 1. В нашем случае этих "уровней" может быть сколько угодно.

В вашем с кем случаем?

SW>Последняя разница — в конкретной реализации State входные сигналы могут быть совмещены с выходными.

SW>То есть,
SW>в состоянии открыто
SW> Open даёт исключение,
SW> Close закрывает и переключает состояние на закрыто,
SW> Send отсылает
SW>в состоянии закрыто
SW> Open открывает и переключает в состояние открыто,
SW> Close дает исключение,
SW> Send дает исключение
SW>- классика Мили с учетом особенности State.
Сравни это с этим твоим утверждением.
http://www.rsdn.ru/forum/philosophy/4300593.1.aspx
Автор: Sharad-Waador
Дата: 06.06.11


SW>Всё, ликбез окончен и считай это твоим точным диагнозом.

Твой диагноз — раздвоение личности. Которая из них дает мне диагнозы — мне даже не интересно.
Re[54]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 08.06.11 20:58
Оценка:
Здравствуйте, samius, Вы писали:

SW>>>>"IoC не делает вызывающий код вызываемым". Самый простой способ — IoC вообще ничего не может делать, потому что это принцип, а не живое существо Отсюда ты сам догадаешься, что же за высказывание ты родил.

S>>>Подтверждением моего высказывания ты доказываешь верность предположения что это заблуждение?

SW>>И где ты увидел подтверждение ? Покажи, может я чего пропустил.

S>Выделил. Вообще ничего не может — это более широкое утверждение чем то что "IoC не делает нечто".

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

SW>>Последняя разница — в конкретной реализации State входные сигналы могут быть совмещены с выходными.

SW>>То есть,
SW>>в состоянии открыто
SW>> Open даёт исключение,
SW>> Close закрывает и переключает состояние на закрыто,
SW>> Send отсылает
SW>>в состоянии закрыто
SW>> Open открывает и переключает в состояние открыто,
SW>> Close дает исключение,
SW>> Send дает исключение
SW>>- классика Мили с учетом особенности State.
S>Сравни это с этим твоим утверждением.
S>http://www.rsdn.ru/forum/philosophy/4300593.1.aspx
Автор: Sharad-Waador
Дата: 06.06.11


я ошибся "классика Мура" а не Мили, т.к. речь про Муа. По ссылке :"В State в классической реализации выходной сигнал зависит только от состояния."
С этим сообщением все в порядке — каждый из выходных сигналов зависит только от состояния и ничего больше. Если состояние открыто, то сигнал Close всегда будет функцией закрытия, сигнал Open всегда будет функцией которая бросает исключение и тд. И ни от чего более эти сигналы не зависят — ни от чего, кроме как от состояния.

P.S. Похоже ты и вправду не понимаешь, что такое автомат Мура. Если тебе понятно написаное здесь, считай что ты понял автомат Мура. Это снова диагноз.
Re[54]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 08.06.11 21:04
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Это твоя логика, а не моя и похоже, с тобой вообще не о чем говорить, т.к. про автоматы Мура ты только слышал. При получении сигнала Open реакцией будет смена состояния, а не выходной сигнал Close !!!

S>Ты же утверждал что реакция будет зависеть от состояния? Это ведь не я утверждал.

Не нужно передёргивать. "По твоей логике реакцией на входной сигнал Open будет тоже Close" это твои слова и я этого не говорил.

P.S. Можно закругляться, поскольку очевидно, что ты начал спорить со своими передёргиваниями.
Re[55]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 22:15
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>Ты использовал пустое по смыслу сообщение как аргумент да еще хватило наглости заявлять что оно фальсифицируемо

Я его использовал в ответ на твое пустое, да еще и не имеющее отношеие к IoC.

SW>>>Последняя разница — в конкретной реализации State входные сигналы могут быть совмещены с выходными.

SW>>>То есть,
SW>>>в состоянии открыто
SW>>> Open даёт исключение,
SW>>> Close закрывает и переключает состояние на закрыто,
SW>>> Send отсылает
SW>>>в состоянии закрыто
SW>>> Open открывает и переключает в состояние открыто,
SW>>> Close дает исключение,
SW>>> Send дает исключение
SW>>>- классика Мили с учетом особенности State.

SW>я ошибся "классика Мура" а не Мили, т.к. речь про Муа.

Ты еще и в этом ошибся, а я не заметил.
SW>По ссылке :"В State в классической реализации выходной сигнал зависит только от состояния."
SW>С этим сообщением все в порядке — каждый из выходных сигналов зависит только от состояния и ничего больше. Если состояние открыто, то сигнал Close всегда будет функцией закрытия, сигнал Open всегда будет функцией которая бросает исключение и тд. И ни от чего более эти сигналы не зависят — ни от чего, кроме как от состояния.
А теперь совсем для детского сада: я выделил выходные сигналы курсивом, а то от чего они зависят — жирным.

SW>P.S. Похоже ты и вправду не понимаешь, что такое автомат Мура. Если тебе понятно написаное здесь, считай что ты понял автомат Мура. Это снова диагноз.

Симптомы в карточку: пациент описывает автомат Мили и утверждает что это автомат Мура. Ставит диагнозы.
Re[55]: [C++] о паттернах (доп.)
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 22:15
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Это твоя логика, а не моя и похоже, с тобой вообще не о чем говорить, т.к. про автоматы Мура ты только слышал. При получении сигнала Open реакцией будет смена состояния, а не выходной сигнал Close !!!

S>>Ты же утверждал что реакция будет зависеть от состояния? Это ведь не я утверждал.

SW>Не нужно передёргивать. "По твоей логике реакцией на входной сигнал Open будет тоже Close" это твои слова и я этого не говорил.

Сказанное мной является следствием из твоего отрицания зависимости выхода от чего либо, кроме состояния. И не является истиной.

SW>P.S. Можно закругляться, поскольку очевидно, что ты начал спорить со своими передёргиваниями.

Очевидно, что понятия 'импликация' и 'логика высказываний' тебе чужды.
Re[35]: [C++] о паттернах
От: vdimas Россия  
Дата: 08.06.11 22:29
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

SW>Определяйся, я ж только за.


Да просто не с той стороны зашли. Попробуй еще раз. Только надо держать в памяти, что всегда есть однозначное взаимное преобразование модели Мили в Мура и наоборот. Эквивалентные автоматы Мили и Мура со стороны наблюдателя ведут себя одинаково. Разница только в способе исполнения внутри. Т.е. состояние тут вторично, суть подробность реализации. Автомат отличается от обычного функционального преобразователя лишь тем, что его ф-ия зависит не только от входного сигнала, но и от истории предыдущих входных сигналов... Но!!! Особенностью Мили является то, что в его классическом абстрактном представлении, сигнал на выходе появляется лишь когда есть сигнал на входе. Это логично для функционального преобразователя (наоборот, автомат Мура всегда "помнит" текущий выходной сигнал, это как бы побочный эффект). Это единственное важное отличие имеющее отношение к обсуждаемому. Двигаемся далее. В ООП аналог сигнала — это вызовы методов. Абстрактные методы State — это способы подать сигнал на автомат, т.е. его входной алфавит. Происходящая полезная логика внутри, т.е. вызовы других полезных методов других объектов — всё это можно принять как выходные сигналы нашего автомата. Мне представляется, что в этой схеме выходные сигналы появляются в те моменты, когда есть входные. Не? Более того, даже не меняя текущего состояния State, разные входные сигналы в общем случае генерят разные выходные сигналы. Такая подробность реализации и есть классическая автоматная модель. Т.е. та которая Мили. Ибо Мура — это упрощенная модель от исходной, со своими недостатками, например, в общем случае на X входных сигналов и Y состояний Мили, после преобразования можем получить X*Y состояний Мура.

Поэтому, если делаем Мура и видим, что у нас много входных сигналов и и очень ветвистый граф переходов по ним (т.е. много уникальных вычислений выходного сигнала), стоит подумать о Мили. И паттерне State как программной реализации.
Re[36]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 08.06.11 23:59
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Sharad-Waador, Вы писали:


SW>>Определяйся, я ж только за.


V>Особенностью Мили является то, что в его классическом абстрактном представлении, сигнал на выходе появляется лишь когда есть сигнал на входе. Это логично для функционального преобразователя (наоборот, автомат Мура всегда "помнит" текущий выходной сигнал, это как бы побочный эффект). Это единственное важное отличие имеющее отношение к обсуждаемому.

Можно сформулировать иначе: у Мили выходной сигнал приписывается к переходу (возможно к петле), а у Мура к вершине(состоянию).

V>Поэтому, если делаем Мура и видим, что у нас много входных сигналов и и очень ветвистый граф переходов по ним (т.е. много уникальных вычислений выходного сигнала), стоит подумать о Мили. И паттерне State как программной реализации.

Можно поднять вопрос, что именно считать классической реализацией State?
а) Мур
Если мы хотим получить Send на выходе, у нас должно быть спецсостояние, помнящее выходной сигнал Send.
б) Мили
Выходной сигнал Send получается при проходе по ребру 'Send', которое ведет из состояние Open в него же.
В GoF реализован именно Мили по следующим признакам
* нет состояния для выходного сигнала Send.
* выходные сигналы Close и Send могут быть получены при получении соответствующих сигналов на входе, находясь в состоянии Open.
* выходные сигналы подаются из методов входящих сигналов. Например, в моей русской книге есть такой фрагмент кода:
void TCPClosed::ActiveOpern (TCPConnection* t) {
   // послать SYN, получить SYN, ACK и т.д.

   ChangeState(t, TCPEstablished::Instance());
}

По всей видимости комментарий отвечает за полезный выходной сигнал.

Считать ли GoF классикой? Склоняюсь к тому что да.
Видел ли кто-либо реализацию State на автомате Мура в книгах? Не исключаю, хотя сам лично не видел.
Re[37]: [C++] о паттернах
От: vdimas Россия  
Дата: 09.06.11 01:29
Оценка:
Здравствуйте, samius, Вы писали:

V>>Особенностью Мили является то, что в его классическом абстрактном представлении, сигнал на выходе появляется лишь когда есть сигнал на входе. Это логично для функционального преобразователя (наоборот, автомат Мура всегда "помнит" текущий выходной сигнал, это как бы побочный эффект). Это единственное важное отличие имеющее отношение к обсуждаемому.

S>Можно сформулировать иначе: у Мили выходной сигнал приписывается к переходу (возможно к петле), а у Мура к вершине(состоянию).

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

S>Можно поднять вопрос, что именно считать классической реализацией State?

S>а) Мур
S>Если мы хотим получить Send на выходе, у нас должно быть спецсостояние, помнящее выходной сигнал Send.
S>б) Мили
S>Выходной сигнал Send получается при проходе по ребру 'Send', которое ведет из состояние Open в него же.

Паттерн удачно обходит эти подробности, сосредотачиваясь на собственно трюке диспетчеризации входа через vtable. Паттерн избавляет от вложенных switch/case.

В реальном коде вряд ли строго выделяют входные и выходные сигналы. И это иногда ведет к проблемам, например к сложности тестирования. Что делать я уже писал чуть выше — это вводить сурогатные сигналы, по которым работает внешняя схема, устанавливающая конкретный экземляр State. Эта внешняя схема может быть выполнена как угодно. Например как автомат Мура. Или опять как Мили. Главное, что логику смены состояний можно отладить без воссоздания сложного окружения, которое дергается "полезными" сигналами.

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

S>В GoF реализован именно Мили по следующим признакам


ИМХО, там просто дан иллюстративный пример, чтобы читатель понял, в чем суть трюка.

S>
S>void TCPClosed::ActiveOpern (TCPConnection* t) {
S>   // послать SYN, получить SYN, ACK и т.д.

S>   ChangeState(t, TCPEstablished::Instance());
S>}
S>

S>По всей видимости комментарий отвечает за полезный выходной сигнал.

Да, за полезный. У нас же пара выходных значений: это полезный сигнал + код следующего состояния. Но сам пример — образец того, как не надо делать в сложных случаях. Лучше не менять состояние самому, а сгенерировать некое событие Established. А текущий State пусть меняет некий внешний автомат. Это удобнее, потому как в сложных случаях довольно много получается идентичных State, отличающихся только кодом, отвечающим за переход в следующее состояние. Или даже вообще никакого полезного кода кроме перехода в следующее состояние. Брр... Такая схема гораздо неудобнее табличной, бо слишком много буков из-за ерунды. Вот для сравнения в табличном виде: http://www.rsdn.ru/forum/flame.comp/4134557.1.aspx
Автор: vdimas
Дата: 28.01.11
На шарпе тоже похожим образом переопределял операторы и тоже не хуже декларативность выходила.

Я бы декомпозировал схему на две части: это генерящую полезный сигнал (именно это мне почему-то и подразумевается под "поведением") и осуществляющую переходы по состояниям. Я уже замечал, что разным состояниям может соответствовать одинаковое полезное поведение. Зачем дублировать полезную логику и засорять ее подробностями перехода из состояние в состояние?

Т.е. еще раз русским языком. В телах State удобно вычислять только полезный сигнал. Часть этого полезного сигнала может быть предназначена для схемы, управляющей самим паттерном State.

S>Считать ли GoF классикой? Склоняюсь к тому что да.

S>Видел ли кто-либо реализацию State на автомате Мура в книгах? Не исключаю, хотя сам лично не видел.

Дык, если в рассмотрении оставить только вычисление следующего State, то в примерах GoF — это автомат Мура.
Там пример неудачный, замыливает цимус паттерна. Нужно было просто нарисовать что-нить простое из 3-х состояний и 3-х выходов на switsh/case или ифах, и рядом для сравнения на State.
Re[56]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 09.06.11 09:36
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Не нужно передёргивать. "По твоей логике реакцией на входной сигнал Open будет тоже Close" это твои слова и я этого не говорил.

S>Сказанное мной является следствием из твоего отрицания зависимости выхода от чего либо, кроме состояния. И не является истиной.

Сказаное является твоим передёргиванием.

SW>>P.S. Можно закругляться, поскольку очевидно, что ты начал спорить со своими передёргиваниями.

S>Очевидно, что понятия 'импликация' и 'логика высказываний' тебе чужды.

Поменьше передёргивай и всё будет в порядке.
Re[38]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 09:36
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


S>>Можно сформулировать иначе: у Мили выходной сигнал приписывается к переходу (возможно к петле), а у Мура к вершине(состоянию).


V>Можно, но это формулировка с обратной стороны, со стороны подробностей реализации. Со стороны же постановки задачи, автомат — это ф-ия, значение выхода которой зависит от входного значения и от истории предыдущих входных значений.

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

S>>Можно поднять вопрос, что именно считать классической реализацией State?

S>>а) Мур
S>>Если мы хотим получить Send на выходе, у нас должно быть спецсостояние, помнящее выходной сигнал Send.
S>>б) Мили
S>>Выходной сигнал Send получается при проходе по ребру 'Send', которое ведет из состояние Open в него же.

V>Паттерн удачно обходит эти подробности, сосредотачиваясь на собственно трюке диспетчеризации входа через vtable. Паттерн избавляет от вложенных switch/case.

Эти особенности вне паттерна. Если представить некоторую black box реализацию (неважно, диспетчеризация ли через vtable, табличная, или на switch-ах) с событиями StateChanged(s) и Transited(e), то то, на какие события мы подпишемся, и будет определять модель автомата.

V>В реальном коде вряд ли строго выделяют входные и выходные сигналы. И это иногда ведет к проблемам, например к сложности тестирования. Что делать я уже писал чуть выше — это вводить сурогатные сигналы, по которым работает внешняя схема, устанавливающая конкретный экземляр State. Эта внешняя схема может быть выполнена как угодно. Например как автомат Мура. Или опять как Мили. Главное, что логику смены состояний можно отладить без воссоздания сложного окружения, которое дергается "полезными" сигналами.

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

V>На самом деле это абсолютно нормально декомпозировать сложное пространство состояний некоего автомата на совокупность более простых, суть на более простые автоматы.

да

S>>В GoF реализован именно Мили по следующим признакам


V>ИМХО, там просто дан иллюстративный пример, чтобы читатель понял, в чем суть трюка.

да

S>>По всей видимости комментарий отвечает за полезный выходной сигнал.


V>Да, за полезный. У нас же пара выходных значений: это полезный сигнал + код следующего состояния.

Код следующего состояния является полезным только как внутреннее знание автомата. Полезным же выходом является либо в случае Мили, либо в случае Мура.
V>Но сам пример — образец того, как не надо делать в сложных случаях. Лучше не менять состояние самому, а сгенерировать некое событие Established. А текущий State пусть меняет некий внешний автомат. Это удобнее, потому как в сложных случаях довольно много получается идентичных State, отличающихся только кодом, отвечающим за переход в следующее состояние. Или даже вообще никакого полезного кода кроме перехода в следующее состояние. Брр... Такая схема гораздо неудобнее табличной, бо слишком много буков из-за ерунды. Вот для сравнения в табличном виде: http://www.rsdn.ru/forum/flame.comp/4134557.1.aspx
Автор: vdimas
Дата: 28.01.11
На шарпе тоже похожим образом переопределял операторы и тоже не хуже декларативность выходила.

Вижу что callback-и привязаны к состояниям, т.е. это Мур.
Я тоже ушел от State паттерна к табличным автоматам. Только мой код позволял юзать смешанные модели (генерить события по смене состояния и по переходу). Получалось менее лаконично, чем у тебя, но позволял добавлять подписчиков на события вне описания логики переходов. Смешанные модели не очень практичны в том смысле, что в них легко запутаться. Но довольно удобно иметь один фреймворк и для тех и для других моделей.
Представь вместо:
ServerState 
    init        = { onInit,       { success>wait_hello, other>closed } },
    wait_hello  = { NULL,         { hello>hello_reply, other>closing } },

Следующее:
ServerState 
    init        = { onInit,  { make_transition(success, wait_hello, onInitSuccess), other>closed } },
    wait_hello  = { NULL,    { make_transition(hello, hello_reply, onWaitHelloHello), other>closing } },

Может можно изящнее, но суть в том что можно привязать полезный сигнал к переходу, а можно не вязать.

V>Я бы декомпозировал схему на две части: это генерящую полезный сигнал (именно это мне почему-то и подразумевается под "поведением") и осуществляющую переходы по состояниям. Я уже замечал, что разным состояниям может соответствовать одинаковое полезное поведение. Зачем дублировать полезную логику и засорять ее подробностями перехода из состояние в состояние?


V>Т.е. еще раз русским языком. В телах State удобно вычислять только полезный сигнал. Часть этого полезного сигнала может быть предназначена для схемы, управляющей самим паттерном State.

Согласен. Полезный сигнал часто удобно повесить сверху на события. Но иногда — нет. Предположим что сигнал Send имеет параметры, которые нужно передать вместе с выходным сигналом. Вариантов масса — можно навернуть иерархию наследования для сигналов (c ADT конечно проще), но изящнее будет добавить к методу Send параметр, который в теле будет перенаправлен на выход.

S>>Считать ли GoF классикой? Склоняюсь к тому что да.

S>>Видел ли кто-либо реализацию State на автомате Мура в книгах? Не исключаю, хотя сам лично не видел.

V>Дык, если в рассмотрении оставить только вычисление следующего State, то в примерах GoF — это автомат Мура.

Т.е. если оставить закомментированную часть закомментированной Ну дак а какая будет с него польза, если на физическое соединение не пойдет сигнал?
V>Там пример неудачный, замыливает цимус паттерна. Нужно было просто нарисовать что-нить простое из 3-х состояний и 3-х выходов на switsh/case или ифах, и рядом для сравнения на State.
Тогда бы они получили обвинение в том что паттерн хорош только для <= 3х состояний. А это, ИМХО, действительно так.
Re[56]: [C++] о паттернах (доп.)
От: Sharad-Waador  
Дата: 09.06.11 09:40
Оценка:
Здравствуйте, samius, Вы писали:

SW>>По ссылке :"В State в классической реализации выходной сигнал зависит только от состояния."

SW>>С этим сообщением все в порядке — каждый из выходных сигналов зависит только от состояния и ничего больше. Если состояние открыто, то сигнал Close всегда будет функцией закрытия, сигнал Open всегда будет функцией которая бросает исключение и тд. И ни от чего более эти сигналы не зависят — ни от чего, кроме как от состояния.
S>А теперь совсем для детского сада: я выделил выходные сигналы курсивом, а то от чего они зависят — жирным.

Ты снова передёргиваешь. Я понятно указал, где какие сигналы : "...то сигнал Close всегда будет функцией закрытия".

SW>>P.S. Похоже ты и вправду не понимаешь, что такое автомат Мура. Если тебе понятно написаное здесь, считай что ты понял автомат Мура. Это снова диагноз.

S>Симптомы в карточку: пациент описывает автомат Мили и утверждает что это автомат Мура. Ставит диагнозы.

Я описал автомат Мура и промахнулся в одном месте когда написал "мили". Именно в автомате Мура выходные сигналы зависят только от состояния и больше ни от чего.
Re[37]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 09:46
Оценка:
Здравствуйте, samius, Вы писали:

V>>Особенностью Мили является то, что в его классическом абстрактном представлении, сигнал на выходе появляется лишь когда есть сигнал на входе. Это логично для функционального преобразователя (наоборот, автомат Мура всегда "помнит" текущий выходной сигнал, это как бы побочный эффект). Это единственное важное отличие имеющее отношение к обсуждаемому.

S>Можно сформулировать иначе: у Мили выходной сигнал приписывается к переходу (возможно к петле), а у Мура к вершине(состоянию).

Вот, начинаешь понимать. Как только поймешь, что один из выходных сигналов это функция, тебе сразу станет ясно, что к чему.

S>
S>void TCPClosed::ActiveOpern (TCPConnection* t) {
S>   // послать SYN, получить SYN, ACK и т.д.

S>   ChangeState(t, TCPEstablished::Instance());
S>}
S>

S>По всей видимости комментарий отвечает за полезный выходной сигнал.

Ты сам то думай — в состоянии TCPClosed Open всегда будет "послать SYN, получить SYN, ACK и т.д". И никогда ни при каком условии Open не станет Close или чем то другим.
Re[36]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 09:52
Оценка: -1
Здравствуйте, vdimas, Вы писали:

V>Особенностью Мили является то, что в его классическом абстрактном представлении, сигнал на выходе появляется лишь когда есть сигнал на входе. Это логично для функционального преобразователя (наоборот, автомат Мура всегда "помнит" текущий выходной сигнал, это как бы побочный эффект). Это единственное важное отличие имеющее отношение к обсуждаемому. Двигаемся далее. В ООП аналог сигнала — это вызовы методов.


Входной сигнал — это вызов метода и его параметры. Выходной — это сам метод. То есть, для кодирования выходных сигналов используется не 0 и 1, а n-бит — сам метод. Количество разных Close может быть сколько угодно, это можно рассматривать как разные уровни, не 0 и 1, а "throw ...", "performCloseInternal()" и так далее.
Re[38]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 09:53
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


V>>>Особенностью Мили является то, что в его классическом абстрактном представлении, сигнал на выходе появляется лишь когда есть сигнал на входе. Это логично для функционального преобразователя (наоборот, автомат Мура всегда "помнит" текущий выходной сигнал, это как бы побочный эффект). Это единственное важное отличие имеющее отношение к обсуждаемому.

S>>Можно сформулировать иначе: у Мили выходной сигнал приписывается к переходу (возможно к петле), а у Мура к вершине(состоянию).

SW>Вот, начинаешь понимать. Как только поймешь, что один из выходных сигналов это функция, тебе сразу станет ясно, что к чему.

Я даже не понял что ты написал.

SW>Ты сам то думай — в состоянии TCPClosed Open всегда будет "послать SYN, получить SYN, ACK и т.д". И никогда ни при каком условии Open не станет Close или чем

то другим.
В состоянии TCPClosed Open всегда будет посылать "SYN и т.п."
В состоянии TCPClosed Send всегда будет посылать throw

Ты не видишь зависимость выхода от входного сигнала? На всякий случай, я вижу такую зависимость.
Re[38]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 09:55
Оценка: -1
Здравствуйте, vdimas, Вы писали:

V>Да, за полезный. У нас же пара выходных значений: это полезный сигнал + код следующего состояния. Но сам пример — образец того, как не надо делать в сложных случаях. Лучше не менять состояние самому, а сгенерировать некое событие Established. А текущий State пусть меняет некий внешний автомат.


Вот тогда и получится автомат Мили.

V>Т.е. еще раз русским языком. В телах State удобно вычислять только полезный сигнал.


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

V>Дык, если в рассмотрении оставить только вычисление следующего State, то в примерах GoF — это автомат Мура.


Samius: "И ты, Брут !"
Re[39]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 10:02
Оценка: +1
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, vdimas, Вы писали:



V>>Дык, если в рассмотрении оставить только вычисление следующего State, то в примерах GoF — это автомат Мура.


SW>Samius: "И ты, Брут !"

Ты еще и за меня будешь тезисы вставлять? Если ты еще не понял, то твоя позиция относительно Мура противостоит тому, о чем пишет vdimas. Если убрать выходной сигнал, то различий между моделями не будет.
Re[39]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 10:13
Оценка: -1
Здравствуйте, samius, Вы писали:

SW>>Ты сам то думай — в состоянии TCPClosed Open всегда будет "послать SYN, получить SYN, ACK и т.д". И никогда ни при каком условии Open не станет Close или чем

S>то другим.
S>В состоянии TCPClosed Open всегда будет посылать "SYN и т.п."
S>В состоянии TCPClosed Send всегда будет посылать throw

S>Ты не видишь зависимость выхода от входного сигнала? На всякий случай, я вижу такую зависимость.


Выход автомата это не "посылать throw", а конкретный набор Open, Close, Send. Они не зависят от входа, а только от состояния.
Re[40]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 10:15
Оценка:
Здравствуйте, samius, Вы писали:

V>>>Дык, если в рассмотрении оставить только вычисление следующего State, то в примерах GoF — это автомат Мура.


SW>>Samius: "И ты, Брут !"

S>Ты еще и за меня будешь тезисы вставлять? Если ты еще не понял, то твоя позиция относительно Мура противостоит тому, о чем пишет vdimas. Если убрать выходной сигнал, то различий между моделями не будет.

Если убрать выходной сигнал, то автомат вообще не нужен, ни Мура, ни Мили ни любой другой.
Re[40]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 10:33
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Ты сам то думай — в состоянии TCPClosed Open всегда будет "послать SYN, получить SYN, ACK и т.д". И никогда ни при каком условии Open не станет Close или чем

S>>то другим.
S>>В состоянии TCPClosed Open всегда будет посылать "SYN и т.п."
S>>В состоянии TCPClosed Send всегда будет посылать throw

S>>Ты не видишь зависимость выхода от входного сигнала? На всякий случай, я вижу такую зависимость.


SW>Выход автомата это не "посылать throw", а конкретный набор Open, Close, Send. Они не зависят от входа, а только от состояния.

ладно, фиг с ним со throw.

Попрошу тебя набросать тело функции, которая только по состоянию формирует управляющие команды для System.Net.Sockets.TcpClient.

void Handle(TCPState state)
{
    ...
    ...
           this.tcpClient.Connect(/*неважно*/);
    ...
    ...
           this.tcpClient.GetStream().WriteByte(10);

    ...
    ...     
           this.tcpClient.Close();
}


Ты утверждаешь, что кроме состояния тебе ничего не нужно. Значит не составит труда без знания о входе набросать черновик такой функции.
Re[39]: [C++] о паттернах
От: vdimas Россия  
Дата: 09.06.11 10:42
Оценка:
Здравствуйте, samius, Вы писали:

V>>Можно, но это формулировка с обратной стороны, со стороны подробностей реализации. Со стороны же постановки задачи, автомат — это ф-ия, значение выхода которой зависит от входного значения и от истории предыдущих входных значений.

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

Это конкретная модель автомата, а их же несколько. Речь о том, что автомат во время постановки задачи — черный ящик. А его конкретная модель реализация — это уже из анализа требований/сценариев выходит, никак не раньше. Не факт, что получится запихнуть сценарий в КА, иногда приходится использовать магазинные автоматы. Иногда проще сделать комбинированный автомат, чем "монолитный".

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

S>Верно, но так же верно считать что выход наблюдается при тех же условиях, при которых наблюдается переход.

Переход-то не всегда. Петля хоть и нарисована в графе, но это — математическая абстракция. Нет зачастую никакого перехода в реализации — пустая ячейка таблицы. Эффективности ради. В общем, мое ИМХО исключительно в том, что нельзя плясать от реализации. Внешнему коду всё-равно пофиг, что и как у нас там внутри.

V>>Паттерн удачно обходит эти подробности, сосредотачиваясь на собственно трюке диспетчеризации входа через vtable. Паттерн избавляет от вложенных switch/case.

S>Эти особенности вне паттерна. Если представить некоторую black box реализацию (неважно, диспетчеризация ли через vtable, табличная, или на switch-ах) с событиями StateChanged(s) и Transited(e), то то, на какие события мы подпишемся, и будет определять модель автомата.

Ниче не понял, насчет как это будет определять модель автомата. И почему это осообеность диспетчеризации входа через vtable — вне паттерна? Сам паттерн только об этом трюке и больше ни о чем, вообще-то. Остальное мы пририсовываем рядом и жестоко спорим.

V>>Да, за полезный. У нас же пара выходных значений: это полезный сигнал + код следующего состояния.

S>Код следующего состояния является полезным только как внутреннее знание автомата.

Это я прокомментировал приведенный тобой сниппет (отрывок из примера в GoF).

S>Полезным же выходом является либо в случае Мили, либо в случае Мура.


А в случае автономного? А магазинного? А обобщенного автомата? А составного?

V>>Но сам пример — образец того, как не надо делать в сложных случаях. Лучше не менять состояние самому, а сгенерировать некое событие Established. А текущий State пусть меняет некий внешний автомат. Это удобнее, потому как в сложных случаях довольно много получается идентичных State, отличающихся только кодом, отвечающим за переход в следующее состояние. Или даже вообще никакого полезного кода кроме перехода в следующее состояние. Брр... Такая схема гораздо неудобнее табличной, бо слишком много буков из-за ерунды. Вот для сравнения в табличном виде: http://www.rsdn.ru/forum/flame.comp/4134557.1.aspx
Автор: vdimas
Дата: 28.01.11
На шарпе тоже похожим образом переопределял операторы и тоже не хуже декларативность выходила.

S>Вижу что callback-и привязаны к состояниям, т.е. это Мур.

Дык, я и говорил, что схему, меняющую State, легче делать на Мура. Но ты же не видишь прикладного State, и автомат об этом не знает — это не его дело. Это уже чисто прикладная логика. Я привел как раз ту самую "внешнюю схему", управляющую целевым паттерном State. Просто показал, как задешево накидать логику переходов отдельно от прикладной части, выполнив в табличном виде, вместо того подхода, как дается в примере GoF. Прикладная часть здесь вырабатывает суррогатные сигналы: "success, hello, login, ..." и не показана, бо объемна и очень секретна.

S>Я тоже ушел от State паттерна к табличным автоматам.


Зачем??? Чистый табличный автомат хорош только для простых случаев или как автогенеренный по некоей автоматной грамматике.

S>Только мой код позволял юзать смешанные модели (генерить события по смене состояния и по переходу).


Дык, уже Мили. Все состояния у автомата могут выдавать выход, зависимый только от состояния (т.е. похожий на Мура), но в одном из состояний значение будет зависеть от входа — уже Мили. автомат Мура можно считать особым случаем Мили, наоборот — никак.

S>Представь вместо:

...
S>Следующее:
S>
S>ServerState 
S>    init        = { onInit,  { make_transition(success, wait_hello, onInitSuccess), other>closed } },
S>    wait_hello  = { NULL,    { make_transition(hello, hello_reply, onWaitHelloHello), other>closing } },
S>


Дык, а зачем тогда мой onInit и NULL? Это и есть мой декларативный make_transitions, просто инициализация в стиле С. Ты лишь продублировал на методы с другими именами. У меня вместо onWaitHelloHello идет hello_reply.

В общем, ты уже пытаешься разнести часть полезной логики в различные состояния. Именно таким образом преобразуют Мили в Мура, в итоге получаем больше состояний.

S>Может можно изящнее, но суть в том что можно привязать полезный сигнал к переходу, а можно не вязать.


Вот и сам же подтвердил.

V>>Там пример неудачный, замыливает цимус паттерна. Нужно было просто нарисовать что-нить простое из 3-х состояний и 3-х выходов на switsh/case или ифах, и рядом для сравнения на State.

S>Тогда бы они получили обвинение в том что паттерн хорош только для <= 3х состояний. А это, ИМХО, действительно так.

Наоборот, на >= 3-х состояний. На маленьком пространстве состояний/выходов он overdesign.
Re[40]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 11:11
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


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


V>Это конкретная модель автомата, а их же несколько. Речь о том, что автомат во время постановки задачи — черный ящик. А его конкретная модель реализация — это уже из анализа требований/сценариев выходит, никак не раньше. Не факт, что получится запихнуть сценарий в КА, иногда приходится использовать магазинные автоматы. Иногда проще сделать комбинированный автомат, чем "монолитный".

Мой спич только в рамках абстрактной модели и отличий Мили-Мура. Про все остальные автоматы я здесь даже не подразумевал.

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

S>>Верно, но так же верно считать что выход наблюдается при тех же условиях, при которых наблюдается переход.

V>Переход-то не всегда. Петля хоть и нарисована в графе, но это — математическая абстракция. Нет зачастую никакого перехода в реализации — пустая ячейка таблицы. Эффективности ради. В общем, мое ИМХО исключительно в том, что нельзя плясать от реализации. Внешнему коду всё-равно пофиг, что и как у нас там внутри.

Верно. Но эффективности ради можно добавить петлю и убрать лишнее состояние.

V>Ниче не понял, насчет как это будет определять модель автомата. И почему это осообеность диспетчеризации входа через vtable — вне паттерна? Сам паттерн только об этом трюке и больше ни о чем, вообще-то. Остальное мы пририсовываем рядом и жестоко спорим.

Под этими особенностями я подразумевал

S>Если мы хотим получить Send на выходе, у нас должно быть спецсостояние, помнящее выходной сигнал Send.
S>б) Мили
S>Выходной сигнал Send получается при проходе по ребру 'Send', которое ведет из состояние Open в него же

, а не особенность диспетчеризации. Именно они вне паттерна. А диспетчеризация через vtable — особенность паттерна State. Это верно.

S>>Полезным же выходом является либо в случае Мили, либо в случае Мура.


V>А в случае автономного? А магазинного? А обобщенного автомата? А составного?

нене, только в рамках абстрактного-Мили-Мура. Магазинные и т.п. — пусть опираются на историю. Ты прав. Я просто не думал обобщать до всех моделей.

S>>Вижу что callback-и привязаны к состояниям, т.е. это Мур.


V>Дык, я и говорил, что схему, меняющую State, легче делать на Мура. Но ты же не видишь прикладного State, и автомат об этом не знает — это не его дело. Это уже чисто прикладная логика. Я привел как раз ту самую "внешнюю схему", управляющую целевым паттерном State. Просто показал, как задешево накидать логику переходов отдельно от прикладной части, выполнив в табличном виде, вместо того подхода, как дается в примере GoF. Прикладная часть здесь вырабатывает суррогатные сигналы: "success, hello, login, ..." и не показана, бо объемна и очень секретна.

Это действительно дешево. Но дешев в этом стиле не только Мур, но и Мили.

S>>Я тоже ушел от State паттерна к табличным автоматам.


V>Зачем??? Чистый табличный автомат хорош только для простых случаев или как автогенеренный по некоей автоматной грамматике.

В сложных случаях обилие классов и их методов не позволяет охватывать поведение паттерна одним взглядом, приходится многое держать в голове, либо разбираться с бумажкой, бродя по возможным переходам. Табличный подход гораздо компактнее и позволяет реюзать код в разных задачах (как в твоем примере #include "Fsm.h"). State же вынуждает под каждый автомат заводить отдельную иерархию состояний.

S>>Только мой код позволял юзать смешанные модели (генерить события по смене состояния и по переходу).


V>Дык, уже Мили. Все состояния у автомата могут выдавать выход, зависимый только от состояния (т.е. похожий на Мура), но в одном из состояний значение будет зависеть от входа — уже Мили. автомат Мура можно считать особым случаем Мили, наоборот — никак.

Верно. Это и подразумеваю под смешанными.

S>>
S>>    init        = { onInit,  { make_transition(success, wait_hello, onInitSuccess), other>closed } },
S>>


V>Дык, а зачем тогда мой onInit и NULL? Это и есть мой декларативный make_transitions, просто инициализация в стиле С. Ты лишь продублировал на методы с другими именами. У меня вместо onWaitHelloHello идет hello_reply.

Твой onInit вызывается при входе в состояние init. А мой onInitSuccess вызовется при переходе из init по сигналу success. коллбэк входа дает нам Мура. Коллбэк перехода — Мили. Если юзать и то и другое — будет смешанный.

V>В общем, ты уже пытаешься разнести часть полезной логики в различные состояния. Именно таким образом преобразуют Мили в Мура, в итоге получаем больше состояний.

Да, я и говорю о смешивании моделей в одном исполнении. Только предостерегаю, что надо с этим аккуратнее. Проще использовать либо то, либо другое. Голова меньше болит.

V>>>Там пример неудачный, замыливает цимус паттерна. Нужно было просто нарисовать что-нить простое из 3-х состояний и 3-х выходов на switsh/case или ифах, и рядом для сравнения на State.

S>>Тогда бы они получили обвинение в том что паттерн хорош только для <= 3х состояний. А это, ИМХО, действительно так.

V>Наоборот, на >= 3-х состояний. На маленьком пространстве состояний/выходов он overdesign.

давай пофантазируем.
Ты представляешь себе диспетчеризацию S={1..50} X={1,10} на паттерне State, т.е. через vtable? Я представляю, и не испытываю никакого желания врубаться, почему она не работает как я хочу. 500 строк (максимум) в описании табличного автомата для меня будут проще, чем 50 классов, пусть и сгенерированных. Ну а если мы можем сгенерировать их, то можем и сгенерировать 500 строк табличного автомата. Потому я не наблюдаю серьезных преимуществ у State над табличным.
Re[37]: [C++] о паттернах
От: vdimas Россия  
Дата: 09.06.11 11:12
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Входной сигнал — это вызов метода и его параметры. Выходной — это сам метод.


Мимо. Сам метод — это вычисления, собсно полезная функция.

Если уж мы за входной сигнал принимаем в ООП вызов метода, то давай и за выходной принимать то же самое, бо для вызываемого нами объекта он будет точно таким же входным.
Re[41]: [C++] о паттернах
От: vdimas Россия  
Дата: 09.06.11 11:48
Оценка:
Здравствуйте, samius, Вы писали:

V>>Зачем??? Чистый табличный автомат хорош только для простых случаев или как автогенеренный по некоей автоматной грамматике.

S>В сложных случаях обилие классов и их методов не позволяет охватывать поведение паттерна одним взглядом, приходится многое держать в голове, либо разбираться с бумажкой, бродя по возможным переходам. Табличный подход гораздо компактнее и позволяет реюзать код в разных задачах (как в твоем примере #include "Fsm.h"). State же вынуждает под каждый автомат заводить отдельную иерархию состояний.

Ммм... Я вот уже намекал. Просто State — очередное не самое удачное название. В том примере, что я показал, возможно использовать одни и те же State для разных состояний. Т.е. реально состояний автомата может быть значительно больше, чем отличающихся объектов State. И тогда его лучше назвать не State, а Behavior. А иерархия поведений обычно довольно скромная выходит, если не надо помнить откуда мы пришли, и не вычислять, куда нам надо отсюда уходить. Например, формирование суррогатных сигналов у меня делается "автоматически" в одном месте — это просто тип входного сообщения. Т.е. прикладная логика даже этим не особо заморачивается. Просто смотрит на входные сообщения и что-то делает по одному-двум их типам, и вызывает базовый метод. Это всё. Поэтому в некоторых состояниях прикладная логика пуста — NULL, у меня там используется базовая логика лишь по формированию выходного суррогатного сигнала. Т.е. это пример одинакового поведения для разных состояний.

S>>>Только мой код позволял юзать смешанные модели (генерить события по смене состояния и по переходу).


V>>Дык, уже Мили. Все состояния у автомата могут выдавать выход, зависимый только от состояния (т.е. похожий на Мура), но в одном из состояний значение будет зависеть от входа — уже Мили. автомат Мура можно считать особым случаем Мили, наоборот — никак.

S>Верно. Это и подразумеваю под смешанными.

S>>>
S>>>    init        = { onInit,  { make_transition(success, wait_hello, onInitSuccess), other>closed } },
S>>>


V>>Дык, а зачем тогда мой onInit и NULL? Это и есть мой декларативный make_transitions, просто инициализация в стиле С. Ты лишь продублировал на методы с другими именами. У меня вместо onWaitHelloHello идет hello_reply.

S>Твой onInit вызывается при входе в состояние init. А мой onInitSuccess вызовется при переходе из init по сигналу success. коллбэк входа дает нам Мура. Коллбэк перехода — Мили. Если юзать и то и другое — будет смешанный.

Мой onInit — это не есть прикладной метод интерфейса State. Это калбек управляющей схемы, выставляющей нужный объект State для сессии. Показана часть внешней схемы — сам автомат (Мура). Выходной сигнал имеет тип Callback. Ну вот просто я так типизирован шаблонный класс. Мог бы и енумом типизировать. Показанный автомат не вызывает Callback, не умеет. Он лишь возвращает значение, соответствующее состоянию. Просто для показанного сценария это значение — адрес ф-ии. В других случаях я использую указатель на мембер, например. Это такая очередная автоматическая диспетчеризация, бо если этому автомату типизировать выход неким enum, то потом по нему надо будет опять делать switch/case в клиентском, по отношению к нему, коде. А здесь клиент просто вызывает указанную ф-ию по адресу с параметром this, если адрес не NULL, или некую общую ф-ию, если NULL. Всё.

==============
Наверно, объяснятель из меня никакой...
Re[41]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 12:13
Оценка:
Здравствуйте, samius, Вы писали:

S>Попрошу тебя набросать тело функции, которая только по состоянию формирует управляющие команды для System.Net.Sockets.TcpClient.


Во первых, я уже показал подробное описание автомата. Во вторых ты сам показал пример такой функции Чего тебе еще надо ?
Ты не путаешь автомат с функцией ради которой реализовывался State ? Ты не забыл, в чем особенность State ?
Re[42]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 12:46
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>>>Зачем??? Чистый табличный автомат хорош только для простых случаев или как автогенеренный по некоей автоматной грамматике.

S>>В сложных случаях обилие классов и их методов не позволяет охватывать поведение паттерна одним взглядом, приходится многое держать в голове, либо разбираться с бумажкой, бродя по возможным переходам. Табличный подход гораздо компактнее и позволяет реюзать код в разных задачах (как в твоем примере #include "Fsm.h"). State же вынуждает под каждый автомат заводить отдельную иерархию состояний.

V>Ммм... Я вот уже намекал. Просто State — очередное не самое удачное название. В том примере, что я показал, возможно использовать одни и те же State для разных состояний. Т.е. реально состояний автомата может быть значительно больше, чем отличающихся объектов State. И тогда его лучше назвать не State, а Behavior.

Я понял что в том примере тип у всех состояний один. Понял что там не vtbl, согласен называть его Behavior и возражаю против называния его "State"-ом.
V>А иерархия поведений обычно довольно скромная выходит, если не надо помнить откуда мы пришли, и не вычислять, куда нам надо отсюда уходить. Например, формирование суррогатных сигналов у меня делается "автоматически" в одном месте — это просто тип входного сообщения. Т.е. прикладная логика даже этим не особо заморачивается. Просто смотрит на входные сообщения и что-то делает по одному-двум их типам, и вызывает базовый метод. Это всё. Поэтому в некоторых состояниях прикладная логика пуста — NULL, у меня там используется базовая логика лишь по формированию выходного суррогатного сигнала. Т.е. это пример одинакового поведения для разных состояний.
Поведение все-таки разное (на выходе), но оно формируется не полиморфизмом, как в State, а засовыванием в "таблицу" "callback"-ов. Но сами экземпляры состояний имеют один тип, потому нет нужды плодить N классов для них. В этом плане — да, поведение их внутри машины состояний одинаковое — а именно предоставление информации по дальнейшим переходам.

S>>>>Только мой код позволял юзать смешанные модели (генерить события по смене состояния и по переходу).


V>>>Дык, а зачем тогда мой onInit и NULL? Это и есть мой декларативный make_transitions, просто инициализация в стиле С. Ты лишь продублировал на методы с другими именами. У меня вместо onWaitHelloHello идет hello_reply.

S>>Твой onInit вызывается при входе в состояние init. А мой onInitSuccess вызовется при переходе из init по сигналу success. коллбэк входа дает нам Мура. Коллбэк перехода — Мили. Если юзать и то и другое — будет смешанный.

V>Мой onInit — это не есть прикладной метод интерфейса State. Это калбек управляющей схемы, выставляющей нужный объект State для сессии. Показана часть внешней схемы — сам автомат (Мура). Выходной сигнал имеет тип Callback. Ну вот просто я так типизирован шаблонный класс. Мог бы и енумом типизировать. Показанный автомат не вызывает Callback, не умеет.

Вот как? Я подумал что он их вызывает. И мой код с make_transition был написан в предположении что автомат вызывает этот Callback в случае входа в состояние, к которому он приписан. И я предложил добавить Callback для прохода по ребру, который бы дергал автомат при переходе по ребру.
V>Он лишь возвращает значение, соответствующее состоянию. Просто для показанного сценария это значение — адрес ф-ии. В других случаях я использую указатель на мембер, например. Это такая очередная автоматическая диспетчеризация, бо если этому автомату типизировать выход неким enum, то потом по нему надо будет опять делать switch/case в клиентском, по отношению к нему, коде. А здесь клиент просто вызывает указанную ф-ию по адресу с параметром this, если адрес не NULL, или некую общую ф-ию, если NULL. Всё.
Теперь ясно.

V>Наверно, объяснятель из меня никакой...

Просто невнимательно разглядел пример. Действительно, раз Callback идет параметром шаблона, то вряд ли шаблон умеет его вызывать (если конечно не специфицирован соответствующим образом).
Re[42]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 12:59
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>Попрошу тебя набросать тело функции, которая только по состоянию формирует управляющие команды для System.Net.Sockets.TcpClient.


SW>Во первых, я уже показал подробное описание автомата.

В котором есть зависимость выхода от входного сигнала, которую ты усиленно отрицаешь.

SW>Во вторых ты сам показал пример такой функции Чего тебе еще надо ?

Я не мог показывать пример такой функции.
Если ты об
void TCPClosed::ActiveOpern (TCPConnection* t)

То это не функция формирования выходного сигнала, которая подразумевается в описании автоматов, это лишь часть системы диспетчеризации. Вызов этого метода происходит благодаря передаче входного сигнала в виде индекса vtbl. Т.е. в этой функции тебе уже сказано, что пришел сигнал ActiveOpen. Если бы этой информации не было, то ты не смог бы сформировать выходной сигнал, соответствующий сигналу ActiveOpen.

SW>Ты не путаешь автомат с функцией ради которой реализовывался State ? Ты не забыл, в чем особенность State ?

Ты не пытаешься свое непонимание вопроса приписать мне?
ёё
Re[43]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 13:10
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Во первых, я уже показал подробное описание автомата.

S>В котором есть зависимость выхода от входного сигнала, которую ты усиленно отрицаешь.

см ниже.

SW>>Во вторых ты сам показал пример такой функции Чего тебе еще надо ?

S>Я не мог показывать пример такой функции.
S>Если ты об
S>
S>void TCPClosed::ActiveOpern (TCPConnection* t) 
S>

S>То это не функция формирования выходного сигнала

Эта функция и является одним из выходных сигналов.
Re[44]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 13:15
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Во вторых ты сам показал пример такой функции Чего тебе еще надо ?

S>>Я не мог показывать пример такой функции.
S>>Если ты об
S>>
S>>void TCPClosed::ActiveOpern (TCPConnection* t) 
S>>

S>>То это не функция формирования выходного сигнала

SW>Эта функция и является одним из выходных сигналов.

Вообще нет. Это часть системы диспетчеризации. Выходным сигналом будет то, что этот метод сделает кроме смены состояния.

Но фиг с ним, это детали. А вот что важно.
Что метод ActiveOpen будет вызван при сигнале ActiveOpen.
А метод Close будет вызван при сигнале Close.
Это и есть зависимость выходного сигнала от входного.
Re[38]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 13:33
Оценка:
Здравствуйте, vdimas, Вы писали:

SW>>Входной сигнал — это вызов метода и его параметры. Выходной — это сам метод.


V>Мимо. Сам метод — это вычисления, собсно полезная функция.


Он же выходной сигнал. Не важно, как ты хочешь его использовать.
Re[45]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 13:48
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Эта функция и является одним из выходных сигналов.

S>Вообще нет. Это часть системы диспетчеризации. Выходным сигналом будет то, что этот метод сделает кроме смены состояния.

Это ты хочешь её использовать таким образом. Но твои намерения не имеют никакого отношения к автомату Мура.

S>Что метод ActiveOpen будет вызван при сигнале ActiveOpen.

S>А метод Close будет вызван при сигнале Close.
S>Это и есть зависимость выходного сигнала от входного.

Это всего лишь путаница из того, что входные выходные сигналы совмещены частично. Нарисуй автомат Мура, назови входные и выходные сигналы одинаково и ты получишь ровно такую же же путаницу.
Re[46]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 14:01
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Эта функция и является одним из выходных сигналов.

S>>Вообще нет. Это часть системы диспетчеризации. Выходным сигналом будет то, что этот метод сделает кроме смены состояния.

SW>Это ты хочешь её использовать таким образом. Но твои намерения не имеют никакого отношения к автомату Мура.

Твое понимание автомата Мура не имеет к нему отношения.

S>>Что метод ActiveOpen будет вызван при сигнале ActiveOpen.

S>>А метод Close будет вызван при сигнале Close.
S>>Это и есть зависимость выходного сигнала от входного.

SW>Это всего лишь путаница из того, что входные выходные сигналы совмещены частично.

Путаница в твоей голове.
SW>Нарисуй автомат Мура, назови входные и выходные сигналы одинаково и ты получишь ровно такую же же путаницу.
Не получу, т.к. выход автомата Мура зависит только от состояний, через которые проходит автомат. Ему не нужно знать по какому сигналу был переход, что бы подать выходной сигнал.
Re[47]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 14:25
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Нарисуй автомат Мура, назови входные и выходные сигналы одинаково и ты получишь ровно такую же же путаницу.

S>Не получу, т.к. выход автомата Мура зависит только от состояний, через которые проходит автомат. Ему не нужно знать по какому сигналу был переход, что бы подать выходной сигнал.

В State тоже не надо знать, по какому сигналу был или не был переход, поскольку функция привязана исключительно к состоянию. На а если ты можешь параметры использовать, то это просто хак, потому что выход совмещен со входом Раздели входы-выходы, например сделавый выходы чисто как свойства и убедись, что ничего не меняется.
Re[48]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 15:08
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Нарисуй автомат Мура, назови входные и выходные сигналы одинаково и ты получишь ровно такую же же путаницу.

S>>Не получу, т.к. выход автомата Мура зависит только от состояний, через которые проходит автомат. Ему не нужно знать по какому сигналу был переход, что бы подать выходной сигнал.

SW>В State тоже не надо знать, по какому сигналу был или не был переход, поскольку функция привязана исключительно к состоянию. На а если ты можешь параметры использовать, то это просто хак, потому что выход совмещен со входом Раздели входы-выходы, например сделавый выходы чисто как свойства и убедись, что ничего не меняется.

Способ реализации тут совсем непричем. Забудь про паттерн State.
Есть вход
x1, x2, x3, ...
он подается на вход в некоторый ящик [], внутри которого хранится текущее состояние [s?]
из ящика вылетают сигналы y1, y2, y3, y4.
Функция, выбрасывающая сигналы из ящика, называется выходной.
Теперь смотри:
ящик в состоянии [sConnected]. В зависимости, от того, что мы в него толкнем на вход, (xClose или xSend), получим на выходе либо команду к закрытию соединения, либо команду к посылке данных (yClose или ySend соответственно) для обоих подходов. Внимание на обозначения: состояния имеют префикс s, сигналы входа — x, сигналы выхода — y.

Что происходит под полом у Мили?
Идет анализ, в каком мы состоянии и какой именно сигнал пришел, для того что бы перевести машину в новое состояние. Функция перехода у обоих автоматов одинакова и зависит от входного сигнала. У Мили точно такая же функция определяет выходной сигнал, разве что отображает она не в X, а в Y.
Т.е. в простом случае мы имеем две таблицы (могут быть не таблицы, а более сложные функции)
Одна — функция переходов
sConnected --xSend-->sConnected
sConnected --xClose-->sDisconnected

Другая — выходов
sConnected --xSend-->ySend
sConnected --xClose-->yClose

Здесь очевидно, что функция выходов зависит как от текущего состояния, так и от сигнала, который пришел извне, точно так же, как и функция переходов. Сверься с определением автомата Мили, если угодно.

В автомате Мура функция выхода не зависит от того, что толкают на вход, а зависит только от состояния автомата.
Что бы перейти от автомата Мили к автомату Мура, нужно наплодить лишних состояний. Например, нужно сделать состояние, которое будет гнать к выходу сигнал ySend.
Выглядеть это будет так:
sConnected ---xSend---> sSend
sSend---xSend--->sSend
sSend---xClose--->sDisconnected
sConnected---xClose--->sDisconnected

Функция выхода будет делать вот что:
sConnected -> yConnect
sSend-> ySend
sDisconnected -> yDesconnect

Теперь заметь разницу, между функцией перехода и функцией выхода. Первая как и у Мили, зависит и от входа и от текущего состояния. Вторая — только от текущего состояния. Сверься с определением автомата Мура.

Если ты не в силах описанное осмыслить, то найди себе того, кто это тебе объяснит. Я подопух что-то уже.

Прежде чем писать что я что-то путаю, убедись, пожалуйста, что ты сам ничего не путаешь. Если все еще кажется что я что-то путаю, спроси кого-нибудь еще, а лучше сделай опрос.
Re[49]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 15:31
Оценка:
Здравствуйте, samius, Вы писали:

S>он подается на вход в некоторый ящик [], внутри которого хранится текущее состояние [s?]

S>из ящика вылетают сигналы y1, y2, y3, y4.
S>Функция, выбрасывающая сигналы из ящика, называется выходной.
S>Теперь смотри:
S>ящик в состоянии [sConnected]. В зависимости, от того, что мы в него толкнем на вход, (xClose или xSend), получим на выходе либо команду к закрытию соединения, либо команду к посылке данных (yClose или ySend соответственно) для обоих подходов.

Не правильно. Выход это не конкретная команда,а функция. Ты снова путаешься там же где и раньше.
Тупейший пример, который показывает,почему State это автомат Мура:
Вход — сигнал a или б. Состояния А и Б. а переключает в A, б переключает в Б. Выход — тригонометрическая функция f. В состоянии A — sin, в состоянии Б — cosin.
Что бы ты ни делал, что бы ни слал на вход, в состоянии А f=sin, а в Б f=cosin.
Путаница в State берется из за того, что вход он же и выход и он же параметр для f а значит для sin или cosin в зависимости от состояния.
То есть, как только разделили входы от выходов, автомат очевидно Мура. Что бы он стал автоматом Мили, функция f должна срабатывать только в момент конкретного переключения , то есть, здесь нужно файрить эвент.
Теперь усложним задачу — выхода ровно два, f1 и f2. В состоянии А f1 = sin,f2 = tan, в состоянии Б f1=cosin, f2=cotan.
Вопрос, какой выход будет в состоянии А ? Очевидно, f1=sin и f2=tan.
В электронике есть задающий генератор. В программухе этого нет. Потому что бы получить функцию, нужно самому обратиться к ней каким либо образом. В электронике ничего такого не нужно делать — сигнал сам по себе подаётся на шину.
Re[47]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 15:39
Оценка:
Здравствуйте, samius, Вы писали:

S>Не получу, т.к. выход автомата Мура зависит только от состояний, через которые проходит автомат. Ему не нужно знать по какому сигналу был переход, что бы

подать выходной сигнал.

Не нужно знать, по какому сигналу был переход, потому что при переключении меняются все выходные сигналы, все а не только один. Пользователь сам выбирает тот сигнал который ему нужен.
Re[50]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 16:33
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


S>>ящик в состоянии [sConnected]. В зависимости, от того, что мы в него толкнем на вход, (xClose или xSend), получим на выходе либо команду к закрытию соединения, либо команду к посылке данных (yClose или ySend соответственно) для обоих подходов.


SW>Не правильно. Выход это не конкретная команда,а функция. Ты снова путаешься там же где и раньше.

Вот корень твоего заблуждения. Выход — это не функция в общем случае. Он может быть функцией, но может быть символом, номером, фамилией, массивом и в том числе функцией. Смотри здесь.

S, X и Y — конечные непустые множества

Ты знаком с понятием множества? Y может конечно быть и множеством функций. А может и не быть. Так вот, лямбда — это функция, отображающая декартово произведение множества состояний и множества входных сигналов на множество Y — выходных символов (команд, а может быть и функций в очень частном случае).

SW>Тупейший пример, который показывает,почему State это автомат Мура:

Ошибка. Паттерн State может описывать как автомат Мура, так и автомат Мили. Я всю дорогу говорил о конкретном примере в GoF. Он — Мили.

SW>Вход — сигнал a или б. Состояния А и Б. а переключает в A, б переключает в Б. Выход — тригонометрическая функция f. В состоянии A — sin, в состоянии Б — cosin.

SW>Что бы ты ни делал, что бы ни слал на вход, в состоянии А f=sin, а в Б f=cosin.
Здесь ты описал автомат Мура.
Его таблица переходов
A -b-> B
A -a-> A
B -a-> A
B -b-> B
Таблица выходов
A — sin
B — cosin
Здесь выходной символ есть функция. точнее, множество Y = {sin, cosin}

SW>Путаница в State берется из за того, что вход он же и выход и он же параметр для f а значит для sin или cosin в зависимости от состояния.

State может выдавать любые выходные сигналы. Пример в GoF выдает команды физическому соединению в момент подачи сигнала. То что они совпали с входными — это иллюзия. Давай я входной сигнал переименую в Open, а выходной останется connection.Connect(bla-bla). Так путаница исчезла?

SW>То есть, как только разделили входы от выходов, автомат очевидно Мура. Что бы он стал автоматом Мили, функция f должна срабатывать только в момент конкретного переключения , то есть, здесь нужно файрить эвент.

Загляни в GoF, там команды соединению подаются перед переключением автомата в теле метода, вызываемого входным сигналом, а не как-нибудь еще. Есть там эвент или нет — дело десятое.

SW>Теперь усложним задачу — выхода ровно два, f1 и f2. В состоянии А f1 = sin,f2 = tan, в состоянии Б f1=cosin, f2=cotan.

На самом деле тут не 2 выхода, а один, состоящий из кортежа функций. Y = { (sin, tan), (cosin, cotan)}
Заметь, это могло бы быть
Y = { ("", 2, sin), ("5", -1, cos) }

SW>Вопрос, какой выход будет в состоянии А ? Очевидно, f1=sin и f2=tan.

Очевидно, что пара y = (sin, tan)

Теперь усложняем задачу. При сигнале a в состоянии A выдавать x^2 и оставаться на месте. При сигнале b в состоянии A переключаться и выдавать cosin. При сигнале b в состоянии B выдавать x-1, при сигнале a в состоянии B переключаться в A и выдавать sin.
т.е. таблица выходов автомата меняется на следующую:
A — a -> x^2
A — b -> cosin
B — a -> sin
B — b -> x-1
Видишь пошла зависимость от входного сигнала? Знакомься, это Мили. В GoF именно так, с той разницей что выходят не функции R->R, а команды соединению.

SW>В электронике есть задающий генератор. В программухе этого нет. Потому что бы получить функцию, нужно самому обратиться к ней каким либо образом. В электронике ничего такого не нужно делать — сигнал сам по себе подаётся на шину.

Длительность сигнала в модели автомата не имеет значения. При необходимости длительного сигнала легко можно принять соглашение, что активен последний вывалившийся из автомата сигнал.
Re[51]: [C++] о паттернах
От: Sharad-Waador  
Дата: 09.06.11 16:49
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Не правильно. Выход это не конкретная команда,а функция. Ты снова путаешься там же где и раньше.

S>Вот корень твоего заблуждения. Выход — это не функция в общем случае. Он может быть функцией, но может быть символом,

В State это функция.

SW>>Тупейший пример, который показывает,почему State это автомат Мура:

S>Ошибка. Паттерн State может описывать как автомат Мура, так и автомат Мили. Я всю дорогу говорил о конкретном примере в GoF. Он — Мили.

Мура.

SW>>Путаница в State берется из за того, что вход он же и выход и он же параметр для f а значит для sin или cosin в зависимости от состояния.

S>State может выдавать любые выходные сигналы. Пример в GoF выдает команды физическому соединению в момент подачи сигнала. То что они совпали с входными — это иллюзия. Давай я входной сигнал переименую в Open, а выходной останется connection.Connect(bla-bla). Так путаница исчезла?

Нужно разделить, а не переименовать.

SW>>То есть, как только разделили входы от выходов, автомат очевидно Мура. Что бы он стал автоматом Мили, функция f должна срабатывать только в момент конкретного переключения , то есть, здесь нужно файрить эвент.

S>Загляни в GoF, там команды соединению подаются перед переключением автомата в теле метода, вызываемого входным сигналом, а не как-нибудь еще. Есть там эвент или нет — дело десятое.

State это автомат + полезная функция. "команды соединению подаются " — это полезная функция. И когда ты вызываешь Open то сначала ты используешь Open как выход, делаешь всё что тебе надо, переключаешь состояние и выходишь.

S>Теперь усложняем задачу. При сигнале a в состоянии A выдавать x^2 и оставаться на месте. При сигнале b в состоянии A переключаться и выдавать cosin. При сигнале b в состоянии B выдавать x-1, при сигнале a в состоянии B переключаться в A и выдавать sin.

S>т.е. таблица выходов автомата меняется на следующую:
S>A — a -> x^2
S>A — b -> cosin
S>B — a -> sin
S>B — b -> x-1
S>Видишь пошла зависимость от входного сигнала? Знакомься, это Мили. В GoF именно так, с той разницей что выходят не функции R->R, а команды соединению.

Ты снова хочешь смешать все в кучу — автомат и функцию которая реализуется на этом автомате.
Re[52]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 09.06.11 18:15
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


SW>>>Не правильно. Выход это не конкретная команда,а функция. Ты снова путаешься там же где и раньше.

S>>Вот корень твоего заблуждения. Выход — это не функция в общем случае. Он может быть функцией, но может быть символом,

SW>В State это функция.

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

Но это даже не Мур. У Мура есть функция , которая у тебя напрочь отсутствует, т.е. она даже не , и не . Выход у тебя — само поведение.
Да, любой автомат в реализации State можно считать под таким углом зрения Муром. Но извини, такая интерпретация это кастрация даже для Мура. В действительностии State гораздо шире.
Берем состояния S = {s0, s1}, берем сигнал X = {тыц}, берем множество выходных сигналов Y = { 'a', 'b'}.
переходы
s0, тыц -> s1
s1, тыц -> s0
выходы
s0 -> 'a'
s1 -> 'b'

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

Идем дальше. для описанного автомата я определяю второй сигнал. Теперь X = {тыц, бдыщ} (извиняюсь за фантазию).
бдыщ переводить не будет, но будет гадить в выход:

переходы
s0, тыц -> s1
s0, бдыщ -> s0
s1, тыц -> s0
s1, бдыщ -> s1
выходы
s0, тыц -> 'a'
s0, бдыщ -> 'b'
s1, тыц -> 'b'
s1, бдыщ -> 'a'

Никакого смысла в результате не ищи, кроме того что я усложнил автомат до Мили, где функция выхода зависит от входа. Теперь я делаю утверждение, что и этот автомат я могу реализовать паттерном State. Хочешь — рассматривай его как кастрированный автомат Мура, но эта реализация на State будет реализовывать именно автомат Мили, хочешь ты этого или нет.

SW>>>Тупейший пример, который показывает,почему State это автомат Мура:

S>>Ошибка. Паттерн State может описывать как автомат Мура, так и автомат Мили. Я всю дорогу говорил о конкретном примере в GoF. Он — Мили.

SW>Мура.

Кастрированного Мура, или все-таки Мили.

SW>>>Путаница в State берется из за того, что вход он же и выход и он же параметр для f а значит для sin или cosin в зависимости от состояния.

S>>State может выдавать любые выходные сигналы. Пример в GoF выдает команды физическому соединению в момент подачи сигнала. То что они совпали с входными — это иллюзия. Давай я входной сигнал переименую в Open, а выходной останется connection.Connect(bla-bla). Так путаница исчезла?

SW>Нужно разделить, а не переименовать.

Нужно смотреть на выход из автомата шире, чем как на набор полезных функций.

SW>>>То есть, как только разделили входы от выходов, автомат очевидно Мура. Что бы он стал автоматом Мили, функция f должна срабатывать только в момент конкретного переключения , то есть, здесь нужно файрить эвент.

S>>Загляни в GoF, там команды соединению подаются перед переключением автомата в теле метода, вызываемого входным сигналом, а не как-нибудь еще. Есть там эвент или нет — дело десятое.

SW>State это автомат + полезная функция. "команды соединению подаются " — это полезная функция. И когда ты вызываешь Open то сначала ты используешь Open как выход, делаешь всё что тебе надо, переключаешь состояние и выходишь.

Довольно мудрено. Я рассматриваю State как просто автомат, который на выходе дает команды соединению и не несет никаких "полезных функций", ибо мне нужны команды соединению, а не полезные функции. У меня есть вход, есть выход. Что внутри — неважно. Там может быть Мили, как в GoF, может быть Мур с дополнительными состояниями.

SW>Ты снова хочешь смешать все в кучу — автомат и функцию которая реализуется на этом автомате.

Ты залип на паттерн State, и с ним связанную путаницу в своей голове. Попробуй реализовать автомат другим путем. Увидишь, что есть другие выходы, кроме как пачки "полезных функций". Да и не подходит твой "State-Мур" под формальное описание Мура.
Re[43]: [C++] о паттернах
От: vdimas Россия  
Дата: 10.06.11 18:13
Оценка:
Здравствуйте, samius, Вы писали:

V>>Наверно, объяснятель из меня никакой...

S>Просто невнимательно разглядел пример. Действительно, раз Callback идет параметром шаблона, то вряд ли шаблон умеет его вызывать (если конечно не специфицирован соответствующим образом).

А если специфицировать специальным образом, то надо думать, как хранить контекст в автомате, который пойдет как аргумент для вызова ф-ии. Короче, переписать почти всю отлаженную шаблонную реализацию автомата... Нафиг это надо?
Re[44]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.06.11 18:18
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, samius, Вы писали:


V>>>Наверно, объяснятель из меня никакой...

S>>Просто невнимательно разглядел пример. Действительно, раз Callback идет параметром шаблона, то вряд ли шаблон умеет его вызывать (если конечно не специфицирован соответствующим образом).

V>А если специфицировать специальным образом, то надо думать, как хранить контекст в автомате, который пойдет как аргумент для вызова ф-ии. Короче, переписать почти всю отлаженную шаблонную реализацию автомата... Нафиг это надо?

Я-то не видел реализацию, следовательно мог только предполагать. Да еще и невнимательно отнесся к параметру шаблона. Конечно не надо.
Re[39]: [C++] о паттернах
От: vdimas Россия  
Дата: 10.06.11 18:33
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Он же выходной сигнал. Не важно, как ты хочешь его использовать.


Здесь ты договорился до того, что у тебя процесс вычисления выходного сигнала (т.е. тело ф-ии, вычисляющей выходной сигнал) — это одно и то же, что сам выходной сигнал. Поздравляю.

Твои утверждения из этой ветки как раз из этого и растут, что ты отказываешь паттерну State в некоей логике вычисления полезного сигнала. Тебе кажется, что некий экземпляр State — это уже полезный сигнал сам по себе, поэтому это и есть автомат Мура. А то, что извне дергаются методы конкретного экземпляра State, якобы вообще не при чем. Ты даже предложил заменить ф-ии на св-ва. Не понимаешь принципиальной разницы?. А то, что ты своим этим предположением отвергаешь исходную постановку задачи для паттерна, и предлагаешь решать некую другую задачу вместо исходной, понимаешь?. Ведь трюк расказывает об удобной диспетчеризации функциональности через полиморфизм, через подмену экземпляра объекта с полиморфными методами. А у тебя ни полиморфизма, ни диспетчеризации, ничего. И ты заостряешься на том моменте, который с т.з. паттерна вообще не важен — это то, как мы получаем конкретный экземпляр State. Да это пофиг, на самом деле. Этот State может даже по таймеру меняться случайным образом без всяких автоматов Мура, как у меня было когда-то в одной халявке по динамическим неоновым рекламам. Обрати внимание, Мура нет, а State все еще есть.

ИМХО, это обсуждение пора уже было свернуть за бестолковостью.
Re[40]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.06.11 18:41
Оценка:
Здравствуйте, vdimas, Вы писали:

V>ИМХО, это обсуждение пора уже было свернуть за бестолковостью.

Обсуждение State вышло бестолковым. Но зато получили образчик того, как паттерны могут понимться.
Re[40]: [C++] о паттернах
От: Sharad-Waador  
Дата: 13.06.11 18:16
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здесь ты договорился до того, что у тебя процесс вычисления выходного сигнала (т.е. тело ф-ии, вычисляющей выходной сигнал) — это одно и то же, что сам выходной сигнал. Поздравляю.


В паттерне State а не у меня.

V>Твои утверждения из этой ветки как раз из этого и растут, что ты отказываешь паттерну State в некоей логике вычисления полезного сигнала. Тебе кажется, что некий экземпляр State — это уже полезный сигнал сам по себе, поэтому это и есть автомат Мура.


Я говорю что State надо отделять от полезной функции.

>А то, что извне дергаются методы конкретного экземпляра State, якобы вообще не при чем.


И это я тоже объяснил.

>Этот State может даже по таймеру меняться случайным образом без всяких автоматов Мура, как у меня было когда-то в одной халявке по динамическим неоновым рекламам. Обрати внимание, Мура нет, а State все еще есть.


Решение с таймером можно свести к решению с автоматом коорый будет использовать этот таймер.
Re[53]: [C++] о паттернах
От: Sharad-Waador  
Дата: 13.06.11 18:27
Оценка:
Здравствуйте, samius, Вы писали:

S>переходы

S>s0, тыц -> s1
S>s0, бдыщ -> s0
S>s1, тыц -> s0
S>s1, бдыщ -> s1
S>выходы
S>s0, тыц -> 'a'
S>s0, бдыщ -> 'b'
S>s1, тыц -> 'b'
S>s1, бдыщ -> 'a'

S>Никакого смысла в результате не ищи, кроме того что я усложнил автомат до Мили, где функция выхода зависит от входа.


Ты ничего не усложнил, выход все так же зависит от состояние, если этот выход — функция.

>Теперь я делаю утверждение, что и этот автомат я могу реализовать паттерном State. Хочешь — рассматривай его как кастрированный автомат Мура, но эта реализация на State будет реализовывать именно автомат Мили, хочешь ты этого или нет.


Посмотри, где у Мили появляются выходы.

SW>>Мура.

S>Кастрированного Мура, или все-таки Мили.

У мили на выходе на время перехода должна появляться функция.

SW>>Ты снова хочешь смешать все в кучу — автомат и функцию которая реализуется на этом автомате.

S>Ты залип на паттерн State, и с ним связанную путаницу в своей голове. Попробуй реализовать автомат другим путем. Увидишь, что есть другие выходы, кроме как пачки "полезных функций". Да и не подходит твой "State-Мур" под формальное описание Мура.

Подходит, смотря что считать входом и выходом.
Re[41]: [C++] о паттернах
От: Sharad-Waador  
Дата: 13.06.11 18:27
Оценка:
Здравствуйте, samius, Вы писали:

V>>ИМХО, это обсуждение пора уже было свернуть за бестолковостью.

S>Обсуждение State вышло бестолковым. Но зато получили образчик того, как паттерны могут понимться.

Получили хороший пример, что твои передергивания и постановки диагнозов отдаляют понимание.
Re[42]: [C++] о паттернах
От: samius Япония http://sams-tricks.blogspot.com
Дата: 13.06.11 20:24
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

SW>Здравствуйте, samius, Вы писали:


V>>>ИМХО, это обсуждение пора уже было свернуть за бестолковостью.

S>>Обсуждение State вышло бестолковым. Но зато получили образчик того, как паттерны могут понимться.

SW>Получили хороший пример, что твои передергивания и постановки диагнозов отдаляют понимание.

Ты уж свои проблемы на меня не вешай. Я тебе уже писал, спроси кого-нибудь другого, кто в теме. Заподозришь заговор — будет повод обратиться к тонким специалистам.
Re[43]: [C++] о паттернах
От: Sharad-Waador  
Дата: 13.06.11 21:31
Оценка:
Здравствуйте, samius, Вы писали:

SW>>Получили хороший пример, что твои передергивания и постановки диагнозов отдаляют понимание.

S>Ты уж свои проблемы на меня не вешай. Я тебе уже писал, спроси кого-нибудь другого, кто в теме. Заподозришь заговор — будет повод обратиться к тонким специалистам.

Поверю твоему опыту )))
Re[41]: [C++] о паттернах
От: vdimas Россия  
Дата: 15.06.11 10:04
Оценка:
Здравствуйте, Sharad-Waador, Вы писали:

>>Этот State может даже по таймеру меняться случайным образом без всяких автоматов Мура, как у меня было когда-то в одной халявке по динамическим неоновым рекламам. Обрати внимание, Мура нет, а State все еще есть.


SW>Решение с таймером можно свести к решению с автоматом коорый будет использовать этот таймер.


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