Re[12]: ...продолжение
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 04.05.07 12:21
Оценка: -5 :))) :)))
Здравствуйте, Gaperton, Вы писали:

G>Ой, какой разговор пошел . На основании одного факта, что вы в индустрии провели 11 лет своей жизни, вы, боюсь, здесь никому и ничего не докажете . Хотя бы потому, что не вы один тут имеете опыт 10+ лет. Это не есть ваша уникальная особенность. Посмотрите, кто вам минусы поставил — у них у всех 10+.


Вы не прячьтесь за чужие минусы, а попробуйте вести дискуссию предметно, конструктивно и без наездов. Пока что наезды с Вашей стороны превышают количество приведенных Вами примеров (их вообще нет). Да и замечания Ваши непредметны. Уж если б придирались, то хотя бы к конкретным слайдам.

G>И у меня тоже. Что дальше? Пиписьками меряться начнем, у кого длиннее?


Хочу напомнить, что разговор в таком тоне начали Вы. Если уж пытаетесь разобраться в предмете, то задавайте вопросы вежливо и, желаетльно, без наездов на собеседника. Если же Вам разбираться не хочется, то зачем Вы вообще ввязались в дискуссию?

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


Если Вас интересует ответ на этот вопрос, обратите внимание на пример, приведенный в презентации. Полагаю, что ответ будет очевиден.

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


Уважаемый коллега! В детстве, Вы наверняка, смотрели мультик про слоненка, мартышку, попугая и удава. Там наглядно показано, что длину можно мерить в чем угодно. Так удава измеряли и в мартышках, и в слоненках, и в попугаях. Даже маленькие дети понимают, что измерять можно, в чем угодно. В чем удобнее, в том и измерим. Неужели же программист с более чем 10-летним стажем не понимает этой столь простой истины?

G>Но все-таки, я наверное чего-то не понимаю. Приведите примеры, в каких ситуациях и почему именно "выгоднее" измерять объем кода "в операторах". Желательно — живой пример из своего 11-летнего опыта. Просим-просим.


Пример есть в презентации. Если же Вам что-то непонятно, задайте вопрос без ехидства. Я отвечу. На вопросы, сформулированные в таком тоне, как сейчас, я отвечать не буду.

G>Раз все настолько сложно и неоднозначно — что понятие "код" берется в кавычки и у этого понятия возможны оказывается разные (!) толкования, то вам следовало посвятить понятию "кода" отдельные слайды вашей презентации. Ваш труд, по видимости, фундаментален, и пересматривает сами основы?


Я не предполагал, что для кого-то банальная истина может быть непонятна. С учетом того, что здесь уже кажется обсуждали, что текст — не единственно возможное представление кода. Поищите, думаю, обсуждение было где-то в марте-апреле.

G>А-а, ну тогда понятно. А можно мне с рацпредложением выступить? Нельзя-ли тот длинный тупой код, в сравнении с которым у вас короче в 5 раз получается, вообще не писать, а? Может, все-таки, сразу нормальный, краткий и правильный код написать? Ну, подумать там как следует (это фаза "дизайн" называется, до половины времени разработки у некоторы занимает), и написать нормально, нет? Так не пойдет? Или по вашему надо сначала хреновню написать, а потом "свертыванием" заниматься?


Я, конечно, "за". Но кто будет "сворачивать" "код" на стадии "дизайна"? И какими методами? Ах, да, Вы опять скажете, что на стадии дизайна кода еще нет. Ведь, как же! Код еще не написан! А его уже пытаются сократить!!! Простая мысль о том, что одна из задач проектирования — это разработка архитектуры, при которой объем кода минимален, Вам не приходит в голову.

Ведь Вы же код меряете только в уже написанных строках! А о том, что иерархию из 115 классов (хотя бы их код и будет минимален) будет трудно сопровождать, Вы как-то не задумываетесь. Если бы задумывались, то, по крайней мере, не спрашивали бы меня, когда код полезно измерять в классах.

КЛ>>Позвольте спросить, Вы утверждаете, что код, написанный программистом-стажером и профи, содержит одинаковое количество багов на 1000 строк? Если Ваш ответ "да", то Вы страшно далеки от реальных проектов. Ибо количество ошибок у стажера может превышать количество ошибок у профи в десятки раз.


G>Я не понимаю, причем тут программист-стажер. Мы кажется тут все с 10+ опытом, говорим о программировании как о профессиональной деятельности, и презентации пишем для настолько умных программистов, что им не надо принципов построения слоеных систем объяснять?


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

КЛ>>Сократить подобное различие может лишь четкая методология и формальный процесс. Но и после плотность ошибок все равно различается в разы.


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


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

G>Архитектура разъезжается только по причине неучтенных на тапе проектирования требованиях, частью которых являются юзкейсы. Придуманные вами термины забавны, конечно, но тока я не припомню, чтобы кто-нибудь классы из объектов выводил. Честно — увидел бы такую дичь — запомнил бы .


Честно говоря, это уже не забавно, когда человек под объектом понимает только переменную, созданную на основе класса. А то, что в реальном мире (или в предметной области) существуют объекты, которые не являются переменными, например, "лестница", "стул", "стол" — человек уже не понимает. Это странно. Можно подумать, Вы никогда не видели классов типа Window, Folder, Book, Film и т.д. — которые созданы на основе объектов реального мира.

G>С чего вы взяли, что люди должны тратить на ваш труд свое время? Вам тут никто и ничего не обязан. Да и презентация у вас откровенно слаба, для студента ничего, а для технаря вообще никак. Вы бы не позорились с докладами на конференциях, побольше читали, да еще поменьше про 11 лет своего опыта говорили — а то люди-то смеяться будут над вами. Я совершенно серьезно это вам говорю. Себе же хуже делаете.


С чего Вы взяли, что я вообще чего-то взял? Презентация выложена для желающих. Вам это неинтересно? Не читайте! И уж тем более не пишите какие-либо отзывы. Хотя бы потому, что написать вежливо, по-существу и конкретно у Вас не получается. А вычитывать подростковую грубость мне неинтересно.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re: О наследовании, иерархиях и проектировании (философское)
От: borisman3 Канада http://paskoboris.blogspot.com/
Дата: 05.06.07 20:59
Оценка: 81 (7) +1
Добрый день.

Хотел бы внести свои 5 копеек.

1. Благодарности

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

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

2. Применение ТРИЗ к разработке ПО

Применить готовые наработки ТРИЗ к разработке ПО заманчиво, но этому может помешать ряд обстоятельств:

(по моим скромным данным) ТРИЗ изначально был предназначен для решения ИЗОБРЕТАТЕЛЬСКИХ задач в технике. Проблемная область технического изобретательства в чем-то похожа на область разработки ПО, но во многом от нее отличается, а именно:
— в технической изобретательской задаче мы имеем дело с более жесткими ограничениями, накладываемыми на техническое решение
— временные требования, предъявляемые к процессу решения технической изобретательской задачи как правило значительно более мягкие (так как основная затратная часть — это производство); аналогичная ситуация с денежными и прочими ресурсами
— сложность технических решений все же значительно ниже по сравнению с программными решениями, в которых, по известному замечанию Дейкстры, сознание человека вынуждено работать с размерностями от байта и до нескольких сотен мегабайт, что составляет разницу в 9 порядков (сейчас ситуация стала только хуже).

Если мы вспомним историю самого ТРИЗ, то г-н. Альтшуллер, разработчик теории, сетовал на то, что что изобретатели, даже самые сильные, работают неэффективным методом многочисленных проб и горестных ошибок. Т.е. в области технического изобретательства метод проб и ошибок (в т.ч. мозговой штурм) хотя и неэффективен, тем не менее является приемлемым способом решения практических задач. К сожалению, в разработке ПО никто даже и не думает о переборе вариантов, настолько их много.

Последний тезис, к сожалению, показывает не то, что теория г-на Альтшуллера была бы хорошо применима к разработке ПО. Наоборот он показывает, что разработка ПО существенно отличается от изобретательских технических задач, для которых разрабатывалась теория, и, хотя адаптация ТРИЗ была бы крайне ЖЕЛАТЕЛЬНА, возможности для такой адаптации остаются под вопросом.

Сам г-н. Альтшуллер приобрел определенный опыт в на ниве изобретательства, проанализировал немало готовых решений (в т.ч. из патентного бюро) перед тем, как сформулировать свою теорию. То есть, ему пришлось провести немалую работу по анализу предметной области.

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

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

3. О конкретных принципах ТРИЗ

К сожалению, многие принципы ТРИЗ не могут быть применены к реальности разработчика ПО, о чем неоднократно заявляли участники форума.

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

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

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

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

4. Касательно структуры Вашего доклада

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

Злую шутку сыграл так же и тот факт, что Вы смогли предоставить лишь презентацию доклада, а сам доклад (в Вашем изложении) остался за кадром. Отсюда большое количество (обоснованных, в общем-то) вопросов и непонимания со стороны участников форума.

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

5. Заключение

В заключении хотелось бы еще раз пожелать Вам творческих успехов. Несомненно, если Вам удастся продвинуться хотя бы на несколько шагов дальше в избранном Вами направлении, все только выиграют.
Re: О наследовании, иерархиях и проектировании (философское)
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.04.07 14:32
Оценка: 15 (1) :))) :))) :)
Здравствуйте, Кирилл Лебедев, Вы писали:

КЛ>Ответу на этот вопрос и посвящена презентация «Проектирование игровых и бизнес-программ. Разработка архитектуры, устойчивой к изменениям», которая была показана на Конференции разработчиков игр 2007. В презентации демонстрируется, что понятие «идеальная программа» существует и в программировании, и что это понятие можно успешно использовать для решения задач проектирования.


Хватило сил дочитать до 27-го слайда. В очередной раз понял, чем программисты отличаются от других людей -- все те этапы, которые вы расписывали на 27-и слайдах, в голове программиста проносятся в автоматическом режиме за доли секунды.

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


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
О наследовании, иерархиях и проектировании (философское)
От: Кирилл Лебедев Россия http://askofen.blogspot.com/
Дата: 19.04.07 13:29
Оценка: 12 (1) -4 :)))
Нередко при проектировании программы разработчика одолевают «муки творчества»: возможен и один вариант, и другой – какой лучше выбрать? В условиях неопределенности программист выбирает подчас самый привычный вариант и нередко «промахивается». Расплата за «промахи» всегда одна – резкое усложнение архитектуры программы. Чем больше «промахов», тем больше усложнений. И где-то к середине проекта архитектура программы становится настолько сложной и запутанной, что даже самое, на первый взгляд, простое и небольшое изменение требует серьезной и кропотливой работы. Избежать подобных ошибок мог бы помочь проектировщику некий ориентир.

В теории решения изобретательских задач (ТРИЗ) таким ориентиром является понятие «идеальная система». Техническая система считается идеальной, если ее вес, объем и площадь стремятся к нулю, а способность выполнять работу при этом не уменьшается. Иными словами, идеальная техническая система – это когда системы нет, а ее функция выполняется.

Понятие идеальности очень важно при решении изобретательских задач. Оно помогает изобретателю сконцентрироваться на задаче и отвлечься от конкретных реализаций той или иной технической системы или подсистемы. Как бы сказали программисты, изобретатель начинает мыслить функциями (интерфейсами), а не конкретными реализациями. Такой подход к решению изобретательских задач не случаен, т.к. увеличение степени идеальности – один из законов развития технических систем. А как обстоят дела в программировании?

Ответу на этот вопрос и посвящена презентация «Проектирование игровых и бизнес-программ. Разработка архитектуры, устойчивой к изменениям», которая была показана на Конференции разработчиков игр 2007. В презентации демонстрируется, что понятие «идеальная программа» существует и в программировании, и что это понятие можно успешно использовать для решения задач проектирования.
С уважением,
Кирилл Лебедев
Software Design blog — http://askofen.blogspot.ru/
Re[13]: Собственный минус
От: Gaperton http://gaperton.livejournal.com
Дата: 04.05.07 13:56
Оценка: +1 -2 :))) :)
Здравствуйте, Кирилл Лебедев, Вы писали:

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

ЗЫ: (Жжошь, еще пиши)
ЗЗЫ: Скажу от лица всех — мы тут, на РСДН, не как некоторые — мы за чужие минусы не прячемся!
Re[18]: Точность nick-а
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 04.05.07 20:33
Оценка: +1 :))) :)))
Здравствуйте, Gaperton, Вы писали:

G>Вот у вас там наметился с eao конструктивный разговор. Здесь: http://rsdn.ru/Forum/Message.aspx?mid=2474034&amp;only=1
Автор: Кирилл Лебедев
Дата: 04.05.07
Вот там и встретимся.


Все-таки eao197.
Просто eao -- это другой, гораздо более раскрученный бренд.


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: О наследовании, иерархиях и проектировании (философское)
От: Gaperton http://gaperton.livejournal.com
Дата: 02.05.07 14:00
Оценка: 93 (4) +1 -1
Здравствуйте, Кирилл Лебедев, Вы писали:

КЛ>Ответу на этот вопрос и посвящена презентация «Проектирование игровых и бизнес-программ. Разработка архитектуры, устойчивой к изменениям», которая была показана на Конференции разработчиков игр 2007. В презентации демонстрируется, что понятие «идеальная программа» существует и в программировании, и что это понятие можно успешно использовать для решения задач проектирования.


Просмотрел. Кратко мнение:
Что хорошо — это то, что вы понимаете, что сценарии применения (вы их называете "полезными функциями", в литературе же они проходят как use cases, user stories, и пр.) являются центральным аспектом при разработке и верификации дизайна системы. Это делает ваш подход в целом рабочим — на самом деле, многие не понимают важности анализа сценариев и городят. Это отличная, и правильная догадка. Единственно — полезные функции далеко не всегда ограничиватся границами модулей, как предполагается у вас.

Что плохо — этим все и ограничивается. Вы не рассказали ни о процессе разработки дизайна (изложенное — довольно наивный подход, так студенты систему проектируют — правильно eao197 написал), ни о правилах верификации дизайна, ни об общих ООП правилах — design guidelines. Упомянуты "слоеные"системы — однако не указаны элементарные правила, которые не надо нарушать при их конструировании.

Список литературы, который вы приводите, тоже не впечатляет. Паттерны не имеют отношения к проектированию — не думают проектировщики паттернами, патерны не более чем отходы их жизнедеятельности. Гради Буч — написал научно-популярную книжку об ООП, которая рассказывает что это такое, но не дает ответа на вопросы "как". В списке — ни одной ссылки на книги по технике работы с требованиями, также отсутствуют ссылки на книги по процессам проектирования и анализа. Списк литературы очень показателен — он наглядно характеризует источники и жизненный опыт автора. Добавили бы вы в список литературы Rumbaugh, Jordan или Jacobson, прочитав их литературу — глядишь и презентация выглядела бы по другому .

Но это по большому счету мелочи (как и притянутый за уши ТРИЗ, которому посвящается много времени). Главная мысль — про полезные функции, и эта мысль в целом полезна. Комментировать по деталям — не вижу смысла. В качестве чтения — какая-нибудь основополагающая книга по RUP для начала, и вы сами измените свою презенацию.
Re[11]: ...продолжение
От: Gaperton http://gaperton.livejournal.com
Дата: 04.05.07 09:00
Оценка: +5 -1
Здравствуйте, Кирилл Лебедев, Вы писали:

G>>Не поясните, на основании чего именно и каким образом вы можете делать "качественные" оценки?


КЛ>На основании 11-летнего опыта разработки программ и порядка 30 завершенных проектов. Если Вас это не устраивает, звиняйте, других оценок пока нет. Впоследствии — будут.


Ой, какой разговор пошел . На основании одного факта, что вы в индустрии провели 11 лет своей жизни, вы, боюсь, здесь никому и ничего не докажете . Хотя бы потому, что не вы один тут имеете опыт 10+ лет. Это не есть ваша уникальная особенность. Посмотрите, кто вам минусы поставил — у них у всех 10+. И у меня тоже. Что дальше? Пиписьками меряться начнем, у кого длиннее?

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

G>>Код меряется в строках кода. Google по слову LOC, или SLOC.


КЛ>Код — многоуровневая иерархическая структура.

КЛ>И если Вы измеряете его строками, еще не значит, что эта единица измерения единственно правильная. Иногда выгоднее измерять код и в операторах, и в классах.
Код меряется в строках кода. Его так весь мир измеряет. Потому что только эта метрика дает мало-мальски приличные корелляции со временем разработки и с количеством ошибок. Количество классов не является метрикой объема кода, количество операторов дает строгую корелляцию с количеством строк кода, поэтому меряют все равно в строках кода — они проще в подсчете.

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

КЛ>Да и читали Вы презентацию, судя по всему, невнимательно. Там слово "код" приведено в кавычках, чтобы подчеркнуть возможность различного толкования кода — и как набора операторов, и как набора классов...


Раз все настолько сложно и неоднозначно — что понятие "код" берется в кавычки и у этого понятия возможны оказывается разные (!) толкования, то вам следовало посвятить понятию "кода" отдельные слайды вашей презентации. Ваш труд, по видимости, фундаментален, и пересматривает сами основы?

G>>Таки в сравнении с чем ваша методика позволит уменьшить объем кода, во сколько раз, и благодаря чему (вы, эта, когда качественный вывод делаете, обязательно должны объяснить в сравнении с чем и благодаря чему — а то получается что "у нея внутре неонка и думатель")


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


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

G>>Количество багов меряется метрикой Defects/КLOC, что по русски означает "количество ошибок на тысячу строк кода", и называется "плотностью ошибок" (defects density). Исследования метрик реальных проектов показывают, что эта метрика одна из самых стабильных, причем до такой степени, что слабо зависит от применяемого языка программирования. Что означает, что количество ошибок в среднем большей степени определяется объемом кода.


КЛ>Позвольте спросить, Вы утверждаете, что код, написанный программистом-стажером и профи, содержит одинаковое количество багов на 1000 строк? Если Ваш ответ "да", то Вы страшно далеки от реальных проектов. Ибо количество ошибок у стажера может превышать количество ошибок у профи в десятки раз.


Я не понимаю, причем тут программист-стажер. Мы кажется тут все с 10+ опытом, говорим о программировании как о профессиональной деятельности, и презентации пишем для настолько умных программистов, что им не надо принципов построения слоеных систем объяснять?

КЛ>Сократить подобное различие может лишь четкая методология и формальный процесс. Но и после плотность ошибок все равно различается в разы.


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

G>>У вас этот принцип нарушается? Ну тогда объясняйте — в сравнении с чем это у вас плотность ошибок скаканет и за счет чего? Неужто у вас в презентации расказанно как объем любого наперед взятого кода в 2-5 раз сократить? Ну ни в жисть не поверю. Хотите проверим? Давайте я вам сюда код приведу, а вы его хотя бы в два раза сократите?


КЛ>Не передергивайте. Объем кода можно сократить, но далеко не любого. В презентации приведены и ситуации, и конкретные примеры.

А, ну понятно. Это в корне меняет дело.

G>>Архитектура разъехжается за счет прлпущеных при анализе юзкейсов. Разъезжается она потому, что всех кейсов, которые в будущем появятся, вы в принципе предусмотреть не сможете, никакой ТРИЗ вам не поможет. Тогда приходится проводить рефакторинг (что вы и показываете на элементарном примере примерно четверть своей презентации).


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


Архитектура разъезжается только по причине неучтенных на тапе проектирования требованиях, частью которых являются юзкейсы. Придуманные вами термины забавны, конечно, но тока я не припомню, чтобы кто-нибудь классы из объектов выводил. Честно — увидел бы такую дичь — запомнил бы .

G>>Никакого метода у вас я не заметил. Am I wrong? Может я пропустил чего, так вы скажите.


КЛ>Неудивительно. Ведь, судя по ошибкам в названиях, Вы презентацию не читали. Скорее всего — пробежались беглым взглядом, и бросились писать отзыв. Хотя отзывом назвать это трудно. Нет ни конкретных примеров, ни конкретных вопросов по приведенным примерам. Да и обойтись без наездов тоже не можете. Так что, в итоге имеем не отзыв, а банальный обсер на форуме со стороны не разобравшегося в предмете специалиста. Эмоционально понятно. Но для технаря слабовато.


С чего вы взяли, что люди должны тратить на ваш труд свое время? Вам тут никто и ничего не обязан. Да и презентация у вас откровенно слаба, для студента ничего, а для технаря вообще никак. Вы бы не позорились с докладами на конференциях, побольше читали, да еще поменьше про 11 лет своего опыта говорили — а то люди-то смеяться будут над вами. Я совершенно серьезно это вам говорю. Себе же хуже делаете.
Re[5]: О наследовании, иерархиях и проектировании (философск
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 04.05.07 14:28
Оценка: 5 (1) +4
Здравствуйте, Кирилл Лебедев, Вы писали:

E>>Не могли бы вы здесь, без ссылок на свои статьи или части своей презентации, сформулировать, что нового показала ваша презентация по сравнению, хотя бы, с данной главой из книги Страуструпа?


КЛ>Вы хотите, чтобы я назвал отличия? Ну, что ж, держите:


Спасибо, удержал. Не сложно было, знаете-ли.
Позволил себе перегруппировать и прокомментировать их.

КЛ>
  • Понятие идеальной программы. Почему выгодно ориентироваться на идеальность.

    Под идеальностью, надо полагать, понимается вот это (или вокруг этого):

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

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

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

    В качестве примера: есть такая Unix-овая библиотека, getopt. Довольно старая и, соответственно, дизайн у нее старый. Я пользуюсь ее воплощением в C++ в библиотеке ACE. Код по обработке опций командной строки получается весьма избыточным. Но, в отличии от библиотек, которые я использовал ранее, он очень понятный, легко расширяется и, что не маловажно оказалось, очень легко переносит copy&paste из проекта в проект.

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

    По этим причинам стремление к универсальности кода, о чем и говорит Страуструп, мне представляется гораздо более близким к действительности, чем ваша "идеальность".

    КЛ>
  • Этапы развития "кода" (как архитектуры, так и самого кода). Волнообразная модель.
    КЛ>
  • Схлопывание иерархии в класс.

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

    КЛ>
  • Метод группировки разнородных сущностей. Ему посвящены этапы 1.3 и 2.2. Обычно группируют, находя похожие атрибуты и вынося их в базовые классы. В презентации говорится, что контекст для группировки нужно искать со стороны, т.е. не по похожести атрибутов, а потому, как и для чего объекты используются.
    КЛ>
  • Этапы свертывания. В частности, то, что задание одинаковых интерфейсов для различных сущностей — первый шаг к дальнейшему их свертыванию.
    КЛ>
  • То, что сначала нужно выявлять не классы/понятия, а действия. И проектировать конкретные структуры данных под эти операции (назовем их макро-операции или бизнес-функции).

    Слова "обычно группируют", вполне возможно, имеют какой-то смысл в вашей конкретной обстановке. Вероятно, вы имеете все основания сказать: "Мы обычно смотрим на описание задачи, выделяем все существительные и объявляем, что каждому существительному будет соответствовать свой класс. А потом уже пытаемся заставить эти классы как-то взаимодействовать".

    Мне повезло и на первом курсе преподаватель как-то сумел привить нам навыки структурного проектирования и модульного программирования (язык был подходящий, Turbo Pascal). Так вот там декомпозиция проводится именно по действиям и задачам, а структуры данных используются для переноса или накопления информации между действиями. Соответственно, переход к ООП произошел естественным образом -- ведь объект это не более чем объединение под одной крышей данных и кода, их обрабатывающего. При этом объекты не более чем еще один способ оформить те действия, которые программа должна выполнить. Посему лично я читая у Страуструпа или Буча описания классифицирования сущностей просто подразумеваю что рассматривается необходимость выделения объектов для выполнения конкретных действий. Т.е. все подчинено выполнению действий.

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

    КЛ>
  • То, что различия между объектами "надо продвигать вниз" (на нижние слои).
    КЛ>
  • То, что нижние слои поглощают средние.

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

    Вот эти ваши два постулата напоминают мне тот наукоподобный текст.

    E>>[i]** Не подразуевает ли это тчательную проработку use-case-ов?

    КЛ>Такую обтекаемую фразу можно понимать, как угодно. Я предпочитаю более точное указание.

    Я имею в виду вот что: нельзя реализовать в программе то, что ты сам не понимаешь. А чтобы понять, нужно максимально полно представить себе все сценарии использования (use-case) будующей программы. А еще лучше -- стать ее пользователем и специалистом в конкретной прикладной области.

    КЛ>Встречный вопрос. В части 3 своей книги (http://www.helloworld.ru/texts/comp/other/oop/) Гради Буч разбирает ряд конкретных задач. Не могли бы Вы показать, как, используя рекомендации Страуструпа, можно решить хоть одну из приведенных задач?


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

    Здесь с год назад IT какую-то проблему описывал с генерацией кода извлечения объектов разных типов из БД (не нашел, может кто подскажет). Интересно было бы и для этой задачи вашим способом решение увидеть.

    Или вот еще: если же вы так уверены в собственной методике, то попробуйте ради хохмы изложить свое видение такой задачки: есть инструмент Mxx_ru
    Автор: eao197
    Дата: 09.04.06
    . Сейчас он заточен под C/C++. Мне требуется перепроектировать его под поддержку языка D, но так, чтобы в одном композитном проекте можно было сочетать C/C++ и D библиотеки, т.е. это означает, что C/C++ и D проекты нуждаются в разделении некоторой части параметров компиляции (например, т.к. RELEASE или DEBUG режим). Исходники здесь

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

    И уж тем более поверить, что получение "идеальной системы" для сложных задач возможно с помощью какой-то конкретной методики... Вспоминая Страуструпа:

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



  • SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[5]: А объяснить минус?
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 14:53
    Оценка: +2 -3
    Будьте вежливы
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[10]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 03.05.07 22:32
    Оценка: -4 :)
    Здравствуйте, Gaperton, Вы писали:

    G>Не поясните, на основании чего именно и каким образом вы можете делать "качественные" оценки?


    На основании 11-летнего опыта разработки программ и порядка 30 завершенных проектов. Если Вас это не устраивает, звиняйте, других оценок пока нет. Впоследствии — будут.

    G>Код меряется в строках кода. Google по слову LOC, или SLOC.


    Код — многоуровневая иерархическая структура. И если Вы измеряете его строками, еще не значит, что эта единица измерения единственно правильная. Иногда выгоднее измерять код и в операторах, и в классах.

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

    G>Таки в сравнении с чем ваша методика позволит уменьшить объем кода, во сколько раз, и благодаря чему (вы, эта, когда качественный вывод делаете, обязательно должны объяснить в сравнении с чем и благодаря чему — а то получается что "у нея внутре неонка и думатель")


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

    G>Количество багов меряется метрикой Defects/КLOC, что по русски означает "количество ошибок на тысячу строк кода", и называется "плотностью ошибок" (defects density). Исследования метрик реальных проектов показывают, что эта метрика одна из самых стабильных, причем до такой степени, что слабо зависит от применяемого языка программирования. Что означает, что количество ошибок в среднем большей степени определяется объемом кода.


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

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

    G>У вас этот принцип нарушается? Ну тогда объясняйте — в сравнении с чем это у вас плотность ошибок скаканет и за счет чего? Неужто у вас в презентации расказанно как объем любого наперед взятого кода в 2-5 раз сократить? Ну ни в жисть не поверю. Хотите проверим? Давайте я вам сюда код приведу, а вы его хотя бы в два раза сократите?


    Не передергивайте. Объем кода можно сократить, но далеко не любого. В презентации приведены и ситуации, и конкретные примеры.

    G>Архитектура разъехжается за счет прлпущеных при анализе юзкейсов. Разъезжается она потому, что всех кейсов, которые в будущем появятся, вы в принципе предусмотреть не сможете, никакой ТРИЗ вам не поможет. Тогда приходится проводить рефакторинг (что вы и показываете на элементарном примере примерно четверть своей презентации).


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

    G>Никакого метода у вас я не заметил. Am I wrong? Может я пропустил чего, так вы скажите.


    Неудивительно. Ведь, судя по ошибкам в названиях, Вы презентацию не читали. Скорее всего — пробежались беглым взглядом, и бросились писать отзыв. Хотя отзывом назвать это трудно. Нет ни конкретных примеров, ни конкретных вопросов по приведенным примерам. Да и обойтись без наездов тоже не можете. Так что, в итоге имеем не отзыв, а банальный обсер на форуме со стороны не разобравшегося в предмете специалиста. Эмоционально понятно. Но для технаря слабовато.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[15]: О наследовании, иерархиях и проектировании (философс
    От: fmiracle  
    Дата: 22.04.07 20:41
    Оценка: :))) :)
    Здравствуйте, VladD2, Вы писали:

    VD>Вообще-то это мошейничество. Бывают случае когда ОО-декомпозиция полнейший оверкил, а структрурная рулит. Бывает наоборот. Так что такой пример приведенный в качестве доказательства превосходства ОО-декомпозиции ни что иное как подлог.


    Это не подлог!! Это... ммм... Тщательно отобранные факты, вот!
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Re[38]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 26.05.07 11:48
    Оценка: +1 -1 :))
    Здравствуйте, WolfHound, Вы писали:

    WH>Я его знаю. И оно мне не интересно. Ибо таки "решения" я прекратил создавать много лет назад.


    КЛ>>Я программирую на C++.

    WH>А другие языки известны?

    WH>Мда.

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

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

    Ваша "способность" отвечать на вопросы так же поражает. Вот несколько примеров:

    WH>>>Да я уже устал повторять. Метаданные контролов это описание свойств, событий,...

    КЛ>>Для проектирования нужны конкретные примеры. Нельзя спроектировать дом, не зная, для кого он предназначен.
    WH>Что!?!? Еще раз повторить?

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

    Еще раз повторю, то, что понятно Вам, не факт, что понятно Вашему собеседнику.

    WH>А то что на винде сигналы от пользователя приходят мнгновенно, а через инет могут пробиваться секунды известно?

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

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

    WH>Бесконечного не требуется. Но должна быть возможность в любое время добавить любой контрол.

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

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

    WH>Так зачем для каждого контрола хранить текст и картинку?

    А каково Ваше решение? По особому обрабатывать каждый контрол?

    WH>Лейауту не нужно знать что за контролы на нем лежат.

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

    WH>Алгоритм размещения у каждого лейаута свой.

    Если layout'ов не так много, то не страшно. А если много, то у Вас получается банальное дублирование кода и данных.

    КЛ>>А, собственно говоря, что в этом страшного? Ваш код тоже поменяется, если Вы решите размещать контролы вдоль сплайна.

    WH>Мой нет. Я только добавлю новый лейаут. И все. Ни что другое задето не будет.
    Т.е. банально продублируете код.

    WH>Может просто нужно понять что это такое?

    WH>Реально эти интерфейсы позволяют полностью абстрагировать сериализатор и дизайнер от конкретных контролов.
    void * тоже помогает "абстрагировать".

    WH>Конкретно с этими интерфейсами работают только сериализаторы и дизанеры. Причем это какраз те сущьности которые только с object'ами работать и могут. Иначе их придется завязать на конкретные контролы, а это неприемлемо.

    WH>Весь остальной код строго типизирован.
    Сериализаторов и дизайнеров несколько или по одной штуке?

    Мне вообще непонятно в Вашем решении вот что. Допустим у Вас есть N контролов. С каждым контролом ассоциированы свои метаданные. Допустим, метаданные каждого контрола состоят из M свойств (не уверен, что правильно употребляю это слово). А еще у Вас имеется K форматов файлов, в которые нужно данные сериализовать. Сколько всего у Вас будет классов свойств?

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

    Все, что Вы пока продемонстрировали, это решение уровня:

    std::vector<void *> vec;


    Ну, на крайний случай —

    class Object
    {
    public:
       virtual Object() {}
       virtual Read(istream & is) = 0;
       virtual Write(ostream & os) const = 0;
    };
    
    std::vector<Object *> vec;


    Только зачем-то наплодили лишних интерфейсов.

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

    WH>А какже сериализаторы? А дизайнеры?

    Reader и Writer считывают и записывают структуры данных определенного формата. Но они не имеют доступ к модели целиком.

    КЛ>>ИМХО, такой код только запутывает. В малых дозах он раздражает. А в огромных количествах просто становится несопровождаемым. Не забывайте, что после Вас программу может сопровождать совсем другой программист.

    WH>Любой квалифицированный программист знающий C#2 поймет что тут написано вобще не напрягаясь.
    К сожалению, проблемы сопровождения возникают не из-за того, что сопровождающий программист плохо знает язык программирования.

    WH>Вот я пишу на все что компилируется. Ну или хотябы интерпритируется.

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

    WH>А что в замен? Хардкодить тултипы везде и всюду?

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

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

    WH>Угу после чего прибегает заказчик с криком "Я тут такую классную фичу придумал! Она нам обязательно нужна!"
    WH>А потом еще, и еще, и еше...
    После этого Вы спокойно формулируете новые требования к системе, добавляете их к старым требованиям, проверяете их на непротиворечивость. Затем — так же спокойно реализуете и выставляете Заказчику счет за change request.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[54]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 27.06.07 09:13
    Оценка: 32 (3)
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Я хочу увидеть sequence diagram а) сериализации, б) загрузки контрола редактором.


    Редактор использует тот же самый сериализатор, так что это одно и тоже. UML я тебе рисовать не буду, потому что это нехилое количество работы, а на словах попробую описать (опустив подробности реализации).
    1) Создается экземпляр сервиса для работы с метаданными
    2) Создается экземпляр класса, описывающий модель сериализованного представления (далее МСП), абстрагированную от конкретного формата сериализации.
    3) Вызывается сериализация корневого компонента.
    4) Создается отображение компонента на МСП
    5) Создается контекст сериализации
    6) Вызывается сериализация элементов компонента (свойств, событий)
    7) Получаем у сервиса метаданных список элементов метаданных компонента.
    8) Для каждого из элементов получаем список возможных владельцев (для собственных свойств в качестве владельца возвращается указатель на сам элемент)
    9) Для каждой комбинации владельца и элемента вызываем метод добавления его в МСП
    10) Если элемент — событие, то проверяем, нужно ли его сериализовать (вызов метода элемента метаданных)
    11) Если сериализация требуется, то обращаемся к методу, возвращающему значение события. В базовой реализации сериализатора этот метод абстрактный, потому что универсального способа сериализации события нет.
    12) Полученное значение записываем в МСП
    13) Если в п.10 имеем не событие, а свойство, то проверяем наличие интерцептора и его желание перехватить конкретное свойство.
    14) Если интерцептор есть и подтвердил то, что он хочет перехватить, то перекладываем задачу получения значения свойства на него.
    15) Если нет, то обращаемся к метаданным для проверки необходимости сериализации.
    16) Если сериализация требуется, то формируем контекст сериализации свойства.
    17) Если для свойства есть кастомный сериализатор, то получаем экземпляр сериализатора и предлагаем ему записать свойство из контекста в МСП
    18) Если значение свойства является компонентом, то проверяем, несет ли ответственность владелец свойства за создание этого компонента.
    19) Если нет — добавляем в МСП ссылку на компонент
    20) Если да — рекурсивно вызываем п.3 и добавляем результат в МСП
    21) Если свойство является коллекцией (реализует IEnumerable), то пробегаемся по всем элементам
    22) Для каждого элемента проверяем, является ли он компонентом
    23) Если да, см. п.18
    24) Если нет, преобразуем объект в строку
    25) Добавляем коллекцию в МСП
    26) Если ни одна из проверок свойства не вернула true, преобразовываем значение свойства в строку и записываем в МСП.
    27) Рекурсивно вызываем сериализацию вложенных компонентов (п.3)
    28) Создаем экземпляр writer, умеющего записывать МСП в требуемый формат
    29) writer рекурсивно обходит МСП (в текущей реализации это визитор) и пишет результат в поток (сейчас это XML).

    Ну что, сильно полегчало?
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[29]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 01.06.07 20:00
    Оценка: 20 (2) +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Именно такой запутанный код и порождается продемонстрированным подходом к наследованию. Особенно, если при этом наследование производится путем вынесения общих атрибутов (здесь я пишу об атрибутах объектов в понимании OOD, а не в понимании .NET) в базовые классы или интерфейсы.


    Ну понятно. Тогда начнем с начала. Забудем пока о наследовании и сосредоточимся на другом.
    Видишь ли, при проектировании любых систем, при любом способе декомпозиции, есть очень небольшое количество правил, которых следует при этом придерживаться в обязательном порядке. Одно из таких правил гласит, что надо максимально возможно снижать связность (coupling в англоязычной литературе) решений. Хитрость в том, как это сделать. Однозначного ответа на этот вопрос нет, но кое что за истекшее время удалось наработать.
    Теперь вернемся к ООП. В самой его (ООП) базе есть специальное решение, которое как раз и предназначено для уменьшения связности. Называется оно инкапсуляция. Суть его крайне проста — мы формализуем все взаимодействия некоего блока кода со всем остальным кодом, выделяем в отдельную сущность, называемую интерфейсом или контрактом, а потом компилятор жестко контроллирует соблюдение этого контракта с обоих сторон. Очевидно, что чем беднее и формальнее контракт, тем ниже связность. Соответственно, если мы стремимся к минимизации связности, то нужно стремится и к минимизации каждого конкретного контракта (не нарушая при этом целостности кода!).
    Но есть еще и наследование, которое здесь обсуждается. Тут есть одна большая засада — дело в том, что в случае наследования в классических языках под одной крышей смешали две сущности — наследование контрактов и наследование реализаций. Второе имеет весьма опосредованное отношение к обсуждаемому вопросу. Остается наследование контрактов. Его можно использовать двояко — во-первых как некий констрейнт, заставляющий соблюдать базовые контракты при декларации соответствия наследуемому. Во-вторых как средство обеспечения полиморфизма.
    Давай теперь взглянем на это дело с точки зрения минимизации связности. То что ты тут предлагаешь ведет к исскуственному раздуванию контрактов и к их деформализации. То есть, просто вынеся в базовый класс атрибуты, не для всех потомков имеющие смысл, ты, на первый взгляд, ничего страшного не совершил. Так, небольшая избыточность (вопросы пожирания лишней памяти и перформанса оставим за кадром). Но это только на первый взгляд. А на практике ты усложнил контракт, что приведет к усложнению его реализации на ровном месте (и усложнению поддержки этой реализации!), и, что куда неприятнее, у тебя появилась у контракта неформализованная часть. Ну то есть никаким образом компилятор не сможет догадаться, что вот этот наследник атрибут Х использует, а вон тому он нафик не нужен. Отюда сразу вылазит пренеприятнейшая особенность — потребители контракта могут получить совсем не то, что ожидают.
    Поэтому на практике делают прямо противоположное тому, что ты тут предлагаешь. Не нужно минимизировать количество контрактов, они формальны, а следовательно контроллируются компилятором и легко подвергаются автоматизированному рефакторингу. Нужно минимизировать размер реализаций в целом и каждой из них в частности, потому что реализацию как правило приходится рефакторить уже руками.

    КЛ>Я писал не о количество классов/интерфейсов вообще, а о количестве классов/интерфейсов, приходящихся на одну сущность.


    Сущность понятие растяжимое. Собственно, их количество зависит от проведенной декомпозиции. Это во-первых. А во-вторых частенько в программу вносятся синтетические сущности, нацеленные как раз на упорядочивание кода и облегчение поддержки. Ты там вроде GoF поминал. Посмотри — сколько паттернов как раз и порождают такие сущности. Визитор к примеру. Ты же не будешь спорить с тем, что код с визитором на десятках типов узлов будет легче поддерживать, нежели рукопашную диспетчеризацию свитчем? Или будешь?

    AVK>>P.S. Кстати, а как с точки зрения твоей теории выглядит АОП? Как совсем неверный подход?

    КЛ>Не скажу, что много читал про АОП.

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

    КЛ> Но из того, что видел, считаю: идея, как мне кажется, в правильном направлении, но реализация — нехорошая.


    Я не про реализацию, а про идею как раз. Если она для тебя хорошая, то как тогда быть с тем фактом что вынесение аспектов в изолируемые элементы увеличивает "количество классов/интерфейсов, приходящихся на одну сущность"? Причем заметно так увеличивает.
    ... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[9]: ...продолжение
    От: Gaperton http://gaperton.livejournal.com
    Дата: 03.05.07 16:46
    Оценка: 16 (1) +1 -1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Я говорил о количественной статистике — она действительно не собиралась. Но ни что не мешает производить качественную оценку. А о ней я сказал. Методика позволяет:


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

    КЛ>а) Сократить код.

    Код меряется в строках кода. Google по слову LOC, или SLOC. Таки в сравнении с чем ваша методика позволит уменьшить объем кода, во сколько раз, и благодаря чему (вы, эта, когда качественный вывод делаете, обязательно должны объяснить в сравнении с чем и благодаря чему — а то получается что "у нея внутре неонка и думатель")

    КЛ>б) Существенно сократить количество багов (от 2 до 5).

    Количество багов меряется метрикой Defects/КLOC, что по русски означает "количество ошибок на тысячу строк кода", и называется "плотностью ошибок" (defects density). Исследования метрик реальных проектов показывают, что эта метрика одна из самых стабильных, причем до такой степени, что слабо зависит от применяемого языка программирования. Что означает, что количество ошибок в среднем большей степени определяется объемом кода.

    У вас этот принцип нарушается? Ну тогда объясняйте — в сравнении с чем это у вас плотность ошибок скаканет и за счет чего? Неужто у вас в презентации расказанно как объем любого наперед взятого кода в 2-5 раз сократить? Ну ни в жисть не поверю. Хотите проверим? Давайте я вам сюда код приведу, а вы его хотя бы в два раза сократите?

    КЛ>в) Существенно упростить сопровождение (архитектура не разъезжается).

    Архитектура разъехжается за счет прлпущеных при анализе юзкейсов. Разъезжается она потому, что всех кейсов, которые в будущем появятся, вы в принципе предусмотреть не сможете, никакой ТРИЗ вам не поможет. Тогда приходится проводить рефакторинг (что вы и показываете на элементарном примере примерно четверть своей презентации). Никакого метода у вас я не заметил. Am I wrong? Может я пропустил чего, так вы скажите.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 16:45
    Оценка: 8 (1) +2
    Здравствуйте, ZevS, Вы писали:

    ZS>Короткие лаконичные программы на Perl просто ужасны.


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

    Чтобы программа стала понятнее она должна достигать компактности не за счет использования малопонятных умолчаний, и темболее не за счет запихивания всего в одну строку и жервтования отбивкой. Компактность должна достигаться за счет большей декларативности. Тут есть разные подходы:
    1. Выноск части логики в библиотеки.
    2. Использование более выскоуровневых языков оперирующих прикладными понятиями (DSL-ей).
    3. Использовние высокоуровневых конструкций вроде паттерн-матчинга вместо if-ов и switch-ей (а порой и вместо наследования и виртуальных методов).
    4. Использовние декомпозиции на уровне фукнций и рекурсии.

    В общем, компактность должна достигаться за счет повышении абстракции кода. Потому Перловый код и является плохочитаемым, что он не повышает абстрацию, а наоборот запихивает болшой объем конкретики на еденицу площиди и во всю использует неочевидные умочлчания.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[35]: ...продолжение
    От: WolfHound  
    Дата: 25.05.07 14:40
    Оценка: 8 (2) +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Это зависит от контекста. Вон даже wikipedia утверждает, что не существует единственного формального определения термина метаданные. Откуда ж я знаю, что Вы имеете в виду?

    Да малоли чего утверждает вмкипедия.

    КЛ>Ну, форму в некотором роде тоже можно рассматривать в виде контрола. В общем, не важно. Вот и привели бы примеры метаданных контрола. А раз не привели — то чего же пенять?

    Да я уже устал повторять. Метаданные контролов это описание свойств, событий,...

    КЛ>Как Вы уже наверное догадались, данные о форме и контролах представляются в виде реляционной базы данных (пусть и весьма упрощенной). Соответственно, ничто не мешает добавить метаданные отдельного контрола в специальную таблицу. А для того чтобы Вася Пупкин не имел с этим проблем, такое добавление осуществляется при помощи специального инструментария.

    А зачем все это? Если Вася может просто написать контрол, разметить его атрибудами и кинуть сборку в определенную папку. И система все сама подхватит.

    КЛ>Вот это, как раз, и называется абстрагированием, т.к. для описания структуры формы (или контрола) — что в чем содержится — совершенно не важен тип конкретных объектов. Т.е. в рамках конкретной задачи — структурирования — мы абстрагируемся от несущественных для этой задачи деталей.

    Ну и зачем собственно это нужно?
    Имея интерфейсы контролов + метаданные все это делается куда проще.

    КЛ>Даже в MS Visual Studio или в MS Word'е ограниченное количество контролов. При всем уважении, не думаю, что у Вас система как-то резко сложнее.

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

    КЛ>>>При заполнении эти поля можно оставить пустыми.

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

    КЛ>>>Не вижу здесь никакого хакерства. Наоборот, я использовал обобщение. Алгоритму расположения все равно, что располагать и на чем располагать. Сам алгоритм от этого не изменится — он работает с прямоугольниками.

    WH>>Те ты таки настаиваешь на этом? И после такого ты утверждаешь что твои программы легко поддерживать?
    КЛ>А Вы голословно не бросайтесь такими утверждениями. Возьмите конкретный пример и разберите, где и какие сложности возникнут.
    Ты заменяешь вполне конкретную сущность некими мутными прямоугольничками.
    Давай еще в машинных кодах писать будем. Ибо твои посылки из тойже серии.

    КЛ>Что это за связь и в чем она состоит?

    В том что ты связал два совершенно разных лейаута.
    Зачем?

    КЛ>А вообще-то, я очень сильно сомневаюсь, что layout алгоритм как-то сильно изменится в ближайшие лет 10 — 20. Оперирует он прямоугольниками и боксами и будет оперировать еще долго. Сильно сомневаюсь, что для расположения контролов на форме Вы будете оперировать тетраэдрами.

    Так давай разделять лейауты. И рендер. Это разные вещи.
    Смешивание их приводит к кучи гемороя.

    КЛ>Если поняли, то и хорошо. Значит еще одно возражение снимается. С другой стороны, если все-таки непонятно, то лучше, наверное, рассказать и про Dock, и про Follow. Для профилактики от неверного понимания.

    Про Follow можешь посмотреть в WinForms2

    КЛ>Вы приводите возражения, не приводя примеры. Взяли бы да и разобрали конкретный пример. Какой контейнер добавим? Что при этом поменяется? "ВСЁ" — это что? Говорите предметно.

    Дык берем собственно

    Топологическая модель может быть представлена структурами:

    ID.
    X.
    Y.
    Width.
    Height.

    И пытаемся понять как же сюда впишится лейаут который использует для позиционирования контролов скажем сплайны. Те на лейауте задается некая кривая по кторой выстраиваются контролы.

    КЛ>Лично у меня мнение, что, наоборот, ничего менять не придется, т.к. модель содержит только те данные, которые нужны для алгоритма размещения. А если алгоритм размещения при добавлении нового контейнера не поменяется (что очень вероятно), то и данные менять не придется.

    Не путай позиционирование и рендер.
    Ибо их разделение дает возможность написать один рендер и кучу простых в разработке и использовании лейаутов.

    КЛ>Если судить по иерархии интерфейсов, которую Вы привели, то проблем там хватает. При чем — с избытком.

    И ни одна из них не была озвучена.

    Изменение, добавление или удаление отдельного атрибута приводит к реорганизации иерархии.

    Вот только после того как эту иерархию утрясли никаких изменений больше не требовалось.

    Злоупотребление оператором преобразования типов (dynamic_cast в C++ или as в C#) и, как результат, нарушение LSP.

    А в твоей системе вобще все открыто. Приходи к хочешь. Бери что хочешь. Меняй что хочешь. И никто не узнает. Ибо инкапсуляции нет ваще.

    А у меня все as расположены в методе класса реализующиго IType
            public IEnumerable<T> FilteredElements<T>() where T : class, IElementBase
            {
                foreach (IElementBase element in m_Elements)
                {
                    T filteredElement = element as T;
                    if (filteredElement != null)
                        yield return filteredElement;
                }
            }


    И используется както так
                foreach (IProperty prop in type.FilteredElements<IProperty>())


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

    Я не привел по тому что хотел посмотреть на твое решение. Без подсказок так сказать.
        public interface IAttachedElement : IElementBase
        {
            bool Recursive { get; }
            bool CanAttach(object owner, object instance);
        }
    
        public interface IAttachedEvent : IEventBase, IAttachedElement
        {
            void AddEventHandler(object owner, object instance, Delegate handler);
            void RemoveEventHandler(object owner, object instance, Delegate handler);
        }
    
        public interface IAttachedProperty : IPropertyBase, IAttachedElement
        {
            object GetValue(object owner, object instance);
            void SetValue(object owner, object instance, object value);
            void AddValueChanged(object owner, object instance, EventHandler handler);
            void RemoveValueChanged(object owner, object instance, EventHandler handler);
            bool CanResetValue(object owner, object instance);
            void ResetValue(object owner, object instance);
            bool ShouldSerializeValue(object owner, object instance);
        }
    
        public interface IDomain
        {
            IType GetType(Type type);
        }
    
        public interface IElement : IElementBase
        {
        }
    
        public interface IElementBase
        {
            string Name { get; }
            IType Owner { get; }
        }
    
        public interface IEvent : IEventBase, IElement
        {
            void AddEventHandler(object instance, Delegate handler);
            void RemoveEventHandler(object instance, Delegate handler);
        }
    
        public interface IEventBase : IElementBase
        {
            IType EventHandlerType { get; }
        }
    
        public interface IProperty : IPropertyBase, IElement
        {
            object GetValue(object instance);
            void SetValue(object instance, object value);
            void AddValueChanged(object instance, EventHandler handler);
            void RemoveValueChanged(object instance, EventHandler handler);
            bool CanResetValue(object instance);
            void ResetValue(object instance);
            bool ShouldSerializeValue(object instance);
        }
    
        public interface IPropertyBase : IElementBase
        {
            IType PropertyType { get; }
            bool CanRead { get; }
            bool CanWrite { get; }
        }
    
        public interface IType
        {
            string Name { get; }
            Type SystemType { get; }
            IType[] BaseTypes { get; }
            IDomain Domain { get; }
            IEnumerable<T> FilteredElements<T>()
                where T : class, IElementBase;
            T Find<T>(string name)
                where T : class, IElementBase;
            bool IsExtended { get; }
        }

    Это модель метаинформации. Не контролов.

    WH>>При реализации данной системы проблемы были. Но ни одна из них не связанна с метаданными. Те были проблемы с кривыми контролами (ну не самим же все писать), были проблемы с разной природой различных представлений (win и web ну очень разные). Но небыло проблем с метаданными. Те вобще небыло.

    КЛ>Вы бы конкретизировали проблемы, так чтобы коллеги могли понять.
    Я надеюсь отличие win от web понятно. А что касается кривизны контролов то тут можно обраться к "продукции" конторы DevExpress.
    Эти орлы очень любят завязываться на частности типа твоего предложения о том как нужно организовать лейауты.

    КЛ>А никто и не утверждал, что система не будет работать. Утверждалась другое — будет монстроидальный код и сложности с сопровождением. Судя по тому, что код интерфейсов Вы так и не привели, он действительно монстроидален.

    Монстроидальна реализация контролов. Но не из-за метаинформации, а из-за скрещивания win с web и объезда дизайна (вернее его полного отсутствия) контролов DevExpress.

    WH>>Что перечислить? Все свойства которые один контрол может добавлять другому?

    КЛ>Да, это было бы хорошо. Или хотя бы перечислите несколько характерных примеров. Абстрактные пожелания как-то плохо воспринимаются.
    Ну например контрол который всем другим контролам добавляет свойство ToolTip

    WH>>Это не фиксируется при разработке системы.

    КЛ>Очень плохо.
    Это реальная жизнь. Невозможно раз и навсегда зафиксировать требования.

    WH>>Добро пожаловать в реальный мир где требования постоянно меняются.

    КЛ>Предполагаю, что все разнообразие, про которое Вы говорите, сводится к нескольким типовым случаям.
    Валидаторы, биндеры, провайдеры контекстных меню и тп.
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:39
    Оценка: 3 (1) -1 :)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Кроме того, рекомендую прочесть еще вот это
    Автор: Кирилл Лебедев
    Дата: 16.02.07
    сообщение.


    FDS>>Вообще не понимаю, зачем всё это писать на очевидных примерах и причём тут сокращение кода программы, когда он всё равно не сокращается. Скорее, рушится структура программы при "поглощении" классов.


    КЛ>Если пример "очевиден", то:


    КЛ>

      КЛ>
    1. Почему участники обсуждения
      Автор: igna
      Дата: 03.03.07
      так и не пришли к "очевидному" решению, которое описано в презентации?

      Да потому что Я В ПЕРВОМ СООБЩЕНИИ СКАЗАЛ это решение. В ПЕРВОМ СООБЩЕНИИ, потрудитесь его прочитать!!!!!!!!!!!!!!!!!!!!

      КЛ>
    2. Почему Вы не уловили связь между задачей, изложенной в презентации, и обсуждением про квадрат и прямоугольник
      Автор: igna
      Дата: 03.03.07
      ? На мой взгляд, эта связь тоже очевидна.
      КЛ>

    Потому что эта презентация полное говно. Вместо того, что бы рассказать, что вы предлагаете в общем, вы совершенно занудно рассказываете что вы делали конкретно. Это ужасно! Это невозможно читать! Да ещё и постоянно жать "далее..."
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 04.05.07 10:41
    Оценка: 3 (1) +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

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


    КЛ>Давайте не сравнивать реальную работу (в данном случае я пишу о презентации) с некоторым идеалом, который Вам хочется увидеть да еще и сразу. Давайте сравним с аналогами, которые уже опубликованы. Буду рад, если Вы перечислите книги или статьи, в которых уже описано, как надо проектировать программы, в которых учтены Ваши пожелания. При этом, хотелось бы не просто увидеть имена авторов и названия работ, но и ссылки (с точностью до страницы), на которых излагаются методические и инструментальные советы. Под инструментальными я понимаю те, которые можно применять на практике, как формулу Виета для получения корней квадратного уравнения.


    Давайте.
    Б.Страуструп, Язык программирования C++, спец.изд./Пер. с англ. -- М.;СПб.:"Издательство БИНОМ" -- "Невский Диалект", 2001 г. -- 1099 с., ил.

    Для начала несколько общих слов о проектировании ($23.2, стр.761):

    В этой главе можно выделить несколько главных тем:
    * Самое главное при разработке программного обеспечения -- ясно понимать, что вы пытаетесь построить. (**)
    * Успешная разработка программного обеспечения -- это дело, требующее времени.
    * Конструируемые нами системы стремяться оказаться на пределе сложности, доступной нам и нашим средствам.
    * В проектировании и программировании не существует универсальных рецептов, которые могли бы заменить ум, опыт и хороший вкус. (***)
    * При разработке всякого нетривиального программного обеспечения незаменимо экспериментирование.
    * Проектирование и программирование -- итеративные процессы.
    * Нельзя строго разделить фазы создания программы, такие как проектирование, программирование и тестирование.
    * Нельзя рассматривать программирование и проектирование, не затрагивая вопросы менеджмента.


    О целях проектирования ($23.4.2, стр.769):

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

    Из этого вытекает, что система должна быть спроектирована так, чтобы оставаться как можно проще после серии внесенных в нее изменений. Мы должны закладываться изменения в проект, т.е. мы должны стремиться к:
    * гибкости;
    * способности к расширению;
    * переносимости.
    Лучше всего это достигается попытками инкапсулировать те области системы, которые вероятно будут изменяться, и обеспечением такого способа работы, когда последующие проектировщики/программисты вносят изменения в одну область, на затрагивая другие. Это обеспечивается путем определения для данной разработки ключевых понятий и придания каждому классу исключительной ответственности за содержание всей информации, относящейся к отдельному понятию. В этом случае изменение можно внести, модифицировав только один класс. В идеале изменение одного понятия может быть произведено созданием производного класса или заданием другог аргумента шаблона. Естественно, этот идеал легче провозгласить, чем ему следовать.


    В качестве примера, который показывает, как может измениться подход к реализации чего-нибудь, в зависимости от целей ($23.4.2, стр.770):

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

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

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

    Третье решение -- заставить тучу (и другие объекты, такие как самолеты и солнце) описывать самих себя для наблюдателя. Это решение достаточно универсально (даже эта модель вряд ли будет удовлетворительной для случаев, когда требуется графика высокого качества, основанная на расчете хода лучей...). Однако, оно может привести к повышению сложности и потере быстродействия...

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


    Теперь о самом проектировании ($23.4.3, стр.771):

    Итак, рассмотрим, как можно подойти к проектированию компоненты. Поскольку зачастую это непростая задача, стоит разбить ее на этапы, чтобы логичным образом сфокусироваться на разных подзадачах.Как обычно, для этого нет универсального правильного способа. Однако, вот последовательность действий, которая кое-кому помогла:
    [1] Выявите понятия/классы и их самые фундаментальные взаимосвязи.
    [2] Уточните классы, определив набор операций над ними.
    * Классифицируйте это операции. В частности, рассмотрите потребность в конструкторах, деструкторах и копировании.
    * Рассмотрите минимальность, полноту и удобство/
    [3] Уточните классы, определив их взаимозависимость.
    * Рассмотрите параметризацию, наследование и воспользуйтесь зависимостью.
    [4] Определите интерфейсы:
    * Разделите функции на открытые и защищенные.
    * Определите точный тип операций над классом.

    И далее эти шаги раскрываются более подробно: $23.4.3.1. Этап 1: выявление классов (сс.772-775), $23.4.3.2. Этап 2: определение операций (сс.775-776), $23.4.3.3. Этап 3: определение взаимозависимостей (стр.777), $23.4.3.4. Этап 4: определение интерфейсов (сс.777-778), $23.4.3.5. Реорганизация иерархии классов (сс.778-779), $23.4.3.6. Использование моделей (сс.779-780).

    И это всего лишь одна глава в книге, которая посвящена конкретному языку программирования, а не проектированию программ.

    Не могли бы вы здесь, без ссылок на свои статьи или части своей презентации, сформулировать, что нового показала ваша презентация по сравнению, хотя бы, с данной главой из книги Страуструпа?




    ** Не подразуевает ли это тчательную проработку use-case-ов?
    *** Это вообще следует помнить при попытки возведения какого-либо метода (будь то ТРИЗ или RUP) в ранг Методологии.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 18:21
    Оценка: 2 (1) +1 -1
    Здравствуйте, FDSC, Вы писали:

    FDS>Ну и как же применять ваши принципы с точки зрения наследования квадрата от прямоугольника?


    Мне кажется, что ответ дан в этом слайде, а конкретный пример приведен здесь.

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

    Еще конкретнее. Если мы пишем иерархию, чтобы упростить рисование, то нафига нам понадобилось добавлять в класс прямоугольника методы SetWidth() и SetHeight(), а в класс квадрата — метод SetSide()? А если — не для рисования, то тогда для чего вообще городится эта иерархия? Какую задачу она решает? И какой код помогает упростить?

    Собственно, обо всем этом говорится в здесь.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 18:57
    Оценка: -1 :))
    Здравствуйте, VladD2, Вы писали:

    VD>По существу могу дать совет.

    VD>Выложи ppt-ху в свои файлы на rsdn и дай на нее ссылку. Всем будет приятно и спокойно.

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

    Еще раз, спасибо! Возможно, чуть позже я так и сделаю.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 19.04.07 19:55
    Оценка: +3
    Здравствуйте, Кирилл Лебедев, Вы писали:

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


    Странный подход. Ты хочешь получить фидбек, но при этом устраиваешь барьеры посредством физического усложнения доступа к материалу. Ты бы ещё охранника поставил, пусть бы он паспорт на входе проверял и решал по терпеливости человека пропускать его внутрь или нет. Глупость, в общем.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: prVovik Россия  
    Дата: 20.04.07 11:52
    Оценка: :)))
    Здравствуйте, Кирилл Лебедев, Вы писали:


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


    Поздравляю, вы открыли для себя структурное программирование
    лэт ми спик фром май харт
    Re[14]: О наследовании, иерархиях и проектировании (философс
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 16:45
    Оценка: +3
    Здравствуйте, prVovik, Вы писали:

    V>То, о чем вы говорите как раз и называется структурная декомпозииция. Почитайте Гриди Буча, он в самом начале своей книги по ООП разбирал именно два эти подхода, и наглядно, на примере какой-то задачи по обработке файлов демонстрировал недостатки структурной декомпозиции над объектно-ориентированной.



    Вообще-то это мошейничество. Бывают случае когда ОО-декомпозиция полнейший оверкил, а структрурная рулит. Бывает наоборот. Так что такой пример приведенный в качестве доказательства превосходства ОО-декомпозиции ни что иное как подлог.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 12:57
    Оценка: -2 :)
    Здравствуйте, eao197, Вы писали:

    E>Не могли бы вы здесь, без ссылок на свои статьи или части своей презентации, сформулировать, что нового показала ваша презентация по сравнению, хотя бы, с данной главой из книги Страуструпа?


    Вы хотите, чтобы я назвал отличия? Ну, что ж, держите:

    1. Понятие идеальной программы. Почему выгодно ориентироваться на идеальность.
    2. Этапы развития "кода" (как архитектуры, так и самого кода). Волнообразная модель.
    3. Метод группировки разнородных сущностей. Ему посвящены этапы 1.3 и 2.2. Обычно группируют, находя похожие атрибуты и вынося их в базовые классы. В презентации говорится, что контекст для группировки нужно искать со стороны, т.е. не по похожести атрибутов, а потому, как и для чего объекты используются.
    4. Схлопывание иерархии в класс.
    5. Этапы свертывания. В частности, то, что задание одинаковых интерфейсов для различных сущностей — первый шаг к дальнейшему их свертыванию.
    6. То, что различия между объектами "надо продвигать вниз" (на нижние слои).
    7. То, что нижние слои поглощают средние.
    8. То, что сначала нужно выявлять не классы/понятия, а действия. И проектировать конкретные структуры данных под эти операции (назовем их макро-операции или бизнес-функции).

    E>[i]** Не подразуевает ли это тчательную проработку use-case-ов?

    Такую обтекаемую фразу можно понимать, как угодно. Я предпочитаю более точное указание.

    Встречный вопрос. В части 3 своей книги (http://www.helloworld.ru/texts/comp/other/oop/) Гради Буч разбирает ряд конкретных задач. Не могли бы Вы показать, как, используя рекомендации Страуструпа, можно решить хоть одну из приведенных задач?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[13]: ...продолжение
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.05.07 13:52
    Оценка: +2 :)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    G>>Ой, какой разговор пошел . На основании одного факта, что вы в индустрии провели 11 лет своей жизни, вы, боюсь, здесь никому и ничего не докажете . Хотя бы потому, что не вы один тут имеете опыт 10+ лет. Это не есть ваша уникальная особенность. Посмотрите, кто вам минусы поставил — у них у всех 10+.


    КЛ>Вы не прячьтесь за чужие минусы, а попробуйте вести дискуссию предметно, конструктивно и без наездов. Пока что наезды с Вашей стороны превышают количество приведенных Вами примеров (их вообще нет). Да и замечания Ваши непредметны. Уж если б придирались, то хотя бы к конкретным слайдам.


    Да зачем мне прятаться — я и своих могу понаставить. Вот — держите . Замечания у меня вполне предметны — и на них вы не даете ответа. Слайды ваши по одному я комментировать не буду — я же сказал, смысла в этом не вижу, у вас не в деталях проблемы, а в принципе. Самая существенная проблема — вы не в состоянии никому здесь объяснить, что вы хотели сказать, при этм требуете послайдных комментариев.

    G>>И у меня тоже. Что дальше? Пиписьками меряться начнем, у кого длиннее?


    КЛ>Хочу напомнить, что разговор в таком тоне начали Вы. Если уж пытаетесь разобраться в предмете, то задавайте вопросы вежливо и, желаетльно, без наездов на собеседника. Если же Вам разбираться не хочется, то зачем Вы вообще ввязались в дискуссию?


    Если вам отвечать на вопросы не хочется — зачем вывешивать матриал и просить высказать мнение?

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


    КЛ>Если Вас интересует ответ на этот вопрос, обратите внимание на пример, приведенный в презентации. Полагаю, что ответ будет очевиден.


    Я прошу вам дать ответ здесь. Отвечайте, если вам есть что сказать. Нечего сказать — закрываем разговор.

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


    КЛ>Уважаемый коллега! В детстве, Вы наверняка, смотрели мультик про слоненка, мартышку, попугая и удава. Там наглядно показано, что длину можно мерить в чем угодно. Так удава измеряли и в мартышках, и в слоненках, и в попугаях. Даже маленькие дети понимают, что измерять можно, в чем угодно. В чем удобнее, в том и измерим. Неужели же программист с более чем 10-летним стажем не понимает этой столь простой истины?


    Уважаемый коллега, вы меня хотите в чем убедить — в том, что ваши знания в софтверных метриках _ограничивается_ детским мультиком про слоненка с мартышкой? Gratz. Вам это удалось.

    G>>Но все-таки, я наверное чего-то не понимаю. Приведите примеры, в каких ситуациях и почему именно "выгоднее" измерять объем кода "в операторах". Желательно — живой пример из своего 11-летнего опыта. Просим-просим.


    КЛ>Пример есть в презентации. Если же Вам что-то непонятно, задайте вопрос без ехидства. Я отвечу. На вопросы, сформулированные в таком тоне, как сейчас, я отвечать не буду.


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

    G>>Раз все настолько сложно и неоднозначно — что понятие "код" берется в кавычки и у этого понятия возможны оказывается разные (!) толкования, то вам следовало посвятить понятию "кода" отдельные слайды вашей презентации. Ваш труд, по видимости, фундаментален, и пересматривает сами основы?


    КЛ>Я не предполагал, что для кого-то банальная истина может быть непонятна. С учетом того, что здесь уже кажется обсуждали, что текст — не единственно возможное представление кода. Поищите, думаю, обсуждение было где-то в марте-апреле.


    Охренеть. Вот ведь наука дошла. Ссылочку не дадите — я что-то не нашел .

    G>>А-а, ну тогда понятно. А можно мне с рацпредложением выступить? Нельзя-ли тот длинный тупой код, в сравнении с которым у вас короче в 5 раз получается, вообще не писать, а? Может, все-таки, сразу нормальный, краткий и правильный код написать? Ну, подумать там как следует (это фаза "дизайн" называется, до половины времени разработки у некоторы занимает), и написать нормально, нет? Так не пойдет? Или по вашему надо сначала хреновню написать, а потом "свертыванием" заниматься?


    КЛ>Я, конечно, "за". Но кто будет "сворачивать" "код" на стадии "дизайна"? И какими методами?

    Действительно, вот ведь проблема. Кода-то на стадии дизайна нет. Поэтому, его не надо "сворачивать". Получается, вся ваша теория рушится. Ай-ай-ай. Нет, так конечно не пойдет.

    КЛ>Ах, да, Вы опять скажете, что на стадии дизайна кода еще нет.

    Yep. I did it! Его в самом деле еще нет. Что будем делать? А?

    КЛ>Ведь, как же! Код еще не написан! А его уже пытаются сократить!!!

    Угу. Именно. Мало того, что пытаются несуществующий код сократить, так ведь еще и сократить раз в 2-5. Разумеется, в сравнении с несуществующим кодом. Эт вы хитро придумали, коллега. Ловкий ход, у Буча с Рэмбо о таком смелом подходе ни слова. Непонятно только, почему не раз в 10. А так, смело, смело.

    КЛ>Простая мысль о том, что одна из задач проектирования — это разработка архитектуры, при которой объем кода минимален, Вам не приходит в голову.

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

    КЛ>Ведь Вы же код меряете только в уже написанных строках! А о том, что иерархию из 115 классов (хотя бы их код и будет минимален) будет трудно сопровождать, Вы как-то не задумываетесь. Если бы задумывались, то, по крайней мере, не спрашивали бы меня, когда код полезно измерять в классах.


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

    G>>Я не понимаю, причем тут программист-стажер. Мы кажется тут все с 10+ опытом, говорим о программировании как о профессиональной деятельности, и презентации пишем для настолько умных программистов, что им не надо принципов построения слоеных систем объяснять?


    КЛ>Не уходите в сторону, а отвечайте на вопрос: "Код стажера и код профи, действительно, по Вашему мнению, имеет одинаковое количество багов?" Тут кто-то говорил про универсальность метрик. Так что презентация тут не при чем.


    Не буду я отвечать на ваши вопросы. Вы же на мои не отвечаете.

    КЛ>>>Сократить подобное различие может лишь четкая методология и формальный процесс. Но и после плотность ошибок все равно различается в разы.


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


    КЛ>Вот странный человек. Для того и создаются различные методологии, чтобы сократить количество ошибок в коде.

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

    КЛ>И различные процедуры проверки качества типа code review.

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

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

    Я-то как раз знаю, сколько ошибок допускают программисты. Скажу по секрету — по метрикам компании CQG, где я работал пару лет назад, плотность ошибок колеблется в среднем в коридоре 20-40 штук на 1000 строк кода. Язык С++.

    А вот вы, похоже, студент, по ответам видно. Материалом не владеем, чушь порем, со старшими спорим .

    G>>С чего вы взяли, что люди должны тратить на ваш труд свое время? Вам тут никто и ничего не обязан. Да и презентация у вас откровенно слаба, для студента ничего, а для технаря вообще никак. Вы бы не позорились с докладами на конференциях, побольше читали, да еще поменьше про 11 лет своего опыта говорили — а то люди-то смеяться будут над вами. Я совершенно серьезно это вам говорю. Себе же хуже делаете.


    КЛ>С чего Вы взяли, что я вообще чего-то взял? Презентация выложена для желающих. Вам это неинтересно? Не читайте!

    Да я и не читаю, вы не волнуйтесь . Вам мои ответы не интересны? Не читайте!

    КЛ>И уж тем более не пишите какие-либо отзывы.

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

    КЛ>Хотя бы потому, что написать вежливо, по-существу и конкретно у Вас не получается.

    Отчего же — у меня вполне получается. Не получается отвечать у вас.

    КЛ>А вычитывать подростковую грубость мне неинтересно.

    Конечно, вам ее писать гораздо интереснее, это уже весь город заметил.
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.05.07 16:23
    Оценка: +2 -1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    E>>Не могли бы вы здесь, без ссылок на свои статьи или части своей презентации, сформулировать, что нового показала ваша презентация по сравнению, хотя бы, с данной главой из книги Страуструпа?


    КЛ>Вы хотите, чтобы я назвал отличия? Ну, что ж, держите:


    КЛ>

      КЛ>
    1. Понятие идеальной программы. Почему выгодно ориентироваться на идеальность.
      Этого у страуструпа нет. Потому, что этот ваш тезис — ошибочен.

      КЛ>
    2. Этапы развития "кода" (как архитектуры, так и самого кода). Волнообразная модель.
      Этого тоже нет. Потому, что 1) так на практике не происходит, и 2) ничего полезного от этой модели все равно нет.

      КЛ>
    3. Метод группировки разнородных сущностей. Ему посвящены этапы 1.3 и 2.2.
      КЛ>Обычно группируют, находя похожие атрибуты и вынося их в базовые классы.
      Обычно так только лохи делают, которые вообще в ООП ничего не понимают — это противоречит принципу инкапсуляции. Аттрибуты вообще игнорируются при построении объектной модели. За такое "обычно" руки вырывать надо с корнем из одного места — откуда они обычно в таких случаях растут, в общем.

      Свежо короче. У Страуструпа такого, наверно, нет .

      КЛ>В презентации говорится, что контекст для группировки нужно искать со стороны, т.е. не по похожести атрибутов, а потому, как и для чего объекты используются.

      Очень свежо. Да про это в любой книге по ООД говорится в самом начале.

      КЛ>
    4. Схлопывание иерархии в класс.
      Этого нет. Потому как нафиг никому не надо этим заниматься (тезис основан на ложной посылке, что "много классов — это плохо"). Впрочем, нечто похожее описано в книге "антипаттерны", где про рефакторинг пишут. Правда, "схлопывания в класс" там вроде не указано — там напротив, все больше даются рекомендации по расхлопыванию класса, написанного кривыми руками.

      КЛ>
    5. Этапы свертывания. В частности, то, что задание одинаковых интерфейсов для различных сущностей — первый шаг к дальнейшему их свертыванию.
      Вроде как шаг рефакторинга описывается — только непонятно, зачем так делать. Сколько раз легаси-код рефакторил — ну ни разу "этапа свертывания" не замечал.

      КЛ>
    6. То, что различия между объектами "надо продвигать вниз" (на нижние слои).
      КЛ>
    7. То, что нижние слои поглощают средние.
      Это комментировать не возьмусь. Как легаси код прет в свеженаписанную подсистему, проламывая клином страшенных багов и неожиданных фич эшелонированную оборону из слоев абстракции — видел. Как нижние слои поглощают средние — нет. Что-то страшное наверно, вроде столкновения и поглощения галактик. Зачем надо различия между объектами куда-то продвигать — не понятно. Тема, короче, не раскрыта.

      КЛ>
    8. То, что сначала нужно выявлять не классы/понятия, а действия. И проектировать конкретные структуры данных под эти операции (назовем их макро-операции или бизнес-функции).
      Угумс. В любой книге про практическое применение УМЛ в самом начале — когда юзкейсы описываются. Структуры даных под эти действия, правда, проектировать при объектном подходе прям так сразу — запрещено (структуры данных инкапсулированы в классы — об интерфейсах надо думать), но это мелочи жизни.
      КЛ>

    А-а-ставайтесь с нами.
    http://rsdn.ru/Forum/Message.aspx?mid=1158902&amp;only=1
    Автор: Protey
    Дата: 05.05.05
    Re[13]: ...продолжение
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.05.07 18:00
    Оценка: +3
    Здравствуйте, Кирилл Лебедев, Вы писали:

    Сразу замечу, что предмет вашего спора мне не интересен. Так что поговорю о форме.

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

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


    КЛ>Если Вас интересует ответ на этот вопрос, обратите внимание на пример, приведенный в презентации. Полагаю, что ответ будет очевиден.


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

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


    КЛ>Уважаемый коллега! В детстве, Вы наверняка, смотрели мультик про слоненка, мартышку, попугая и удава. Там наглядно показано, что длину можно мерить в чем угодно. Так удава измеряли и в мартышках, и в слоненках, и в попугаях. Даже маленькие дети понимают, что измерять можно, в чем угодно. В чем удобнее, в том и измерим. Неужели же программист с более чем 10-летним стажем не понимает этой столь простой истины?


    Мне кажется "уважаемый колега" намекла, на то что есть общепринятые подходы. Я правда знаю два тких подхода в строках и в LOC-ах. Но тем не менее объяснение приемуществ "операторного похода" они не дают. Так что потрудись объяснить, а не отмазываться. Если, конечно, тебе интересна дисскусия, а не флэйм.

    G>>Но все-таки, я наверное чего-то не понимаю. Приведите примеры, в каких ситуациях и почему именно "выгоднее" измерять объем кода "в операторах". Желательно — живой пример из своего 11-летнего опыта. Просим-просим.


    КЛ>Пример есть в презентации. Если же Вам что-то непонятно, задайте вопрос без ехидства. Я отвечу. На вопросы, сформулированные в таком тоне, как сейчас, я отвечать не буду.


    Опять. "Есть в презентации" — это все равно что ничего не сказать. Она довольно большая.

    Мы вот всем кто пишет статьи объясняем, что нужно не объяснять что написано втом или ином абзаце редакторам, и не давать им ссылки, а переписать текст так чтобы не возникало вопросов. Причем у всех (или большинства).

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

    G>>Раз все настолько сложно и неоднозначно — что понятие "код" берется в кавычки и у этого понятия возможны оказывается разные (!) толкования, то вам следовало посвятить понятию "кода" отдельные слайды вашей презентации. Ваш труд, по видимости, фундаментален, и пересматривает сами основы?


    КЛ>Я не предполагал, что для кого-то банальная истина может быть непонятна.


    Значит наткнувшись на этот файт, надо изменить свое мнение и таки дать объяснение в презенатции, а не всревать в дрязги и объяснять окружающим, что они не понимают очевидного. Не понимают, значти не очевидно.

    КЛ> С учетом того, что здесь уже кажется обсуждали, что текст — не единственно возможное представление кода. Поищите, думаю, обсуждение было где-то в марте-апреле.


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

    КЛ>Ведь Вы же код меряете только в уже написанных строках! А о том, что иерархию из 115 классов (хотя бы их код и будет минимален) будет трудно сопровождать, Вы как-то не задумываетесь. Если бы задумывались, то, по крайней мере, не спрашивали бы меня, когда код полезно измерять в классах.


    Я думаю, что Гапертон пытался тебе сказать, что классы бывают разными по размеру. Можно залудить один класс который будет сложнее и больше чем 115 мелких и простых. Более того моно вообще обходиться без классов. В языках с паттерн-матчингом, например есть такие фишки как алгеброические типы. В некоторых ситуациях они позволяют радикально сократить объем кода не согращая количества сущностий (которые ты привык называть классами).

    Так что про архитектуру ты говоришь врено. Но вот толко есть разные сопобы получать хорошую архитекруру. И это никак не оправдывает измерение объема кода в количестве классов.

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


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

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

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

    КЛ>С чего Вы взяли, что я вообще чего-то взял? Презентация выложена для желающих. Вам это неинтересно? Не читайте! И уж тем более не пишите какие-либо отзывы. Хотя бы потому, что написать вежливо, по-существу и конкретно у Вас не получается. А вычитывать подростковую грубость мне неинтересно.


    Забавный подход. То есть отзыв должен быть неприменно положительным? Ну, вот ты наткнулся на отрицательный. Если честно, то я на этом форуме положительных и не видел. Может все же задуматься над тем, что что-то не так в твоей презентации или даже твоих мыслях?

    Учись из всего извлекать пользу, а отходы выбрасывать за ненадобностью. Если человек выражет недовольство, то пойми чем оно вызвано и устрани эти причины. Если он неадекватен или неконструктивен, то просто проигнорируй его мнение.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[43]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 22.06.07 20:25
    Оценка: +3
    Здравствуйте, IT, Вы писали:

    IT>Как раз совсем наоборот. Как ты и хотел я не стал добиваться удобства за счёт раздувания контракта


    Черта с два. Контракт никуда не делся, он просто ушел в схему xml, которая в твоем примере неясно как контроллируется. Т.е. ты сделал контракт неформальным, от чего я и предостерегал в самом начале.
    ... << RSDN@Home 1.2.0 alpha rev. 693 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 09:02
    Оценка: 28 (2)
    Здравствуйте, Геннадий Васильев, Вы писали:

    ...

    ГВ>Про метрики я знаю. А можно уточнить, в каком случае увеличение размера программы привело к снижению измеримой сложности? И как эту сложность меряли? Какая конкретно метрика использована?


    Из личного опыта. Надо было внести иименения в код, довольно небольшой (всего ~500 строк), но со сложной логикой. Кем и когда этот код был написал — не известно. Так вот, изменения удалось внести только после рефакторинга (а по сути написания заново), увеличившего размер кода чуть ли не в два раза. В данном конкретном случае сложность измерялась субъективным критерием наиболее близким к понятности.
    Безусловно между размером кода и сложностью есть связь, но ставить знак равенства...
    Re[15]: ...продолжение
    От: fmiracle  
    Дата: 06.05.07 20:20
    Оценка: 18 (2)
    Здравствуйте, FDSC, Вы писали:

    FDS>А за счёт чего происходит такое сокращение количества строк?

    ...
    IT>return a;

    FDS>Ээээ. Я думаю, это бывает далеко не всегда


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

    1. человек просто не знает что в стандартной (или просто используемой) библиотеке уже есть готовый метод для нужного ему набора действий и воспроизводит его самостоятельно.
    2. используют неподходящий в данном случае алгоритм, что выливается в более сложный и запутанный код.
    3. Делают ошибку в самом начале где-то (взаимодействующие сущности или порядок обработки данных), а потом старательно выписывают страницы кода, обходя порожденные проблемы, считая что все идет нормально и даже не понимая, что надо вернуться к началу и исправить еще там...
    4. Начинают оптимизировать код по мере написания, как только начинают подозревать, что "это будет медленно". Создают "быстрый" вариант. Потом трудолюбиво воюют с неудобствами этого варианта, создавая килобайты кода обходных маневров.

    Когда такое вижу то часто поражаюсь "как же так вообще можно?", потом вспоминаю себя лет 5 назад и понимаю, что да, вполне можно...

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

    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Re[11]: О наследовании, иерархиях и проектировании (философс
    От: FDSC Россия consp11.github.io блог
    Дата: 21.04.07 08:49
    Оценка: 6 (2)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>И заметьте, что при этом простота использования и очевидность интерфейсов классов существенно упадёт. Так же, повысится сложность самого класса параметрической фигуры.


    КЛ>Совсем необязательно. В этом примере вряд ли класс CTargetSensor как-то стал сложнее классов CCarSensor, CPowerUpSensor и CMineSensor вместе взятых. Аналогично происходит и с фигурами. Обобщенный класс не становится сложным за счет нахождения оптимальной формы представления данных и методов.



    А в этом примере уменьшения кода и нет. Здесь есть введение дополнительного абстрактного слоя, о чём я и говорю. Любая проблема архитектуры решается введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества абстрактных слоёв, если не ошибаюсь, именно это написано у кого-то из участников форума в подписи. Так что тут ничего нового. Никакого уменьшения ОБЪЁМА кода нет, а раз так, значит по прежнему могут возникнуть очень и очень острые проблемы побочных эффектов, неправильного понимания механизмов работы алгоритмов или неучтённых, но нужных информационных связей.
    Т.е. все проблемы остаются. Вы всего лишь пытаетесь научить общественность тому, что она уже умеет: пытаетесь сказать, что вот мол, ребята, давайте вводить более удобные интерфейсы. ДАВАЙТЕ, ДВУМЯ РУКАМИ ЗА!!!


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


    Короче говоря, по моему мнению, вы решаете проблему, которой нет. Вы пытаетесь лечить симптомы, которые даже и не лечатся, да и даже если бы лечились, не стоило бы тратить время на их лечение.
    Re[19]: ...продолжение
    От: WolfHound  
    Дата: 23.05.07 14:22
    Оценка: 2 (1) +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>>>Например, в случае объектной модели полезно оценить количество интерфейсов и классов, приходящихся на одну сущность. Чем их больше, тем хуже.

    WH>>Ты в этом так уверен?
    КЛ>Пока меня не разубедили — да.
    Это догма. Догмы до добра не доводят.

    WH>>5 классов + 2 аттрибута + 1 фабрика из одного однострочного метода. Это одна из реализаций этих сущьностей.

    WH>>Другая может содержать другое колличество классов.
    КЛ>Итого — 15 "классов" (10 интерфейсов + 5 классов) на 5 сущностей? Получается — по 3 "класса" на сущность.
    Арифметика из серии: (5 крокодилов + 10 помидоров) / 5 мотоциклов
    Самому не смешно?

    WH>>Вся работа осуществляется только через интерфейсы. Таким образом мы можем работать с множеством реализаций одновременно.

    КЛ>Ну и с классом (без всякого дополнительного интерфейса) программист тоже работает через интерфейс класса.
    Как ты будешь работать с разными реализациями (читай классами) в статически типизированном языке? Если не через интерфейсы?

    КЛ>Боюсь, ничего не могу сказать, т.к. мне непонятна суть задачи и ее решения. Все описано слишком абстрактно. Лучше рассмотреть конкретный пример. Тогда, думаю, станет все ясно.

    Нужна хитрая объектаная модель: У объектов могут быть собственные свойства и события, а также могут быть присоедененные свойства и события.
    Например:
    В случае ГУИ у нас есть кнопка.
    Собственные свойства кнопки это допустим text и собственное событие это OnClick.
    С присоедененными свойствами все куда веселее. Дело в том что есть мнение которое хрен оспоришь что x, y, width и height это не собственные свойства кнопки.
    Эти свойства добавляет контейнер в который кладут кнопку. Те контейнер AbsolutePosition добавляет x, y, width и height, а контейнер Grid добавляет row и col.

    И того 5 сущьностей: собственное свойство, собственное событие, присоедененное свойство, присоедененное событие и тип.

    Соответственно нужна модель метаданных для всего этого дела. Также нужна сериализация всего этого безобразия (в разные предстваления XML, binary, DB...) Еще нужно иметь в виду что читема должна уметь десереализовать в разные представления например в WinForms и WebForms.
    Также нужно несколько реализаций метаданных. Ибо в разных случаях могут быть удобны разные реализации.

    Выглядит это страшно. Но такая схема снимает кучу проблем с других частей системы и так как те части системы имею объем кода в десятки раз больше то такая разгрузка оправдана.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[36]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 25.05.07 19:22
    Оценка: 2 (1) :)
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>Ну, форму в некотором роде тоже можно рассматривать в виде контрола. В общем, не важно. Вот и привели бы примеры метаданных контрола. А раз не привели — то чего же пенять?

    WH>Да я уже устал повторять. Метаданные контролов это описание свойств, событий,...
    Для проектирования нужны конкретные примеры. Нельзя спроектировать дом, не зная, для кого он предназначен.

    WH>А зачем все это? Если Вася может просто написать контрол, разметить его атрибудами и кинуть сборку в определенную папку. И система все сама подхватит.

    Очевидно, Вы путаете модель с реализацией. Если надо, метаданные можно хранить вместе с контролом. От этого ничего не изменится.

    КЛ>>Даже в MS Visual Studio или в MS Word'е ограниченное количество контролов. При всем уважении, не думаю, что у Вас система как-то резко сложнее.

    WH>А как на счет того что я могу написать свой контрол и использовать его в студийном дизайнере?
    WH>А как на счет того что существует масса платных и бесплатных компонентов?
    Я говорю не о тех контролах, которые присутствуют в редакторе MS Visual Studio, а о том, что даже для большой и сложной программы вряд ли требуется бесконечное число контролов. И рекомендовал Вам обратить внимание на Word или Studio, где контролов (здесь я имею в виду интерфейс этих программ) — ограниченное количество, и весь интерфейс оформлен в едином стиле.

    WH>Во тут противоречие.

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

    WH>Ты заменяешь вполне конкретную сущность некими мутными прямоугольничками.

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

    КЛ>>Что это за связь и в чем она состоит?

    WH>В том что ты связал два совершенно разных лейаута.
    WH>Зачем?
    С точки зрения кого разные? С точки зрения контролов — форма или грид — действительно, разные. Но алгоритму размещения об этом неизвестно. Он работает с "сеткой", представленной набором ячеек. В одном случае ячейками являются ячейки грида, в другом случае — пикселы. Что от этого поменяется?

    WH>Так давай разделять лейауты. И рендер. Это разные вещи.

    Под рендером обычно понимается рисование, под layout'ом — размещение. А что Вы понимаете под этими терминами? И где я их смешиваю?

    WH>Про Follow можешь посмотреть в WinForms2

    Не, сам я смотреть не буду. И так уже много трачу времени на это обсуждение. Если захотите узнать решение, объясните сами. Затем я его опишу.

    WH>И пытаемся понять как же сюда впишится лейаут который использует для позиционирования контролов скажем сплайны. Те на лейауте задается некая кривая по кторой выстраиваются контролы.


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

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

    WH>

    Изменение, добавление или удаление отдельного атрибута приводит к реорганизации иерархии.

    WH>Вот только после того как эту иерархию утрясли никаких изменений больше не требовалось.

    Извините. Так это просто потому, что Ваша иерархия ничего не делает. Т.е. какой-нибудь функциональный код в ней вообще отсутствует. Классы коллекционируют object'ы — только и всего. На языке C++ все Ваши классы и интерфейсы я могу свести к одной записи:

    std::vector<void *> vec;


    Выглядит короче, а смысла столько же. Человек, работающий с Вашими интерфейсами, просто заколебается преобразовывать object'ы в надлежащие типы данных. Я уж не говорю о том, что в Ваш класс можно добавить какой угодно объект, даже тот, который добавлять нельзя, и компилятор это спокойно проглотит, потому что у Вас там object.

    WH>А в твоей системе вобще все открыто. Приходи к хочешь. Бери что хочешь. Меняй что хочешь. И никто не узнает. Ибо инкапсуляции нет ваще.

    Прежде чем инкапсулировать, нужно понимать, что инкапсулировать и еще лучше — от чего инкапсулировать. Например, я понимаю почему надо инкапсулировать тип контрола от алгоритма размещения — для алгоритма тип совсем не важен. Но не понимаю, зачем инкапсулировать данные формы (или если хотите — метаданные) от программы, которая эту форму и эти данные (метаданные) визуализирует? Объясните мне, как возможно визуализировать форму, не прочитав соответствующие данные из потока?

    Разумеется доступ к этим данным имеет только код визуализации.

    WH>А у меня все as расположены в методе класса реализующиго IType

    WH>
    WH>        public IEnumerable<T> FilteredElements<T>() where T : class, IElementBase
    WH>        {
    WH>            foreach (IElementBase element in m_Elements)
    WH>            {
    WH>                T filteredElement = element as T;
    WH>                if (filteredElement != null)
    WH>                    yield return filteredElement;
    WH>            }
    WH>        }
    WH>

    ИМХО, такой код только запутывает. В малых дозах он раздражает. А в огромных количествах просто становится несопровождаемым. Не забывайте, что после Вас программу может сопровождать совсем другой программист. Если не верите, предлагаю убедится на собственном опыте.

    WH>Я не привел по тому что хотел посмотреть на твое решение. Без подсказок так сказать.

    А где ж тут подсказки? Непонятно, за что Ваша модель отвечает. И непонятно, что она хранит. Одни сплошные object'ы.

    WH>Это модель метаинформации. Не контролов.

    Кошмар!

    WH>Я надеюсь отличие win от web понятно. А что касается кривизны контролов то тут можно обраться к "продукции" конторы DevExpress.


    Визуально — различаю. На уровне реализации различий не знаю. Я программирую на C++.

    Я Вас все же спрашивал о конкретных проблемах, а не об абстрактном (или визуальном) отличии win от web.

    WH>Монстроидальна реализация контролов. Но не из-за метаинформации, а из-за скрещивания win с web и объезда дизайна (вернее его полного отсутствия) контролов DevExpress.


    Полагаю, что основная причина монстроидальности — это все-таки преобразование object'а к производным классам. Если бы я на C++ хранил все данные в виде указателей на void, думаю, код тоже был бы монстроидальным.

    WH>Ну например контрол который всем другим контролам добавляет свойство ToolTip

    А зачем это делать в виде отдельного контрола?

    WH>>>Это не фиксируется при разработке системы.

    КЛ>>Очень плохо.
    WH>Это реальная жизнь. Невозможно раз и навсегда зафиксировать требования.
    По-любому требования нужно записывать и сохранять. Даже если они впоследствии меняеются. А чтобы требования менялись поменьше, то нужно как следует поставить задачу. Постановка задачи предполагает формулирование и запись требований, а также — моделирование с целью выявления дополнительных требований.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: Lloyd Россия  
    Дата: 19.04.07 14:32
    Оценка: :))
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>В любом случае, давайте закроем обсуждение чужого сайта. Буду рад, если у Вас будет что сказать по существу.


    Интересно, а почему они этот самый ТРИЗ не применили при разработке сайта?
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 19.04.07 14:51
    Оценка: +1 :)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>В любом случае, давайте закроем обсуждение чужого сайта. Буду рад, если у Вас будет что сказать по существу.


    Я бы и рад что-нибудь сказать, да такого издевательства над собой не смог выдержать.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re: О наследовании, иерархиях и проектировании (философское)
    От: ZevS  
    Дата: 19.04.07 16:00
    Оценка: +1 :)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Понятие идеальности очень важно при решении изобретательских задач. Оно помогает изобретателю сконцентрироваться на задаче и отвлечься от конкретных реализаций той или иной технической системы или подсистемы. Как бы сказали программисты, изобретатель начинает мыслить функциями (интерфейсами), а не конкретными реализациями. Такой подход к решению изобретательских задач не случаен, т.к. увеличение степени идеальности – один из законов развития технических систем. А как обстоят дела в программировании?


    На мой взгляд, тезис: чем меньше система, тем она идеальней, в случае ПО не так актуален. Больное место ПО, не "размеры", а качество выполнения основной и прочих функций. И сисмета тем идеальнее, чем точнее она выполняет свои функции. Идеальная программа — программа без ошибок. Все прочее только отвлекает внимание.
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.04.07 16:30
    Оценка: +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>В любом случае, давайте закроем обсуждение чужого сайта. Буду рад, если у Вас будет что сказать по существу.


    По существу могу дать совет.

    Выложи ppt-ху в свои файлы на rsdn и дай на нее ссылку. Всем будет приятно и спокойно.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 11:26
    Оценка: +2
    Здравствуйте, IT, Вы писали:

    ...

    IT>В теории? возможно? это так, с теоретиками не буду спорить. Но на практике же оказывается, что в 99% связь между лаконичностью и простотой кода практически прямая. А в случае кода безнес логики это справедливо на 120%.


    Короткие лаконичные программы на Perl просто ужасны.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 20.04.07 13:04
    Оценка: +2
    Здравствуйте, prVovik, Вы писали:

    IT>>В теории? возможно? это так, с теоретиками не буду спорить. Но на практике же оказывается, что в 99% связь между лаконичностью и простотой кода практически прямая.


    V>Поковыряй какой-нибудь boost. Там код весьма лаконичен, но вот простой ли он?


    Сложность буста является прямым следствием неоднозначности и кривизны идей, на которых он базируется. Но сам по себе буст — это пол беды. В конце концов запутанность библиотечного кода не так критична. Хуже то, что использование буста порождает таких же уродцев как и он сам.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[15]: О наследовании, иерархиях и проектировании (философс
    От: Eugene Kilachkoff Россия  
    Дата: 21.04.07 11:47
    Оценка: :))
    Здравствуйте, Кирилл Лебедев, Вы писали:

    V>>То, о чем вы говорите как раз и называется структурная декомпозииция. Почитайте Гриди Буча, он в самом начале своей книги по ООП разбирал именно два эти подхода, и наглядно, на примере какой-то задачи по обработке файлов демонстрировал недостатки структурной декомпозиции над объектно-ориентированной.


    КЛ>О качестве некоторых архитектурных решений Гради Буча можно прочитать в этой статье.


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


    КЛ>А в этом примере продемонстрирован классический пример иерархии, которая разработана исключительно для рисования. Т.е. целая иерархия классов разработана исключительно ради одного действия. В этом есть смысл, т.к. иерархия избавляет нас в коде от оператора if.


    V>>Если же говорится не о декомпозиции уже поставленной и четко сформулированной задачи, а о непосредственно формулировании задачи (то есть определении того, куда копаем), то опять "все украдено до нас". Почитайте про Use Case'ы, не забывая при этом что они совершенно не противоречат ООП.


    КЛ>Да, use cases используются. Но о том, как use case переводить в структуры данных не сказано ни где.


    Да не нужно их переводить в структуры данных! Нужно построить модель, реализующие эти UC с заданными ограничениями. Как именно -- дело десятое, можно например итеративно: высосали из пальца -- приложили -- подточили -- еще раз приложили, и так до победного конца, можно как-то иначе.
    Re[7]: ...продолжение
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.04.07 17:10
    Оценка: +2
    Здравствуйте, Кирилл Лебедев,

    Признаться, вы заставили меня надолго задуматься.

    ГВ>>Тогда вам, вероятно, не составит труда дать агрегированные характеристики проектов. Например, такие:

    КЛ>В основном, мне приходилось работать с проектами, размером от сотен клибайт до нескольких мегабайт.

    КЛ>Продолжительность тоже разная. От месяца до года и т.д.


    Я не зря упомянул об усреднённых цифрах. Средняя величина не колеблется в пределах "от" и "до". Она — единственная и неповторимая.

    ГВ>>И, соответственно, сводку по эволюции проектов:


    ГВ>>- Как изменились характеристики проектов после модификации (размеры до и после, сложности, соотношения в разрезе проектов и языков программирования);

    ГВ>>- Продолжительность циклов модификации;
    ГВ>>- Корреляция характеристик модификаций с усреднённым опытом команд.

    КЛ>Обычно подобная статистика собирается после обкатки методики. Т.е. я ее не собирал.


    А как же тогда обкатывать методику, если не собирать статистику в процессе обкатки?

    КЛ>Во-первых, считаю, что рано.


    То есть десятки (по вашим словам) проектов — это недостаточно для обкатки методики? Ну... в принципе, честь и хвала за такой подход. Но только я не понимаю — графики тогда откуда взялись?

    КЛ>Во-вторых, и без того еще много задач, которые необходимо решить.


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

    Пока что всё это вместе называется наукообразием.

    КЛ>Однако, если судить по эволюции проектов, которые правильно спроектированы (пусть даже и небольших), то можно увидеть следующее:


    КЛ>1)... 2)... 3)...


    "Правильно" — это как? По вашей методике? Или "вообще"?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[13]: О наследовании, иерархиях и проектировании (философс
    От: FDSC Россия consp11.github.io блог
    Дата: 22.04.07 13:50
    Оценка: +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>А в этом примере уменьшения кода и нет.


    КЛ>Как же это нет? Даже первоклассник сможет сказать, что 1 класс — это меньше, чем 4 класса.


    Вот именно, первоклассник скажет, что меньше. А программист знает, что и одна процедура может быть на 2000 строк.

    FDS>>Здесь есть введение дополнительного абстрактного слоя, о чём я и говорю.


    КЛ>Давайте говорить предметно. Какой "абстрактный слой" появился благодаря сворачиванию 4-х "датчиков" в один?


    Давайте, к чему и призываю. Здесь http://www.triz-ri.ru/themes/kri_2007_lebedev-28.asp# у вас всё равно остаётся 3 класса на диаграмме. Вы просто ещё выставляете 4-ый класс, который работает с этими 3-мя.

    FDS>>Любая проблема архитектуры решается введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества абстрактных слоёв, если не ошибаюсь, именно это написано у кого-то из участников форума в подписи. Так что тут ничего нового. Никакого уменьшения ОБЪЁМА кода нет, а раз так, значит по прежнему могут возникнуть очень и очень острые проблемы побочных эффектов, неправильного понимания механизмов работы алгоритмов или неучтённых, но нужных информационных связей.


    КЛ>Как же это нет? Добавление промежуточного слоя как раз-таки уменьшает количество кода! Но только в пределах одного слоя. Просто "пухлый" код внутри одного слоя разносится по нескольким слоям.


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

    КЛ>Но это и есть решение проблемы сложности! Каждый слой от этого становится легче сопровождать! Никто вообще не говорил о том, что уменьшение объема кода должно неминуемо приводить к уменьшение количество character'ов!


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

    FDS>>Т.е. все проблемы остаются. Вы всего лишь пытаетесь научить общественность тому, что она уже умеет: пытаетесь сказать, что вот мол, ребята, давайте вводить более удобные интерфейсы. ДАВАЙТЕ, ДВУМЯ РУКАМИ ЗА!!!


    КЛ>По-своему, правильно. Но только кроме призывов, у меня содержатся еще и конкретные методы, как этой задачи достичь.



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

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


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


    КЛ>О том, что проектированию надо учить, никто не возражает. Но учить проектированию легче, когда есть конкретные методы. Если методов нет, то и учить сложнее.


    Я не увидел конкретных методов.

    КЛ>Кстати, почему это Вы называете мои конкретные советы абстрактными? Давайте говорить предметно. Какой из советов Вы считаете абстрактным? И что Вы в нем не понимаете?


    Я называю ваши советы абстрактными просто потому что я не увидел ничего, кроме названия этих советов в заголовках. Советы будут не абстрактными, когда они будут подкреплены реальной информацией и методикой их применения. Фактически у вас и советов то нет, только совсем уж очевидные, что давайте ребята делать более удобные интерфейсы, как я уже сказал. Всё, больше там советов нет.
    Re[13]: ...продолжение
    От: FDSC Россия consp11.github.io блог
    Дата: 04.05.07 13:38
    Оценка: +1 :)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Уважаемый коллега! В детстве, Вы наверняка, смотрели мультик про слоненка, мартышку, попугая и удава. Там наглядно показано, что длину можно мерить в чем угодно. Так удава измеряли и в мартышках, и в слоненках, и в попугаях. Даже маленькие дети понимают, что измерять можно, в чем угодно. В чем удобнее, в том и измерим. Неужели же программист с более чем 10-летним стажем не понимает этой столь простой истины?


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

    G>>Но все-таки, я наверное чего-то не понимаю. Приведите примеры, в каких ситуациях и почему именно "выгоднее" измерять объем кода "в операторах". Желательно — живой пример из своего 11-летнего опыта. Просим-просим.


    КЛ>Пример есть в презентации. Если же Вам что-то непонятно, задайте вопрос без ехидства. Я отвечу. На вопросы, сформулированные в таком тоне, как сейчас, я отвечать не буду.


    Я вот например то же не понял, почему одни единицы "выгоднее" других? Чем они выгоднее? Тем, что можно слушателя запутать по поводу ожидаемого количества кода?
    У каждого измерения есть цель, грубо говоря, функциональная предпосылка. Какая цель в измерении кода количеством строк сказал выше Gaperton, а вот какая цель в измерении классами как-то не очень понятно. Тем более, что не классами он у вас должен меряться, а количеством связей и интерфейсов на одном абстрактном слое. Тут вы сами себе противоречите.




    КЛ>Я не предполагал, что для кого-то банальная истина может быть непонятна. С учетом того, что здесь уже кажется обсуждали, что текст — не единственно возможное представление кода. Поищите, думаю, обсуждение было где-то в марте-апреле.



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


    КЛ>Я, конечно, "за". Но кто будет "сворачивать" "код" на стадии "дизайна"? И какими методами? Ах, да, Вы опять скажете, что на стадии дизайна кода еще нет. Ведь, как же! Код еще не написан! А его уже пытаются сократить!!! Простая мысль о том, что одна из задач проектирования — это разработка архитектуры, при которой объем кода минимален, Вам не приходит в голову.


    Ему-то как раз приходит. Он вам и предлагает сократить объём кода, когда он ещё не написан. Потом он уже будет написан и отписать его назад будет невозможно: вот его и придётся сворачивать
    Здесь замечание уходит туда же, куда и мои замечания по поводу того, что вы не рассмотрели весь процесс разработки и не выясниили, каким образом проектировать СРАЗУ хорошую архитектуру так, чтобы необходимость в сворачивании кода была минимальна.

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


    КЛ>Ведь Вы же код меряете только в уже написанных строках! А о том, что иерархию из 115 классов (хотя бы их код и будет минимален) будет трудно сопровождать, Вы как-то не задумываетесь. Если бы задумывались, то, по крайней мере, не спрашивали бы меня, когда код полезно измерять в классах.


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


    КЛ>Не уходите в сторону, а отвечайте на вопрос: "Код стажера и код профи, действительно, по Вашему мнению, имеет одинаковое количество багов?" Тут кто-то говорил про универсальность метрик. Так что презентация тут не при чем.


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


    G>>С чего вы взяли, что люди должны тратить на ваш труд свое время? Вам тут никто и ничего не обязан. Да и презентация у вас откровенно слаба, для студента ничего, а для технаря вообще никак. Вы бы не позорились с докладами на конференциях, побольше читали, да еще поменьше про 11 лет своего опыта говорили — а то люди-то смеяться будут над вами. Я совершенно серьезно это вам говорю. Себе же хуже делаете.


    КЛ>С чего Вы взяли, что я вообще чего-то взял? Презентация выложена для желающих. Вам это неинтересно? Не читайте! И уж тем более не пишите какие-либо отзывы. Хотя бы потому, что написать вежливо, по-существу и конкретно у Вас не получается. А вычитывать подростковую грубость мне неинтересно.


    Не подросток Gaperton вовсе. Он на форуме с 2003 года, за это время уже вырос бы, даже если бы был подростком.
    Я бы на вашем месте так резко не реагировал даже на личную критику, в конечном итоге это вам нужно вычленить зерно истины из его критики, а не ему (если вам не нужно, то зачем вы вообще спорите?). Если честно, мне очень странно видеть вашу реакцию на критику, вы портите себе репутацию. Я ещё понимаю, когда я глупости говорю или даже резкости — да мне можно! Я ещё молодой, образумлюсь, те, кто этого не понимает, сами не очень-то значит хорошие начальники. А вот вы-то уже специалист и с опытом, и без юношеских замашек должны быть. Как же вы так?

    Я знаю, как неприятно, когда твою презентацию критикуют, но здесь очень много полезного и вам практически все говорят об одном и том же, но по разному. Нужно только прислушаться. Вас никто в дерьмо тут кунать не собирается, нужно наоборот направить людей, что бы они говорили вам понятно...
    И помните, что иногда критиковать презентацию послайдово просто нет никакого смысла, так как сама её структура неправильная.
    Re[14]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 14:35
    Оценка: -2
    Здравствуйте, FDSC, Вы писали:

    FDS>Я бы на вашем месте так резко не реагировал даже на личную критику, в конечном итоге это вам нужно вычленить зерно истины из его критики, а не ему (если вам не нужно, то зачем вы вообще спорите?). Если честно, мне очень странно видеть вашу реакцию на критику, вы портите себе репутацию.


    Со стороны Capertona была не критика, а грубость.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[25]: ...продолжение
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 24.05.07 08:50
    Оценка: +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Основных проблем две:


    КЛ>

      КЛ>
    1. Изменение, добавление или удаление отдельного атрибута приводит к реорганизации иерархии.
      КЛ>
    2. Злоупотребление оператором преобразования типов (dynamic_cast в C++ или as в C#) и, как результат, нарушение LSP.
      КЛ>

    КЛ>Более детально обо всех этих проблемах написано в одной из моих статей.


    КЛ>При использовании интерфейсов возникает еще и третья проблема — изменение прототипа одного из методов интерфейса или добавление метода в интерфейс неминуемо приводит к необходимости изменения во всех реализациях. Это, конечно, характерно для любого интерфейса (например, Win32 API или OpenGL). Но проблема проявляется довольно часто, когда интерфейс строится путем "фильтрации" — когда общие для всех классов свойства выносятся в базовые классы (интерфейсы). Т.е. когда анализируются атрибуты и сходные атрибуты группируются в базовые классы (или интерфейсы).


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

    И забываете простую штуку -- для того, чтобы появились эти самые новые требования, нужно здесь и сейчас получить работающее решение той конкретной задачи, которая была поставлена. Не больше, не меньше. Были в задаче Гради Буча именно такие датчики, он их объеденил в иерархию так, чтобы было не сложно и чтобы работало. Макаронный эфект там наблюдается, на вскидку, только в DisplayManager::display и все. Отказ от этого макаронного кода привел бы, скажем, к реализации Visitor-ов и усложнения датчиков. Т.е. решение Буча подчиняется простой идее: вовремя сделать минимально необходимый и минимально сложный код для решения конкретной задачи. Все остальные проблемы должны решаться по мере их поступления.

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

    Цитата для иллюстрации:

    Мне как-то рассказывали на фирме Sun, что когда в 1995 году оставалось три дня до сдачи «Соляриса», им нужен был тест для Фортран-транслятора. Послали в Новосибирск заказ (у Sun была там своя группа) — сделать за два дня тест. Через неделю получили ответ, что через месяц будет замечательный тест на все случаи жизни.


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



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


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[27]: О сопровождении
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 24.05.07 10:10
    Оценка: +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

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


    Не нужно забывать, что все это происходит на фоне получения прибыли от продажи предыдущей, пусть даже не очень удачной, но зато работающей версии.

    E>>Были в задаче Гради Буча именно такие датчики, он их объеденил в иерархию так, чтобы было не сложно и чтобы работало. Макаронный эфект там наблюдается, на вскидку, только в DisplayManager::display и все. Отказ от этого макаронного кода привел бы, скажем, к реализации Visitor-ов и усложнения датчиков. Т.е. решение Буча подчиняется простой идее: вовремя сделать минимально необходимый и минимально сложный код для решения конкретной задачи. Все остальные проблемы должны решаться по мере их поступления.

    КЛ>Если "плясать" от предложенной ОО-модели, то, действительно, ничего, кроме dynamic_cast'ов или Visitor'ов не остается. Но эти проблемы — прямое следствие предложенной модели. Если модель переделать, то код не усложниться, а dynamic_cast'ы и Visitor'ы не понадобятся.

    КЛ>Решение существует и для задачи с датчиками, и для задачи с кнопками и итемами. Если WolfHound'у будет интересно, это новое решение можно будет обсудить.


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


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[30]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 03.06.07 12:07
    Оценка: -2
    Здравствуйте, AndrewVK, Вы писали:

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


    Не смотря на то, что английский термин (coupling) упомянут Вами верно, в переводах используется другое слово — "зацепление". А вот как раз "связность" считается очень полезной. Приведу цитату:

    "Двумя важными понятиями при разработке программ являются зацепление (coupling) и связность (cohesion). Связность — это мера того, насколько отдельная компонента образует логически законченную, осмысленную единицу. Высокая связность достигается объединением в одной компоненте соотносящихся (в том или ином смысле) друг с другом функций. <...>

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

    Тимоти Бадд. Объектно-ориентированное программирование в действии / Пер. с англ. — СПб.: Питер, 1997. — с. 61 — 62.


    Поэтому код должен быть связан (это хорошо!), но не зацеплен.

    AVK>Теперь вернемся к ООП. В самой его (ООП) базе есть специальное решение, которое как раз и предназначено для уменьшения связности. Называется оно инкапсуляция. <... skip ...> Очевидно, что чем беднее и формальнее контракт, тем ниже связность. Соответственно, если мы стремимся к минимизации связности, то нужно стремится и к минимизации каждого конкретного контракта (не нарушая при этом целостности кода!).


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

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

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

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

    1. Создать форму и контролы.
    2. Правильно структурировать дочерние контролы (т.е. прикрепить дочерние элементы к родительским).
    3. Правильно расположить контролы на форме и внутри других контролов.
    4. Отобразить форму и контролы.
    5. Обрабатывать команды от контролов.
    6. И т.д. (список далеко не полон).

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

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

    Именно поэтому я и предложил в решении ряд моделей:

    1. Структурная модель.
    2. Визуальная модель.
    3. Топологическая модель.
    4. Динамическая модель.

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

    AVK>Но есть еще и наследование, которое здесь обсуждается. Тут есть одна большая засада — дело в том, что в случае наследования в классических языках под одной крышей смешали две сущности — наследование контрактов и наследование реализаций. Второе имеет весьма опосредованное отношение к обсуждаемому вопросу. Остается наследование контрактов. Его можно использовать двояко — во-первых как некий констрейнт, заставляющий соблюдать базовые контракты при декларации соответствия наследуемому. Во-вторых как средство обеспечения полиморфизма.


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

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

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

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


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

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

    Что касается Вашего беспокойства о раздувании контрактов, то у меня никакого раздувания не будет. Потому что контракты определяются не атрибутами, а тем, как используется модуль. Соответственно, и атрибуты подбираются для модуля (класса) в том и только том случае, если они нужны для реализации заданной функциональности. А как там они организованы во внутренних данных модуля — дело десятое. Наоборот, люди, которые используют наследования для разнесения атрибутов по разным классам, выносят атрибуты в контракты. А атрибуты имеют тенденцию изменяться чаще. Соответственно, при таком подходе и контракты реорганизуются чаще. Я уж не говорю вообще о том, что вместо одного контракта плодится несколько других, и вместо того, чтобы для решения одной задачи обратиться к одному интерфейсу, пользователь (тоже программист) вынужден будет обращаться к нескольким интерфейсам. Опять-таки возрастает зацепление, т.к. вместо связи 1 к одному возникает связть 1 к N, где N — количество интерфейсов.

    AVK>Сущность понятие растяжимое. Собственно, их количество зависит от проведенной декомпозиции.

    Можно сказать и по-другому. Группа однотипных задач должна решаться одним функциональным модулем (ну, или несколькими модулями с одинаковым интерфейсом). Т.е. интерфейс должен быть 1 на одну группу.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[34]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 03.06.07 14:55
    Оценка: +1 -1
    Здравствуйте, WolfHound, Вы писали:

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

    Я такого не говорил. Но ряд задач проектирования методика решает хорошо.

    WH>Вот пусть и отвечает за свою серебренную пулю... Пока у него это очень плохо получается.

    Я как бы и не отказываюсь разбирать задачу. Просто решение задачи — это процесс обоюдный. Я не должен уклоняться от решения, но и Вы должны отвечать на вопросы. А пока что большую часть информации я почерпнул из статей на gotdotnet.ru и rsdn.ru, а не из Ваших ответов. Конечно, Вы отвечаете на вопросы. Но полнота ответов оставляет желать лучшего.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[36]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.06.07 13:33
    Оценка: +1 :)
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Мне вобще непонятна попытка формулировать требования к архитектуре в терминах "шоб в пропертигриде показывалось", да еще вкупе с пространными теоретизированиями о слоях, модулях и идиотах-архитекторах.

    Не путайте требования к архитектуре с описанием условий задачи — суть разные вещи.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[35]: О сопровождении
    От: WolfHound  
    Дата: 20.06.07 18:15
    Оценка: +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Так почему же бедные контракты это плохо не ясно.

    КЛ>Во-первых, я не говорил, будто бедные контракты — это плохо. Я лишь заметил, что Вы никак не аргументировали Ваше утверждение. Т.е. из Вашего сообщения никак не вытекает прямая связь между бедностью контракта и слабым зацеплением и расширенностью контракта и сильным зацеплением.
    Так ты же все игнорируешь...
    Можешь еще раз перечитать пост AVK
    Re[29]: О сопровождении
    Автор: AndrewVK
    Дата: 02.06.07


    WH>>Нет уж. Тут какраз совершенно точно твое творчество. Ибо твои таблички это и есть базовый, вернее единственный, контракт.

    КЛ>Тут Вы ошибаетесь. Таблички относятся к реализации. А вот выделение в процессе создания формы различных операций, под каждую из которых и можно потом заточить структуры данных — это и есть суть решения. Это и есть базовый контракт.

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

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

    Еще раз.
    Без привязки к языку качественно спроектировать систему нельзя.
    Ибо даже в случае C++ и C# эффективные архитектурные решения будут совершенно различны. Те просто ничего общего.
    И перевод системы с одного языка на другой подразумевает не только полное переписывание но и полную переработку архитектуры.
    А если вспомнить про болие другие языки (lisp, erlang...) то там решения будут еще болие другими.

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

    КЛ>Для иллюстрации приведу пример-аналог: не смотря на то, что программа компилируется в набор нулей и единиц, глупо проектировать в "нулях" и "единицах" (или даже в ассемблерных командах).

    Это не тот форум где проходит демагогия.

    КЛ>Вы путаете обобщение с наследованием. Наследование — всего лишь удобный инструмент. Например, в C++ при помощи template'ов я могу написать обобщенный алгоритм, который будет работать с разными типами данных. Разумеется, эти типы данных должны поддерживать определенный интерфейс. Но для них совершенно не нужно объявлять базовый абстрактный класс (или interface).

    Основное требование а компоненте это связывание во время работы программы.
    Есдинственный способ связать что-то с чем-то в сатически типизированном языке это интерфейсы.
    Кстати интерфейсы не наследуют. Ибо наследовать там физически нечего. Их реализуют.

    КЛ>С тем, что такой подход неверен, я согласен. Но практикуете его Вы, а не я. Вы же отстаиваете здесь правильность атрибутного наследования. Да еще и некоторые идеологи ООП во главе с Бучем и Рамбо.

    Я?! Разве это я свалил все контролы и лейауты в одну кучу?
    Болие того наследование я вобще применяю очень редко.
    Я формализую интерфейсы и реализую их.

    КЛ>Что значит "логически принадлежит"? Каковы критерии "логичной принадлежности"?

    Такие вопросы ставят меня просто в тупик.
    Я перестаю понимать на каком уровне с тобой общаться.

    КЛ>Вы опять зациклились на полиморфизме. Действительно, его можно эмулировать. Но можно и совсем не использовать.

    Без него у тебя небудет никакого связывания во время исполнения программы.

    КЛ>Например, можно написать отдельную реализацию для каждого сеточного layout'а. А можно обойтись и одной реализацией, т.к. по сути дела нет никакой разницы (для алгоритма) между ячейкой-пикселем и ячейкой грида.

    Дело в том что нет никаких сеточных лейаутов.
    Единственный лейаут который можно назвать сеточным это грид.
    А что касается пикселей то их в общем случае нет.
    При рендере через D3D или на векторном устройстве у тебя нет никаких пикселей.
    И если векторные устройства в данный момент не актуальны то рендер через D3D или OGL очень даже востребован.
    Хотя если учесть то что экраны с большим колличеством точек на дюйм при сохранении растра не реализуймы... просто столько данных не прокачать... ну сам посчитай поток 6000*8000*3(а то и 6 байт на пиксель)*100(кадров в секунду)

    КЛ>Не думаю, что составление списка из двух-трех проблем займет пару человекомесяцев. Полагаю, что эта работа на 10 — 15 минут для человека, который с этими проблемами уже сталкивался и их как-то решал.

    Это я уже делал. Но ты отмахнулся.

    КЛ>Но я-то говорю о сеточных лэйаутах.

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

    КЛ>Хотя, при желании, и все остальные лэйауты можно свести к одному виду. Тут главное — не лениться и не возмущаться, что все лэйауты — разные, и что их невозможно скрестить.

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

    КЛ>Группировка, конечно, необходима. Тут спору нет. Только начинать ее нужно не с атрибутов, а с функций.

    Так я и начинаю.
    Болие того по другому и не группирую.

    КЛ>И группировать нужно не просто так, а в соответствии с решаемыми задачами. Т.е. для решения других задач для той же самой предметной области группировка может быть совсем другой. А так получается, что вы выделяете атрибуты и группируете их, еще даже не определившись с тем, для чего, собственно говоря, Вы это делаете.

    Это ты сам придумал.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[39]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 21.06.07 09:20
    Оценка: +2
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Относительно терминов


    Мой тебе совет — никогда не опирайся на терминологию в русских переводах IT литературы — в 99% случаев качество переводов ниже плинтуса, а переводчики те же самые, что переводят там же любовные романы. В русскоязычном community принят термин связность.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[49]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 25.06.07 17:48
    Оценка: +2
    Здравствуйте, AndrewVK, Вы писали:

    ГВ>>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать.

    AVK>Это долго расписывать.

    А ты попробуй.

    ГВ>> Да и генерация свойств для PropertyGrid-а по словам Wolfhound-а
    Автор: WolfHound
    Дата: 22.06.07
    :

    ГВ>>

    ГВ>>Так что проще сгенерить блпго это практически ничего не стоит.


    AVK>Генерация свойств для PG не есть проблема, потому что как раз там при смене выделения надо создать максимум сотню объектов, что не приведет к хоть сколько нибудь заметным проблемам. А вот к метаданным обращений и при сериализации и в дизайнере сильно больше, да и ограничения по производительности в случае сериализации значительно жестче.


    Ясно. Я пока склоняюсь к тому, что те интерфейсы, который показал WolfHound — это очень низкий уровень в иерархии абстракций. Ergo, надо копать остальные абстракции тоже.

    ГВ>>>>Тогда и накладные расходы на перезапрос интерфейса IProperty будут минимальными. В любом случае, пользователю хорошо известно, с каким объектом он собирается работать — Native или Attached.


    AVK>>>Не всегда.

    ГВ>>Не может быть. Здесь же не унифицированы интерфейсы Native и Attached.
    AVK>Еще раз повторю — все намного сложнее в реальности, чем здесь описывается.

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

    AVK>>>Вариантов решения проблемы хватает. Сейчас, к примеру, owner передается в любом случае, просто для обычного свойства он игнорируется.

    ГВ>>А куда передаётся owner?
    AVK>В специальный объект, аналог PropertyDescriptor.

    А назначение этого объекта?

    ГВ>>ИМХО — есть. Уж коль скоро появились конкретные интерфейсы.

    AVK>Это не конкретные интерфейсы, конкретные интерфейсы отличаются от того, что приводил WH.

    То есть, фактически, это такой сфероконь? А мы-то здесь копья ломаем... Великолепно, брависсимо!

    2 WolfHound: Это так и есть, что ли?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[3]: Конкретизация претензий
    От: FDSC Россия consp11.github.io блог
    Дата: 22.04.07 14:32
    Оценка: 27 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    M>>P.S. Ваша манера вести диалог, мягко говоря не очень конструктивна (я по результатам ваших постов в этом форуме). Рекомендую проанализировать , и попробовать поменять на более конструктивную.


    КЛ>Вот давайте и перейдем к конструктивной манере. Думаю, это будет возможно, когда Вы конкретизируете свои претензии. Например, "в слайде № таком-то мне непонятно то-то" или "рекомендация № такая-то мне кажется слишком абстрактной".


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

    Я вам конкретизирую здесь, хотя меня вы просили в другой ветке

    Свертывание

    * Средство борьбы со сложностью
    * Количество полезных функций, выполняемых «кодом», остается тем же, а количество структур данных, модулей сокращается

    Объединены в один список неоднородные понятия. В одном вы поясняете, что это средство, а в другом поясняете результат. Затрудняет чтение. Кстати, довольно абстрактно, но дальше у вас подробнее расписывается.


    http://www.triz-ri.ru/themes/kri_2007_lebedev-5.asp
    График не пояснён. Т.е. совершенно непонятно, что имеется ввиду


    http://www.triz-ri.ru/themes/kri_2007_lebedev-18.asp#
    Очевидное предложение: группа классов объединяется в иерархию.


    http://www.triz-ri.ru/themes/kri_2007_lebedev-22.asp#
    С какой стати датчики возвращают разные объекты и где это написано на схеме?
    http://www.triz-ri.ru/themes/kri_2007_lebedev-24.asp#
    Далее, ввели конкретное решение для задачи, общие рекомендации не даны. Все эти "разные" объекты оказались по своей сути однородными и свелись к возвращению одного скаляра. А если один метод должен вернуть массив, а другой должен вернуть скаляр, третий матрицу 4х4? Какие у вас будут рекомендации, как их физически, в коде, объединить воедино? Это не сказано, вы можете, конечно, сейчас даже объяснить, как это делать, но ничего этого в презентации нет, т.е. свет абстрактный — "ребята, объединяйте объекты, вот видите, как у меня всё здорово". Я видел людей, которые на примере простых для исследования объектов показывают как у них всё замечательно, а как дело по сложнее, оказывается, что у них методика принципиально неправильная.

    Например, альтернатива вашему подходу: функция вообще не должна возвращать объект или информацию. Она должна возвращать метод рассчёта поведения объекта.



    http://www.triz-ri.ru/themes/kri_2007_lebedev-25.asp
    Сгруппировали в массив и что? А какая дальше цель? Как обрабатывать значения, которые получены от этих датчиков если мы должны различать сущность информации? Где об этом говорится? Сгруппировать любой дурак может, но ведь на датчики ещё нужно реагировать и эта реакция может требовать именно учёта сущности информации, а не просто суммирования с коэффициентами


    http://www.triz-ri.ru/themes/kri_2007_lebedev-27.asp
    Дак что мы делаем? Те классы, которые были мы всё-таки не удаляем или удаляем? Свёртывать тут можно несколькими разными способами и ничего не сказано о том, как конкретно идёт свёртка здесь


    http://www.triz-ri.ru/themes/kri_2007_lebedev-28.asp#
    Опять же, что подразумевается под свёртыванием на уровне реализации и почему там такая-же UML-схема, как и на свёртке на уровне интерфесов?
    Тут нет никакого свёртывания на уровне реализации вообще. Нет и в принципе не может быть, это терминологическая ошибка


    http://www.triz-ri.ru/themes/kri_2007_lebedev-34.asp# и предыдущие два
    Дак как же всё-таки разнородные веса объединяются в один???? КАК они обрабатываются. Как скорость и здоровье обрабатываются одной и той же функцией?


    http://www.triz-ri.ru/themes/kri_2007_lebedev-36.asp#
    Ну дак где же тут было поглощение слоёв, когда здесь только добавление вы продемонстрировали. Слоёв-то у вас на диаграмме добавилось, см. ваше же http://www.triz-ri.ru/themes/kri_2007_lebedev-30.asp#



    http://www.triz-ri.ru/themes/kri_2007_lebedev-38.asp
    А что, мы раньше не формулировали???? Замечательная рекомендация! Это студентам первого курса такую давать надо



    http://www.triz-ri.ru/themes/kri_2007_lebedev-39.asp#
    Про параметры порядка я уже говорил немного выше http://rsdn.ru/Forum/Message.aspx?mid=2456474&amp;only=1
    Автор: FDSC
    Дата: 21.04.07
    .

    http://www.triz-ri.ru/themes/kri_2007_lebedev-40.asp
    Какой процесс вы рассматриваете, для которого указанные действия есть параметры порядка?


    http://www.triz-ri.ru/themes/kri_2007_lebedev-41.asp#
    А кто сказал, что мы что-то куда-то навешиваем? Кстати, вы предлагаете этим советом отказаться от повторного использования кода?
    С какой стати функции остаются неизменными? Функции то же меняются, только на другом уровне. Если поменялась структура данных, то и функции, связанные с её обработкой так же поменялись.
    В любом случае, необоснованное и спорное утверждение
    http://www.triz-ri.ru/themes/kri_2007_lebedev-42.asp#
    Замечательно, а кто это пытается делать?
    А вам не кажется, что диаграмма снизу очень похожа на http://www.triz-ri.ru/themes/kri_2007_lebedev-22.asp


    http://www.triz-ri.ru/themes/kri_2007_lebedev-43.asp#
    Вообще не понятно, что тут надо делать, зачем и к чему. Зачем мне что-то мысленно увеличивать? Что бы представить себе дальнейшее развитие системы? Это совершенно не обязательно делать
    Что значит "архитектура разъединяется"



    http://www.triz-ri.ru/themes/kri_2007_lebedev-44.asp
    Так и не объяснил, как это сделать. Обычно они вглубь не убираются именно по причине того, что не понятно, как это сделать, а не потому что вот все такие тупые.



    http://www.triz-ri.ru/themes/kri_2007_lebedev-45.asp#
    Вообще не понятно, о чём это. Вообще не очень понял, где был описан aNavigator
    Re[31]: ...продолжение
    От: aka50 Россия  
    Дата: 28.05.07 09:39
    Оценка: 22 (1)
    Здравствуйте, aka50, Вы писали:

    A>Почему после refinement (как это по русски? ) type T = A1 по идее дальше во всех наследниках тип T должен иметь вполне конктретный тип Base1.A1, но компилятор продолжает упорно втыкать Base11.this.T Base1.this.T и т.д. Т.е. делкарация requires не дает возможности нормально наследоваться, т.к. все методы будут постоянно требовать переорпеледения типа и будут тотально несовместимы при любом refinement...


    А вот и ответ в рассылке дали

    you're forgetting that when you write type T = A1, you're really writing type T=this.A1, so that
    base11.T = base11.A1 (actually, type T=this.type#A1 and base11.type#T = base11.type#A1)


    Т.е. я собственно что-то подобное себе и представлял (когда описывал проблему Евгению), но "математически" выразить не мог...
    Re[32]: ...продолжение
    От: aka50 Россия  
    Дата: 28.05.07 09:52
    Оценка: 22 (1)
    Здравствуйте, aka50, Вы писали:

    A>А вот и ответ в рассылке дали


    Там же ссылчка по теме: http://www.cs.kuleuven.be/~adriaan/files/hodgp_exprprob_gadt.pdf
    Re[55]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 28.06.07 08:12
    Оценка: 16 (1)
    Несколько поправок

    AVK>1) Создается экземпляр сервиса для работы с метаданными


    Не создается, а запрашивается у service provider.

    AVK>8) Для каждого из элементов получаем список возможных владельцев (для собственных свойств в качестве владельца возвращается указатель на сам элемент)


    Следует читать "на сам компонент".

    AVK>14) Если интерцептор есть и подтвердил то, что он хочет перехватить, то перекладываем задачу получения значения свойства на него.


    Интерцепторы нужны для работы со свойствами вроде Visible или Enabled в редакторе.

    AVK>17) Если для свойства есть кастомный сериализатор, то получаем экземпляр сериализатора и предлагаем ему записать свойство из контекста в МСП

    AVK>18) Если значение свойства является компонентом, то проверяем, несет ли ответственность владелец свойства за создание этого компонента.

    П.18 выполняется, если не выполняется условие в п.17.

    AVK>26) Если ни одна из проверок свойства не вернула true


    Имеются ввиду проверки в п.17, п.18, п.21
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[28]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 16:27
    Оценка: 13 (1)
    Здравствуйте, eao197, Вы писали:

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


    A>>Еще по теме хорошая статейка, где на scala рассматриваются два варианта реализации вычислителя в стороготипизированном языке и анализ проблем (а так же их преодоление )


    E>Нашлась бы добрая душа, да на пальцах бы объяснила, в чем смысл рассматриваемой в этом tech report-е проблемы. И чтобы примеры были более жизненные, а не Plus, PlusNeg и DblPlusNeg.


    E>А то все закручено, заморочено и сложно понять, нужно это вообще или нет?


    А если в кратце, то там описывается техника deep mixin composition, т.е. глубокая модификация иерархии путем подмешивания в нее нужно функциональности. Т.е. например у нас есть некий базовый функционал, но кодом, подобным
    trait Show extends Base {
      type exp <: Exp;
      trait Exp extends super.Exp {
        def show: String;
      }
      class Num(v: int) extends super.Num(v) with Exp {
        def show = value.toString();
      }
    }

    можно зменять коревые классы иерархии (в данном случае в базовый класс Exp мы подмешиваем дополнительную операцию show) при этом все это делается со статической проверкой типов, а следовательно если объявить show как abstract мы автоматом получим ошибки компиляции для тех комбинаций mixin-ов, где какой-то наследник (возможно тоже в свою очередь "подмешанный") не реализует этот метод, но и это не проблема, т.к. мы может доопределить эти методы по месту, например так:
    trait ShowPlus extends BasePlus with Show {
     class Plus(l: exp, r: exp) extends super.Plus(l, r)
                                   with Exp {
       def show = left.show + "+" + right.show;
     }
    }

    И более того, там же расписано, каким образом можно объединять иерархии в один большой компонент (правда довольно многословно, но надеюсь приделают к этому делу сахар какойнить)
    trait ShowDblePlusNeg extends ShowPlus
                             with DblePlus {
      type exp <: Exp;
      trait Exp extends super[ShowPlus].Exp
                   with super[DblePlus].Exp;
      class Num(v: int)
        extends super[ShowPlus].Num(v)
           with super[DblePlus].Num(v)
           with Exp;
      class Plus(l: exp, r: exp)
        extends super[ShowPlus].Plus(l, r)
           with super[DblePlus].Plus(l, r)
           with Exp;
    }


    Это все что я привел, для object-oriented decomposition. Т.е. для данного подхода сложно добавить новый метод (т.к. приходится переопределять Exp в все ирерахии), но легко добавлять нового наследника Exp.
    Там же рассматривается fucntion decomposion (т.е. проще говоря visitor), там проще добавлять методы, но сложнее соотвественно данные.

    Собственно суть статьи, что без изменения базовой иерархии можно создавать новые, при этом изменяя все, вплоть до корнвевых базовых классов (таких как Exp), чего в обычных языках типа Java делать крайне затруднительно.
    Re[11]: О наследовании, иерархиях и проектировании (философс
    От: vdimas Россия  
    Дата: 24.04.07 14:34
    Оценка: 12 (1)
    Здравствуйте, VladD2, Вы писали:

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


    VD>Принцип декомпозиции один и тот же.


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

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

    Почему я собственно влез — мне ООП всегда казалось очень близким именно к структурному программированию по принципу работы, да и хорошо продумманные структурные программы уж очень идеологически на ООП смахивали, но никак не на ФП. Обычная структурная программа и ООП-программа — это цифровые автоматы, в то время как ФП-программы удачнее всего будет сравнить с аналоговыми схемами без памяти.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 07:46
    Оценка: 9 (1)
    Здравствуйте, Геннадий Васильев, Вы писали:

    КЛ>>На основе анализа ряда примеров. Один из них приведен здесь. Но есть и другие.


    ГВ>Сколько их было всего? И ещё: что у вас по оси ординат?


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

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


    ГВ>А что тогда является этим самым "ключевым параметром"?


    Каждое из этих действий. Иными словами, нужно проектировать структуры данных под конкретные операции.

    ГВ>Мда. Понятно.


    Если Вам непонятен какой-нибудь термин, спросите, я постараюсь пояснить.
    Про зловредное определительство написано здесь.
    Яркий клинический случай описан здесь.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[6]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 11:59
    Оценка: 9 (1)
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Тогда вам, вероятно, не составит труда дать агрегированные характеристики проектов. Например, такие:


    ГВ>- средний размер (в строках, классах);

    ГВ>- языки программирования (распределение);
    ГВ>- продолжительность проектов;
    ГВ>- численность и квалификация команд.

    В основном, мне приходилось работать с проектами, размером от сотен клибайт до нескольких мегабайт. Языки программирования: Си, Си++, Паскаль (Дельфи), C#. Количество классов не считал. В небольших проектах (сотня-другая килобайт) их количество измеряется десятками (20 — 30). В больших, конечно, поболее.

    Продолжительность тоже разная. От месяца до года и т.д. Квалификация команд тоже разная. Но, в основном, 2-3 ведущих программиста и столько же (или даже больше) вчерашних студентов.

    ГВ>И, соответственно, сводку по эволюции проектов:


    ГВ>- Как изменились характеристики проектов после модификации (размеры до и после, сложности, соотношения в разрезе проектов и языков программирования);

    ГВ>- Продолжительность циклов модификации;
    ГВ>- Корреляция характеристик модификаций с усреднённым опытом команд.

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

    Однако, если судить по эволюции проектов, которые правильно спроектированы (пусть даже и небольших), то можно увидеть следующее:

    1) Очень маленькое количество багов. Измеряется штуками: от 2 до 5. Практически все баги находятся на этапе тестирования.
    2) К коду обязательно прилагается документация с описанием дизайна. На более-менее значительные изменения в коде тоже есть документация.
    3) Впоследствии код под давлением новых требований изменяется, но очень незначительно. Архитектура не разрушается и остается цельной. Т.е. изменения укладываются в существующую модель.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[50]: О сопровождении
    От: WolfHound  
    Дата: 25.06.07 20:19
    Оценка: 8 (1)
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>>>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать.

    AVK>>Это долго расписывать.
    ГВ>А ты попробуй.
    Если в двух словах то в твоей модели на каждый десериализуемый объект нужно создавать еще пару десятков объектов.
    Причем цель жизни каждого из них один раз установить значение свойства.
    Это дорого.
    Да и не нужно ибо создание + однократное использование твоего объекта не проще чем однократное использование моего.

    ГВ>Ясно. Я пока склоняюсь к тому, что те интерфейсы, который показал WolfHound — это очень низкий уровень в иерархии абстракций. Ergo, надо копать остальные абстракции тоже.

    Не надо. Это абсолютно самодостаточная модель.

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

    Не нужно. В прочем ты себя послушай... расписать задачу от и до. Да где ты такое видел? Такого не бывает ни где и ни когда. В принципе.
    Ну разве что сюда опять зайдут программисты софта для АЭС или шатлов

    Что касается посылок достаточно посмотреть к чему они приводят... А приводят они к ужасной лапше в которой все завязано на все.
    Просто идеи типа дать всем контролам текст и картинку с моей точки зрения является абсолютно не допустимыми при создании чего бы то нибыло.
    И не надо тут говорить про пример, затычку, отмазку и тп. Данное решение говорит лучше 1000 слов. Я никогда не позволю себе такое даже в качестве отмашки. Я корее просто пошлю чем изрбражу такое.

    Причем мои интерфейсы тут абсолютно не причем.
    Они нацелены на совершенно иной уровень абстракции и порядка в системе.

    А тому что напректировал Кирилл ничето не поможет.
    Ибо он действует из совершенно не верных посылок.
    И наиболие фатальныя из них это: Система должна быть минимальной.
    БРЕД! Эта посылка работает при создании материальных систем ибо там основные затраты это воплощение в железе, камне и тп. Хотя даже тут пока еще работает... ибо чем дальше тем не матереальная составляющея становится все больше и больше.

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

    Но тут и близко не тот случай.
    Сравнивается макаронная архитектура в которой все завязано на все и при попытке добавить то на что в начале создания не закладовались все посыпится. Скажем сплайн лейаут Кирилл не добавит никогда ибо на него не расчитана система. Он просто не влезет в его таблички. Никак.
    Разве что ему придется поравить все.

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

    Да в первой системе сущьностей и возможно кода на первых этапах меньше.

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

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

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

    Ты что тоже не понимаешь чем win от web отличается и почему за 5 минут на коленке под них общий интерфейс не подвести?

    ГВ>То есть, фактически, это такой сфероконь? А мы-то здесь копья ломаем... Великолепно, брависсимо!

    Это мои интерфейсы.
    Они очень похожы на то что я сделал работая вместе с Андреем.

    ГВ>2 WolfHound: Это так и есть, что ли?

    Сейчас я там не работаю и не знаю что именно там происходит.
    Но когда уходил оставлял все практически так как показал.
    За исключением мелочей (типа имен интерфейсов), того что это было написано под первый фреймворк и одного большого класса с кучей статических функций часть которых уехала в реализацию IDomain, другие были заменены на public IEnumerable<T> FilteredElements<T>() where T : class, IElementBase, а третьи просто умерли из-за того что я сделал болие чистую модель. В частности заполнил дырку на той картинке и ввел интерфейс IType.
    Те изменения косметические.
    Суть не изменилась.

    Для тех кто не понял в чем суть повторю еще раз:
    1)Отделить от объектов (контролов в частности) то что им знать не нужно.
    2)Обеспечить работу абстрактных сериалайзеров и дизайнеров с данной объектоной моделью.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: FDSC Россия consp11.github.io блог
    Дата: 21.04.07 09:05
    Оценка: 6 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Тогда это не "ключевые параметры порядка", а упорядочивающие ключевые параметры


    КЛ>Возможно, так будет лучше. Но термин "параметр порядка" предложен не мной, а отцом синергетики — Германом Хакеном. См. здесь.


    К сожалению, здесь вы вообще, как мне кажется, забыли о том, что параметр порядка, величина, как подразумевается в работе Хакена, численная. А вы предлагаете выбирать дискретные объекты. Да и вообще, тогда вы дублируете слово "ключевые" и словом "порядка", так как те параметры, которые ключевые, и есть параметры порядка. От других параметров поведение системы качественно не зависит. Но это к слову.

    Главное: в системе, которая нам дана или которую мы разрабатываем, мы НЕ МОЖЕМ выбирать параметры порядка. Параметры порядка в разрабатываемой системе будут получаться сами собой и нам нужно их не выбирать, а исследовать и находить. Это ваша грубая ошибка в работе. Грубейшая. Если бы вы сказали, как найти такие параметры, как сделать так, что бы они совпадали с действительно значимыми параметрами моделируемой среды, как недопустить спонтанного появления новых, паразитирующих, параметров порядка, вот тогда ваша работа была бы, наверное, просто классической и её стали бы проходить в ВУЗе. Но у вас этого нет, да и не может быть.
    Re[51]: О сопровождении
    От: WolfHound  
    Дата: 26.06.07 21:56
    Оценка: 5 (1)
    Здравствуйте, EvilChild, Вы писали:

    WH>>[миниакальный смех] Му-ха-ха-ха!... [/миниакальный смех]

    EC>Пример того, что хочется упростить можно?
    Сейчас так
        FileProcessor().ProcessLines(inFileName, outFileName, lines => lines.
            MapLazy(line => regexp match (line) {
            | @"[^:]+:(?<time>\d+:\d+:\d).*\]\s*(?<ip>\S+).*" => Some((time, ip))
            | _ => None()
            }).
            FilterOptionalLazy().
            GroupLazy((x, y) => x[0] == y[0]).
            MapLazy(seq => seq.
                CountAllToArray().
                SortInplace((x, y) => y[0] - x[0]).
                MapLazyFiltered
                    ( (count, _) => count > 100
                    , fun(count, (time, ip)) { $"$time $count $ip" }
                    )
            ).
            FlattenLazy()
        );

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

    хочется так
        FileProcessor().ProcessLines(inFileName, outFileName, seq => seq
            .RegexpMapFiltered(@"[^:]+:(?<time>\d+:\d+:\d).*\]\s*(?<ip>\S+).*") //{time : string, ip : string}
            .Group(time)
            .Map(seq => seq
                .Count(count) //{count : int, time : string, ip : string}
                .Filter(count > 100)
                .Sort(-count)
                .Map($"$time $count $ip")
            )
            .Flatten()
        );

    Плюс фильтры по потокам растащить.

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

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

    В любом случае даже первый вариант гораздо проще любого императивного решения.

    EC>Что за зверь?

    http://nemerle.org/Quick_Guide#Regular_Expressions_match
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re: О наследовании, иерархиях и проектировании (философское)
    От: gear nuke  
    Дата: 23.05.07 17:16
    Оценка: 3 (1)
    Здравствуйте, Кирилл Лебедев,

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

    Главное, что с того времени, я нашел несколько подтверждений полезности ориентира на «идеальную систему» на практике. Для решения хорошо изученных, требующих быстрого результата задач, такой подход, вероятно, не самый лучший. Но когда требуется найти решение "неразрешимой" проблемы, это может очень помочь.
    People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
    Re[32]: О сопровождении
    От: minorlogic Украина  
    Дата: 03.06.07 13:17
    Оценка: 3 (1)
    Мне кажется вы выбрали плохой пример для разбра. Очевидно что у Киррила нет опыта в решении подобных задач и вы сним находитесь в разном положении. Удачнее было бы выбрать нейтральную тему и не такую объемную , чтонить попроще. А пока вглядит диалог со стороны малоконструктивно.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[30]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 24.05.07 20:03
    Оценка: 2 (1)
    Здравствуйте, WolfHound, Вы писали:

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


    Резюмируя, можно сформулировать техническое задание в таком виде:

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

    Главная полезная функция: Создание, редактирование и визуализация форм.

    Для того, чтобы редактировать уже существующую форму редактор форм должен:

    1. Загрузить форму из файла.
    2. Редактировать форму.
    3. Сохранить форму в файле.

    Для того, чтобы создать новую форму редактор форм должен:

    1. Создать пустую форму.
    2. Редактировать форму.
    3. Сохранить форму.

    Загрузка формы состоит из нескольких операций:



    Операция редактирование тоже состоит из нескольких подопераций:

    1. Создание контрола и добавление его к форме.
    2. Удаление контрола (с формы и вообще).
    3. Размещение контрола на форме.
    4. Задание и редактирование визуальных параметров контрола.
    5. Задание обработчика события для контрола.

    Для визуализации (отображения) готовой формы в программе визуализатор должен:

    1. Загрузить форму из файла.
    2. Отобразить форму на экране и реагировать на события.

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

    Подытоживая, опишем функциональную модель редактора форм (в первом приближении):

    1. Считывание данных формы из файла.
    2. Сохранение данных формы в файле.
    3. Создание пустой формы.
    4. Удаление формы.
    5. Создание контрола.
    6. Удаление контрола.
    7. Добавление контрола к форме.
    8. Удаление контрола из формы.
    9. Размещение контрола на форме.
    10. Размещение всех контролов на форме.
    11. Отображение формы и контролов.
    12. Создание обработчика событий.
    13. Удаление обработчика событий.
    14. Ассоциирование обработчика событий с конкретным контролом.

    На основе перечисленных функций, можно выделить такие функциональные группы:

    1. Структурная. К ней относится все то, что связано со структурой (с содержанием контролов внутри формы и внутри других контролов).
    2. Визуальная. Отвечает за создание и визуализацию контролов (за цвет контрола, надпись на кнопочке или картинку).
    3. Топологическая. Отвечает за расположение контролов на форме.
    4. Динамическая. Отвечает за привязку обработчиков событий к конкретным контролам.

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

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

    1. Parent ID.
    2. ID.

    Визуальная модель может быть представлена набором таких записей:

    1. ID.
    2. Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
    3. Text.
    4. Picture.

    Топологическая модель может быть представлена структурами:

    1. ID.
    2. X.
    3. Y.
    4. Width.
    5. Height.

    Для расположения кнопок на гриде можно использовать вырожденный случай, когда X и Y задают положение ячейки, а Width и Height – всегда равны 1.

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

    1. ID.
    2. Col.
    3. Row.

    Динамическая модель состоит из набора структур такого вида:

    1. ID.
    2. Handler.

    После проведенной нормализации получили мето-описание формы в виде четырех таблиц. Внутренне каждую таблицу в программе можно представить в виде массива структур (не нужны никакие интерфейсы!). Внешне эти таблицы можно представить практически в любом формате – хоть в xml, хоть в базе данных.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[60]: О сопровождении
    От: Нахлобуч Великобритания https://hglabhq.com
    Дата: 29.06.07 09:31
    Оценка: 2 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:


    КЛ>Не могли бы Вы все-таки конкретизировать, что такое интерцептор и что он делает со свойствами Visible и Enabled.


    Interceptor Pattern, описание тут, пример здесь (ПДФ).

    Вообще — один из "строительных блоков" AOP
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    HgLab: Mercurial Server and Repository Management for Windows
    Re: О наследовании, иерархиях и проектировании (философское)
    От: IT Россия linq2db.com
    Дата: 19.04.07 13:43
    Оценка: 1 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Ответу на этот вопрос и посвящена презентация «Проектирование игровых и бизнес-программ. Разработка архитектуры, устойчивой к изменениям», которая была показана на Конференции разработчиков игр 2007. В презентации демонстрируется, что понятие «идеальная программа» существует и в программировании, и что это понятие можно успешно использовать для решения задач проектирования.


    Ниасилил. Сайт жутко тормозит. Отдельный файлик ещё можно было бы подождать пока загрузится. А сидеть ждать постраничнкую загрузку и пялиться тем временем на идиотские цитаты времени нет.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 19.04.07 14:00
    Оценка: 1 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>P.S.: По-любому презентация требует вдумчивого просмотра.


    Одна из заповедей фотографа: "Зритель задерживается у фотографии ровно настолько, насколько его задерживает сама фотография".


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.04.07 22:25
    Оценка: 1 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:

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


    Есть гипотеза, что это будут идиоты или мазохисты. Ведь здоровый человек будет издеваться над собой только если ему оно очень надо, а других путей нет. Когда же видишь что тебя намерянно пытаются сделать мазохистом, то даже смотреть желание отпадает.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 09:51
    Оценка: 1 (1)
    Здравствуйте, ZevS, Вы писали:

    ZS>Ну не так все плохо... Все же в отрасли уже выработаны рекомендации и паттерны, понятные всем.


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

    ZS>Поэтому я больше доверяю визуальным оценкам. ) Оценки таких количественных показателей как сoupling & cohesion от размера кода зависят слабо, однако именно они довольно сильно влияют на субъективную понятность.


    Согласен. Потому что эти показатели отражают возможность сконцентрироваться при анализе на отдельно взятом модуле.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 15:18
    Оценка: 1 (1)
    Здравствуйте, FDSC, Вы писали:

    FDS>А какое может быть решение в коде в абстрактной задаче?

    FDS>Дайте мне конкретику, я вам сделаю её решение

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

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

    Заметьте, все эти выводы можно сделать, зная закономерность. И совсем не касаясь конкретных задач.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[21]: ...продолжение
    От: WolfHound  
    Дата: 23.05.07 16:02
    Оценка: 1 (1)
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Допустим, с сущностями все более-менее понятно. А каковы интерфейсы? Вы писали, что их у Вас 10.

        public interface IElementBase
        public interface IEventBase : IElementBase
        public interface IPropertyBase : IElementBase
    
        public interface IAttachedElement : IElementBase
        public interface IElement : IElementBase
    
        public interface IProperty : IPropertyBase, IElement
        public interface IEvent : IEventBase, IElement
        public interface IAttachedProperty : IPropertyBase, IAttachedElement
        public interface IAttachedEvent : IEventBase, IAttachedElement
    
        public interface IType

    Первые 5 интерфейсов нужны для фильтрации и чтобы свойства не копипастить. Остальные собственно интерфейсы конкретных сущьностей.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[50]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 20:23
    Оценка: 1 (1)
    Здравствуйте, Геннадий Васильев, Вы писали:

    WH>>При клике на контрол в дизайнере мы генерируем дескрипторы для PropertyGrid'а

    ГВ>Значит, дескрипторы свойств держатся не постоянно? Интересно.
    Да. Просто не очень понятно где их держать.
    А с теме которые биндятся к присоедененным свойствам (к событиям это тоже относится) вобще не понятно что делать ибо конфигурация может менться.
    Так что проще сгенерить блпго это практически ничего не стоит.

    ГВ>Это алгоритм чего конкретно?

    Заполнения PropertyGrid'а в дизайнере для выбранного контрола.

    ГВ>Что получается на выходе? Описатель + конкретное значение свойства конкретного контрола?

    На выходе получаются описатель объекта в формате понятном PropertyGrid'у.
    Те можно его в PropertyGrid'е спокойно редактировать.

    ГВ>Почему игнорируется Recursive?

    Контролы могут быть вложены один в другой.
    И если Recursive == false то свойство цепляется только к непосредственным чилдам. Это актуально для лейаутов.
    А если Recursive == true то свойство цепляется всем вложеным контролам рекурсивно.

    ГВ>Зачем выполнять CanAttach и что служит вторым аргументом CanAttach в данном случае?

    За тем что не все свойства можно прицепить ко всем объектам.
    По этому нужно проверить а можно ли прицепить и если да то цеплять.

    Например когда рисуешь диалог удобно без написания кода выставить кнопке предопределенные действия например Ok/Cancel. А если впсомнить про web то это становится просто необходимым.
    Таким образом у диалога заводится присоедененное свойство которое цепляется только к кнопкам.
    А еще есть всякие биндеры, валидаторы,...
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 18:41
    Оценка: -1
    Здравствуйте, FDSC, Вы писали:

    FDS>Угу, очень точное, понятное и развёрнутое описание задач


    Для приведенного в презентации примера подходит. Там сказано, что это — одна из задач. У меня не было цели рассказывать обо всех задачах, с которыми сталкивается программист при проектировании AI.

    FDS>Фактически это предложение по введению дополнительных абстрактых слоёв. Не помню, у кого-то в подписи стоит по этому поводу


    Слои не только добавляются, но и схлопываются. Об этом сказано здесь.

    Кроме того, рекомендую прочесть еще вот это
    Автор: Кирилл Лебедев
    Дата: 16.02.07
    сообщение.

    FDS>Вообще не понимаю, зачем всё это писать на очевидных примерах и причём тут сокращение кода программы, когда он всё равно не сокращается. Скорее, рушится структура программы при "поглощении" классов.


    Если пример "очевиден", то:

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

    FDS>Где тут новая методика? Где тут вообще методика?


    Например, здесь, здесь и здесь демонстрируются конкретные методы унификации различий и сокращения кода.

    Я прочитал и просмотрел достаточное количество книжек по проектированию. И описаний этих методов там не заметил.

    FDS>Всё уже давно всем известно на интуитивном уровне


    Это все слова, слова... Разберите конкретную задачу хотя бы из тех, что обсуждаются на форуме "Архитектура". И тогда можно будет посмотреть, как эта задача решается без методики и как — с методикой.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 19.04.07 20:11
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, ZevS, Вы писали:


    ZS>>На мой взгляд, тезис: чем меньше система, тем она идеальней, в случае ПО не так актуален. Больное место ПО, не "размеры", а качество выполнения основной и прочих функций.


    КЛ>Не скажите. Чем больше программа, тем сложнее ее сопровождать. Согласитесь, что в "ветвистой" программе, как эта...


    Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.
    Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 19.04.07 20:52
    Оценка: -1
    Здравствуйте, ZevS, Вы писали:

    ZS>Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.

    ZS>Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.

    Увеличение размеров кода снижает сложность только, если этот код обобщается и переносится из бизнес логики в библиотеки и фреймворки. Т.е. общую сложность можно снизить только её перераспределением.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 07:48
    Оценка: :)
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>И ещё: что у вас по оси ординат?


    Сложность системы: количество модулей, классов и т.п.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 09:35
    Оценка: +1
    Здравствуйте, Геннадий Васильев, Вы писали:

    ...

    ГВ>Вот в том-то и дело, что сложность и трудность для понимания — это совсем-совсем не одно и то же.


    В общем случае — да, но они сильно скоррелированы. А вот путать сложность системы и сложность кода уж точно не следует.

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

    Ну не так все плохо... Все же в отрасли уже выработаны рекомендации и паттерны, понятные всем.

    ZS>>Безусловно между размером кода и сложностью есть связь, но ставить знак равенства...


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


    Поэтому я больше доверяю визуальным оценкам. ) Оценки таких количественных показателей как сoupling & cohesion от размера кода зависят слабо, однако именно они довольно сильно влияют на субъективную понятность.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 20.04.07 11:09
    Оценка: +1
    Здравствуйте, ZevS, Вы писали:

    ZS>Из личного опыта. Надо было внести иименения в код, довольно небольшой (всего ~500 строк), но со сложной логикой. Кем и когда этот код был написал — не известно. Так вот, изменения удалось внести только после рефакторинга (а по сути написания заново), увеличившего размер кода чуть ли не в два раза. В данном конкретном случае сложность измерялась субъективным критерием наиболее близким к понятности.


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

    ZS>Безусловно между размером кода и сложностью есть связь, но ставить знак равенства...


    При прочих равных связь практически всегда однозначная.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: prVovik Россия  
    Дата: 20.04.07 11:36
    Оценка: -1
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Про метрики я знаю. А можно уточнить, в каком случае увеличение размера программы привело к снижению измеримой сложности? И как эту сложность меряли? Какая конкретно метрика использована?


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

    Другое дело, что помимо сложности, можно говорить и об удобстве использования кода. В этом случае да, компактный код более удобен в использовании, чем раздутый. Но компактность со сложностью напрямую нисвязаны. То есть может быть компактный простой код, компактный сложный, раздутый простой код и раздутый сложный
    лэт ми спик фром май харт
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: prVovik Россия  
    Дата: 20.04.07 12:24
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:


    КЛ>Не смешивайте два разных понятия: бизнес-функция и функция языка программирования. Я говорю о первой.


    Ок, тогда не смешивайте понятия объектно-ориентированного программирования и Use-Case'ов, ибо первые отлично уживаются со вторыми
    лэт ми спик фром май харт
    Re[13]: О наследовании, иерархиях и проектировании (философс
    От: prVovik Россия  
    Дата: 20.04.07 12:59
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>В том-то и дело, что я как раз предлагаю обратное: ориентироваться не на объекты, а на действия и проектировать эти объекты под необходимые действия.


    То, о чем вы говорите как раз и называется структурная декомпозииция. Почитайте Гриди Буча, он в самом начале своей книги по ООП разбирал именно два эти подхода, и наглядно, на примере какой-то задачи по обработке файлов демонстрировал недостатки структурной декомпозиции над объектно-ориентированной.

    Если же говорится не о декомпозиции уже поставленной и четко сформулированной задачи, а о непосредственно формулировании задачи (то есть определении того, куда копаем), то опять "все украдено до нас". Почитайте про Use Case'ы, не забывая при этом что они совершенно не противоречат ООП.
    лэт ми спик фром май харт
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:28
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Ну и как же применять ваши принципы с точки зрения наследования квадрата от прямоугольника?


    КЛ>Мне кажется, что ответ дан в этом слайде, а конкретный пример приведен здесь.


    КЛ>На всякий случай, еще поясню здесь. Мне кажется, что вопрос, следует ли выводить квадрат из прямоугольника или прямоугольник из квадрата не имеет смысла вне контекста использования иерархии. Т.е. сначала нужно определить, для чего пишется иерархия (и от чего она позволяет абстрагироваться), а затем уже решать, какой класс из чего выводить. А вот задача-то иерархии в упомнутом обсуждении как раз и не прозвучала.


    КЛ>Еще конкретнее. Если мы пишем иерархию, чтобы упростить рисование, то нафига нам понадобилось добавлять в класс прямоугольника методы SetWidth() и SetHeight(), а в класс квадрата — метод SetSide()? А если — не для рисования, то тогда для чего вообще городится эта иерархия? Какую задачу она решает? И какой код помогает упростить?


    Если бы вы внимательно прочитали ту тему, ссылку на которую сами и привели, то увидели бы, что именно это я и говорю в обсуждении. Так что ваш аргумент абсолютно не верен, так как вы привели пример, где сказали, что кому-то что-то в голову не пришло, а в голову там всё, может быть и не всем, но пришло.
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:52
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Если бы вы внимательно прочитали ту тему, ссылку на которую сами и привели, то увидели бы, что именно это я и говорю в обсуждении. Так что ваш аргумент абсолютно не верен, так как вы привели пример, где сказали, что кому-то что-то в голову не пришло, а в голову там всё, может быть и не всем, но пришло.


    КЛ>Да, Ваша мысль, изложенная там, правильна. Но решения — в коде — Вы там так и не привели.


    А какое может быть решение в коде в абстрактной задаче?
    Дайте мне конкретику, я вам сделаю её решение
    Re: О наследовании, иерархиях и проектировании (философское)
    От: minorlogic Украина  
    Дата: 22.04.07 12:39
    Оценка: +1
    Из презентации не понял, как именно вы предлагаете решать описанные проблемы.
    Достаточно странная подачса материала , может файл битый ? В разделе теория распичвыется пример с сенсорами , в разделе практика даются расплывчаты рекомендаци.
    Надеюсь может доклад был получше ?

    P.S. Ваша манера вести диалог, мягко говоря не очень конструктивна (я по результатам ваших постов в этом форуме). Рекомендую проанализировать , и попробовать поменять на более конструктивную.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[9]: ...продолжение
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 22.04.07 12:53
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    ГВ>>Я не зря упомянул об усреднённых цифрах. Средняя величина не колеблется в пределах "от" и "до". Она — единственная и неповторимая.


    КЛ>Простите, но я в упор не понимаю, как проект, продолжительностью в год, можно "усреднить" до проекта, в продолжительностью в месяц.


    Запросто. Путём сложения их метрик и деления суммы пополам.

    КЛ>Проекты разные, и об этом следует сказать.


    Можно разделить проанализированные проекты на группы.

    ГВ>>А как же тогда обкатывать методику, если не собирать статистику в процессе обкатки?


    КЛ>Я говорил о количественной статистике — она действительно не собиралась. Но ни что не мешает производить качественную оценку.


    Качественную... Без количественных? В технической области?!

    КЛ>А о ней я сказал. Методика позволяет:


    КЛ>а) Сократить код.

    КЛ>б) Существенно сократить количество багов (от 2 до 5).
    КЛ>в) Существенно упростить сопровождение (архитектура не разъезжается).

    То есть, выражение "сократить код" — это не количественная оценка? Сокращение количества багов — это тоже не количественная оценка?

    КЛ>>>Во-первых, считаю, что рано.


    ГВ>>То есть десятки (по вашим словам) проектов — это недостаточно для обкатки методики? Ну... в принципе, честь и хвала за такой подход. Но только я не понимаю — графики тогда откуда взялись?


    КЛ>Опять-таки — я говорил о количественной оценке. Качественная оценка проводилась.


    Так в том-то и фокус, что качественная оценка без количественных мер (пусть и подразумеваемых, но тогда они должны быть очевидными) вырождается в банальную вкусовщину: кому что более понятно, тот то и считает более коротким-компактным-простым.

    КЛ>По поводу графиков... Их легко построить, сравнив количество классов (модулей, функций) в том или ином решении.

    КЛ>Приведенные в презентации графики ну никак не соотносятся с Вашими вопросами.

    Здравствуйте?! Как это — не соотносятся?

    Начиная отсюда:
    Автор: Геннадий Васильев
    Дата: 20.04.07

    ГВ>>>>Вот эта картинка на основе каких данных получена?
    КЛ>>>На основе анализа ряда примеров. Один из них приведен здесь. Но есть и другие.
    ГВ>>Сколько их было всего? И ещё: что у вас по оси ординат?
    КЛ>Сложность системы: количество модулей, классов и т.п.


    Притом этот график вовсе не хухры-мухры, а аж "методический вывод"!

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


    КЛ>Мягко говоря, ложное утверждение. Вы спрашиваете об одном, а графики — совсем о другом. Это называется подмена понятия.


    Хорошо, повторяю вопрос: о чём тогда сей одиозный график? Что у вас по оси ординат?

    ГВ>>"Правильно" — это как? По вашей методике? Или "вообще"?


    КЛ>Да.


    Да = "по вашей методике"? Похоже, что так.

    Но эти же наблюдения применимы и для правильного проектирования "вообще". То есть смысл проектирования — как раз в том, чтобы выделить неизменные элемены ПО и вынести их в некий фреймворк, каркас, структуру — назови хоть груздём. Иными словами, точь-в-точь то же самое можно сказать относительно любого проектирования, претендующего на "правильность"...
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[6]: Конкретизация претензий
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.04.07 12:11
    Оценка: -1
    Здравствуйте, FDSC, Вы писали:

    FDS>Когда классы объединяются в иерархию всегда выбирается такая точка зрения, с которой различия приводятся к "похожестям", иначе что же это за иерархия?


    Вот примеры иерархий, сделанные опытными программистами, где различия не устранены (== выбрана неверная точка зрения):

    Пример 1
    Автор: _nn_
    Дата: 04.03.07

    Пример 2
    Автор: AndrewVK
    Дата: 04.03.07

    Пример 3

    FDS>Вот-вот. Поэтому я и говорю, что ваши советы абстрактны. Не рассмотрены вот эти самые варианты "для чего" и соотв. объединения. Не рассмотрено как раз то, что вызывает трудности. Не рассмотрены конкретные советы КАК объединять, а общий совет обычно или очевиден, или настолько закопан, что о нём никто не вспомнит.

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

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

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

    После этого решение проявится само собой.

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

    По-моему, звучит вполне конкретно.

    КЛ>>Об учете сущности информации говорится здесь, здесь и голосом .


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


    В том-то и дело, что получается. Это потому, что я смотрю на разнородные объекты с точки зрения действия, которое собираюсь далее над ними выполнять. А правилу:

    "Если у тебя этого мало, то предпочти этот power-up" —

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

    FDS>Вы даже не показали ваше решение полно. Я его искал, но даже в конце, на страницах "Выбор направления движения" ничего не сказано о том, как вы обрабатываете разнотипную инфомацию. Такое впечатление что это очень очевидно и легко, хотя это не так, если задача хоть чуть-чуть сложная.


    У меня в презентации не было задачи рассказывать о решении целиком. Сведя различные параметры к весам, я дальше работаю с ними, как с весами. Точно так же я работаю и с объектами на трассе (как с некоторыми объектами, имеющими свой центр, радиус и тип в виде флага). В том-то и дело, что коду AI не нужны различия между ними. Он выбирает тот объект, который набирает нужный вес. А вес рассчитывается, исходя из полезности или вредности данного объекта в данный момент. А данный момент характеризуется значениями таких параметров, как количество набранных очков и здоровье.

    Но поверьте, что это сходство между разными объектами видится уже после того, как задача решена. Когда же к решению этой задачи только-только приступали, все эти объекты — автомобили, power-up'ы и мины казались разнородными.

    КЛ>>Было 2 иерархии. Осталось 2 класса. Что непонятного?


    FDS>Вот именно. Здесь у вас осталось два класса, а вот тут http://www.triz-ri.ru/themes/kri_2007_lebedev-30.asp# у вас снова появилась иерархия, просто с дополнительным абстрактным слоем. Т.е. 27-ой слайд неправильно показывает сущность свёртки как внесения абстрактного слоя. Ничего мы в те два класса не выносим, мы только делаем этими двумя классами новый интерфейс.


    30-й слайд показывает ситуацию после свертывания на уровне интерфейсов. Т.е. интерфейсы оказываются одинаковыми, а реализации — разными. Соответственно, когда мы вводим общий интерфейс, то и появляется промежуточный слой. Далее происходит свертывание на уровне реализаций, слои схлопываются, множество реализаций заменяется одной реализацией. Это и продемонстрировано на слайде 35.

    Просто Вам показана картина в развитии.

    КЛ>>Почему такая же? Сверху изображена иерархия классов. Снизу — один класс. К тому же, он имеет другое название. И не помечен, как абстрактный. А интерфейс у него и не должен был поменяться, т.к. изменения происходят на уровне реализации. Интерфейс-то остается тем же.


    FDS>Вот и возникает вопрос, как это согласуется с 30-ым слайдом. Реализацию-то вы оставили в тех классах, которые были, вы же её не впихнули в один класс. А если впихнули, то: 1. 30-ый слайд неправилен,


    Реализацию я поместил в один класс, который раньше был базовым. Но 30-й слайд тоже правильный. После слайда 27 идет небольшое методическое отступление, которое подводит итоги нескольких предыдущих слайдов. В этом отступлении говорится об этапах свертывания (на уровне интерфейсов, на уровне реализаций) и о том, что различия нужно продвигать вниз. Для иллюстрации этой мысли приводится пример из слайда 25. Т.е. для того, чтобы произвести свертывание на уровне реализаций, надо сначала продвинуть различия вниз.

    FDS>2. каким образом это приводит к уменьшению сложности непонятно, ведь этот класс должен включать все методы классов, которые он заменил, т.е. нужно расписать, что вы сделали с этими классами


    Как я уже упоминал в другом сообщении, сложность устраняется на уровне какого-то слоя. В данном примере, 4 класса заменяются одним, а массив "датчиков" и вовсе удаляется. Это продемонстрировано на слайде 44.

    FDS>Но, как же всё-таки быть, когда мне нужно в алгоритме учесть разнородные параметры. Скажем, мне нужно обработать не только целевые факторы, но и возможность их достижения, которая описывается, скажем, массивом матриц 4х4? Что мне делать, если у меня появится ещё одна группа параметров, но это будет уже, скажем, массив матриц 3х3 или, скажем, массив массивов? Как мне объединить эти группы разнородных параметров в один?


    Для этого и нужно конкретизировать:

    1) В массиве матриц 4 на 4 содержатся параметры, которые характеризуют... Я их далее использую для того-то и того-то. Делаю я это так-то и так-то.
    2) В массиве матриц 3 на 3 содержатся параметры, которые характеризуют... Я их далее использую для того-то и того-то. Делаю я это так-то и так-то.

    В отсутствии конкретной задачи унификация разнородных объектов невозможна.

    FDS>Мммм. Ну, значит, такие вопросы там задают студенты первого курса .

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

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

    Что касается Вашего утверждения, будто серьезные ошибки при проектировании делают только студенты, то это не так. Выше я уже привел примеры ошибок, совершенных опытными программистами.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: minorlogic Украина  
    Дата: 02.05.07 14:35
    Оценка: +1
    Здравствуйте, Gaperton, Вы писали:

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


    Лучшего определения патернов я в жизни не слышал !!!!

    Патерны проектирования — отход жизнедеятельности архитекторов, респект однако !!!!
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 03.05.07 12:42
    Оценка: -1
    Здравствуйте, Gaperton, Вы писали:

    G>Что хорошо — это то, что вы понимаете, что сценарии применения (вы их называете "полезными функциями", в литературе же они проходят как use cases, user stories, и пр.) являются центральным аспектом при разработке и верификации дизайна системы.


    Вероятно, Вы имеете в виду пользовательские, а не "полезные" функции. И еще одно: пользовательская функция != use case (дословно — сценарий использования). Сценарий — это все-таки сценарий.

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


    Чего-то я не помню у себя подобного утверждения.

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


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

    G>ни об общих ООП правилах — design guidelines.


    Вы заметили, что в презентации не упоминается какая-либо связь с OOD. Поверьте, это не случайно.

    G>Упомянуты "слоеные"системы — однако не указаны элементарные правила, которые не надо нарушать при их конструировании.


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

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


    Ряд проектировщиков (в том числе, авторов книг по паттернам) не согласятся с Вашим мнением. Кроме того, книги по паттернам хотя бы описывают эффективные (или просто хорошие) решения ряда стандартных задач. В отличие от книг по проектированию (тогоже Буча или Rumbaugh, Jordan или Jacobson), где ни задачи, ни решения не приводятся. А если решения и приводятся, то неэффективные и порочные.

    G>Комментировать по деталям — не вижу смысла.


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

    G>В качестве чтения — какая-нибудь основополагающая книга по RUP для начала, и вы сами измените свою презенацию.


    RUP излишне разрекламирован. На мой взгляд, реклама этой методологии сильно превышает ее возможности. В свое время я просмотрел немало статей по RUP, но не увидел ни одной (!) разобранной задачи проектирования, которая была бы решена с помощью RUP. Просмотрел я и ряд книжек по UML. В некоторых из них примеры разбирались, но принятые проектные решения, мягко говоря, вызывают ужас.

    На мой взгляд, UML хорошо подходит для иллюстрации принятых проектных решений. Но уж никак не подходит в качестве средства решения задач.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: Gaperton http://gaperton.livejournal.com
    Дата: 03.05.07 16:15
    Оценка: -1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    G>>Что хорошо — это то, что вы понимаете, что сценарии применения (вы их называете "полезными функциями", в литературе же они проходят как use cases, user stories, и пр.) являются центральным аспектом при разработке и верификации дизайна системы.


    КЛ>Вероятно, Вы имеете в виду пользовательские, а не "полезные" функции. И еще одно: пользовательская функция != use case (дословно — сценарий использования). Сценарий — это все-таки сценарий.


    Равна. Разница не принципиальна. За функцией всегда стоит сценарий, и наоборот. Если вы считаете иначе — так объясняйте разницу. Не можете или не хотите — так нет смысла и воздух сотрясать.

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


    КЛ>Чего-то я не помню у себя подобного утверждения.


    Вы в тексте предполагаете четкую привязку модулей и функций.

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


    КЛ>Давайте не сравнивать реальную работу (в данном случае я пишу о презентации) с некоторым идеалом, который Вам хочется увидеть да еще и сразу. Давайте сравним с аналогами, которые уже опубликованы. Буду рад, если Вы перечислите книги или статьи, в которых уже описано, как надо проектировать программы, в которых учтены Ваши пожелания. При этом, хотелось бы не просто увидеть имена авторов и названия работ, но и ссылки (с точностью до страницы), на которых излагаются методические и инструментальные советы. Под инструментальными я понимаю те, которые можно применять на практике, как формулу Виета для получения корней квадратного уравнения.


    Да мне не то чтобы хотелось что-нибудь увидеть — я достаточно самых разных материалов по этой теме успел изучить за последние лет 10, чтобы мне еще чего-то хотелось. Это вам хотелось увидеть мнение аудитории — мои ответы часть этого мнения.

    Ссылки — много не дам, но кое-что могу по памяти. Предупреждаю — стараюсь не сильно.
    Object Modelling Technque — автор Rumbaugh. Лучший учебник по проектированию систем, содержащий большое количество упражнений. Ищем на амазоне, на русский не переводилась.

    CRC Cards Book, авторов не помню. Хорошая книга о проектировании ОО систем. Ищем в гугле — находим описание методики.

    Ищем в гугле Liscov Substitution Principle, находим лекции по ОО дизайну.

    Applying use cases, the Practical Guide
    http://www.amazon.com/Applying-Use-Cases-Practical-Guide/dp/0201309815
    Вообще у Якобсона, по моему, должно быть на ту тему что-то классическое — я, честно говоря, не читал — мне в свое время посчастливилось изобрести нечто похожее самому, что сильно ускорило мое ознакомление с методом — хватило чтения по диагонали случайного материала, уже не помню какого.

    G>>ни об общих ООП правилах — design guidelines.


    КЛ>Вы заметили, что в презентации не упоминается какая-либо связь с OOD. Поверьте, это не случайно.

    Не поверю. С какой стати? Вы что — Иисус Христос, чтоб вам верить?

    G>>Упомянуты "слоеные"системы — однако не указаны элементарные правила, которые не надо нарушать при их конструировании.


    КЛ>Выступление готовилось для грамотных специалистов.

    КЛ>Не было необходимости повторять и так всем известные истины, которые можно прочитать хотя бы у Фаулера в книге "Архитектура корпоративных приложений".
    Извините, для грамотных специалистов в вашем выступлении нет ничего нового. Совсем. Не понятно, что вы вообще хотели сказать.

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


    КЛ>Ряд проектировщиков (в том числе, авторов книг по паттернам) не согласятся с Вашим мнением.

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

    КЛ>Кроме того, книги по паттернам хотя бы описывают эффективные (или просто хорошие) решения ряда стандартных задач. В отличие от книг по проектированию (тогоже Буча или Rumbaugh, Jordan или Jacobson), где ни задачи, ни решения не приводятся. А если решения и приводятся, то неэффективные и порочные.

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

    G>>Комментировать по деталям — не вижу смысла.


    КЛ>Здесь я с Вами не согласен. Потому что в деталях-то как раз и заключается здравое зерно.

    Здесь я с вами не согласен . Его там нет, а если оно и есть — у вас, увы, не получилось его показать.

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


    Мое мнение это мое мнение. Можете получить другое мнение — например так. Расскажите вашу презентацию самое вчерашнему студенту — он будет вас слушать раскрыв рот.

    G>>В качестве чтения — какая-нибудь основополагающая книга по RUP для начала, и вы сами измените свою презенацию.


    КЛ>RUP излишне разрекламирован. На мой взгляд, реклама этой методологии сильно превышает ее возможности. В свое время я просмотрел немало статей по RUP, но не увидел ни одной (!) разобранной задачи проектирования, которая была бы решена с помощью RUP.

    Такое бывает. Читают люди вроде одну книгу, а видят там разное. Это нормально.

    КЛ>Просмотрел я и ряд книжек по UML. В некоторых из них примеры разбирались, но принятые проектные решения, мягко говоря, вызывают ужас.

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

    КЛ>На мой взгляд, UML хорошо подходит для иллюстрации принятых проектных решений. Но уж никак не подходит в качестве средства решения задач.

    Да УМЛ тут вообще не причем. Это вообще никакое не средство — это всего лишь нотация .
    Re[16]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 16:14
    Оценка: :)
    Здравствуйте, FDSC, Вы писали:

    FDS>Даже если то, что он сказал немного грубовато (именно немного), всё равно это именно критика с зерном смысла.


    На мой взгляд, он просто хамил.

    P.S.: На Ваши вопросы по теме отвечу позже.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[17]: ...продолжение
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.05.07 16:30
    Оценка: -1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    G>>Тонкая душевная организация — хороший и удобный повод оставлять без ответа неудобные вопросы. Браво, коллега.


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


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

    Вот у вас там наметился с eao конструктивный разговор. Здесь: http://rsdn.ru/Forum/Message.aspx?mid=2474034&amp;only=1
    Автор: Кирилл Лебедев
    Дата: 04.05.07
    Вот там и встретимся.

    Однако, сами понимаете — после ваших зажигательных писем "мимо тещиного дома я без шуток не хожу".
    Re[15]: ...продолжение
    От: minorlogic Украина  
    Дата: 04.05.07 18:49
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, deniok, Вы писали:


    D>>Вообще-то народу известно, что он руководил. И какими проектами.

    D>>И его опыт многими весьма ценится. В том числе потому, что он им делится не в форме истины в последней инстанции.

    КЛ>Это не отменяет необходимости корректно общаться (без наездов). Его отзыв был крайне груб. Я так считаю: если не понимаешь что-то, спроси. Или, по крайней мере, скажи, что не понимаешь. Самоутверждаться за счет других — не лучшая тактика общения.


    Киррил , вам уже неоднократно замечали что ваша манера общаться мягко говоря не лучше, высокомерно хамовитая. Так чего на зеркало пенять ?
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[14]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 19:35
    Оценка: :)
    Здравствуйте, FDSC, Вы писали:

    FDS>У каждого измерения есть цель, грубо говоря, функциональная предпосылка. Какая цель в измерении кода количеством строк сказал выше Gaperton, а вот какая цель в измерении классами как-то не очень понятно. Тем более, что не классами он у вас должен меряться, а количеством связей и интерфейсов на одном абстрактном слое. Тут вы сами себе противоречите.


    Посмотрите два примера:
    Пример 1
    Автор: _nn_
    Дата: 04.03.07

    Пример 2
    Автор: AndrewVK
    Дата: 04.03.07


    Какой из них лучше?
    Не смотря на то, что оба примера плохи, второй пример лучше. Почему? Давайте посчитаем количество классов и интерфейсов, приходящихся на одну сущность.

    В первом примере объявлено 9 классов (интерфейс IFigure хоть и объявлен, но не используется — его не считаем). Эти классы используются для представления 3-х сущностей: прямоугольника, ромба и квадрата. Итого: 3 класса на сущность.

    Во втором примере объявлено 4 класса. Они используются для представления 2-х сущностей: прямоугольника и квадрата. Итого: 2 класса на сущность.

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

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

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

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

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


    Я немного ошибся. На самом деле, это утверждение было не на форуме, а в статье. Возможно, похожее обсуждалось и на форуме, но я первее нашел статью.


    "Сегодня 99% программистов считают, что программирование есть запись инструкций, которым должен следовать компьютер. Нас учили, что компьютеры смоделированы по модели машины Тьюринга, так что они «думают» в терминах наборов инструкций. Но такой взгляд на программирование неполноценен: он путает способы и цели программирования. Я покажу, чем ЯОП лучше традиционного программирования, но в первую очередь необходимо кое-что прояснить: программа в ЯОП – это не набор инструкций. Тогда что это?

    Имея проблему, я обдумываю ее решение. Это решение выражено в словах, понятиях, концепциях, мыслях – как бы вы их не называли. Это модель решения в моей голове. Практически никогда я не думаю о наборах инструкций, вместо этого я думаю о взаимосвязанных концепциях, специфичных для области в которой я работаю. К примеру, рассуждая о GUI, я думаю «Эта кнопка должна быть там, это поле тут, а в комбобокс надо поместить набор значений». Я могу даже просто представлять картинку, вообще не используя слов.

    Я называю эту мысленную модель решением: я могу объяснить ее другому программисту с достаточной степенью детализации, чтобы он мог сесть и написать программу (скажем, на Java), решающую проблему. Мне не нужно выражать решение в терминах языка программирования – оно может быть в любой форме. Объясняя GUI, я рисую картинку. Это предметно-ориетированное представление должно быть программой. Другими словами, должен быть способ использовать это представление как готовую программу, а не только как способ общения с другими программистами. Отсюда следует мое неформальное определение программы: программа есть любое однозначно описанное решение проблемы. Или, более точно: программа есть любая точно определенная модель решения некоторой проблемы в некоторой предметной области, выраженная через понятия предметной области".

    http://www.rsdn.ru/article/philosophy/LOP.xml#ERF
    Автор(ы): Сергей Дмитриев
    Дата: 02.03.2006
    Пришло время следующей технологической революции в разработке софта – и становится все очевиднее, какой она должна быть. Новая парадигма программирования – вот она, перед нами. Она еще не вполне сформировалась – разные части известны под разными именами вроде Intentional Programming, MDA, порождающее программирование и т.д. Я предлагаю объединение этих новаторских подходов под общим именем «языково-ориентированного программирования»; данная статья объясняет основные принципы новой парадигмы.


    FDS>Здесь замечание уходит туда же, куда и мои замечания по поводу того, что вы не рассмотрели весь процесс разработки и не выясниили, каким образом проектировать СРАЗУ хорошую архитектуру так, чтобы необходимость в сворачивании кода была минимальна.


    Как раз этому и посвящена презентация. Там шаг за шагом (этап за этапом) описан процесс развития кода (или, если Вам не нравится это слово, архитектуры). И понятно, что стратегически нужно двигаться к этапам 1.3, 2.2, 2.3 и 2.4. Т.е. если у Вас получается иерархия, то надо подумать, где она разъедится (этап 2.1), и как сделать так, чтобы не разъезжалась (этап 2.2).

    Если иерархия устаканилась, то следует попробовать перейти к этапу 2.3 и попытаться заменить ее одним классом, выполнив операцию свертывания на уровне реализации.

    При этом совершенно необязательно писать код. Подобные операции выполняются на этапе проектирования.

    FDS>Сворачивание кода — дополнительная паразитная работа, которой хотелось бы избежать. Об этом вам говорит Gaperton, если я его правильно понимаю, конечно


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

    FDS>Т.е. вы предлагаете всю эту иерархию запихнуть в один класс и сказать, что его будет лечге сопровождать, чем хорошо построенную иерархию из простых классов?


    Да, если решение не подразумевает оператора switch.

    КЛ>>Не уходите в сторону, а отвечайте на вопрос: "Код стажера и код профи, действительно, по Вашему мнению, имеет одинаковое количество багов?" Тут кто-то говорил про универсальность метрик. Так что презентация тут не при чем.


    FDS>Т.е. вы хотите сказать, что количество ошибок на один класс у программиста-гуру и стажёра будет одно и то же?


    Наоборот, это утверждает Гапертон.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[15]: ...продолжение
    От: fmiracle  
    Дата: 04.05.07 22:46
    Оценка: +1
    Здравствуйте, minorlogic, Вы писали:

    G>>Я-то как раз знаю, сколько ошибок допускают программисты. Скажу по секрету — по метрикам компании CQG, где я работал пару лет назад, плотность ошибок колеблется в среднем в коридоре 20-40 штук на 1000 строк кода. Язык С++.


    M>Собственно у меня вопрос , вот беру я свой модуль 400 строк кода , и задумываюсь , а как он вааще может работать если там от 8 до 16 ошибок ? Т.е. мне даже представить тяжело программу с таким к-вом багов


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

    З.Ы. В процессе коде-ревью иногда (редко, но запоминается) нахожу баги в коде, запущенном в производственную эксплуатацию, которые явно есть, но при этом не обнаруживаются, благодаря удачному стечению обстоятельств, годами...
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Re[11]: ...продолжение
    От: fmiracle  
    Дата: 04.05.07 22:46
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    G>> Что означает, что количество ошибок в среднем большей степени определяется объемом кода.


    КЛ>Позвольте спросить, Вы утверждаете, что код, написанный программистом-стажером и профи, содержит одинаковое количество багов на 1000 строк? Если Ваш ответ "да", то Вы страшно далеки от реальных проектов. Ибо количество ошибок у стажера может превышать количество ошибок у профи в десятки раз.


    Ты не учитываешь один хитрый фактор, который коварно учитывает Gaperton. Количество ошибок в программе (модуле) в целом у стажера действительно может быть в десятки раз больше чем у профи. Но. Объем кода для решения той же задачи у "профи" меньше объема кода у стажера так же десятки раз. Таким образом плотность ошибок на строки кода остается неизменной.

    Пример прямо сегодня был — переписал код программиста (причем не стажера!) — экран кода (строк 20-30), находящегося в глубоко нерабочем состоянии заменил на 3 (три!) строки кода, которые сразу заработали верно (ну, сложно ошибиться в 3 строчках, правда?).
    Сегодня же писал другой код сам — экран несложного кода, ошибка, поиск и отладка.
    Такие дела.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Re: О наследовании, иерархиях и проектировании (философское)
    От: malkolinge Украина  
    Дата: 08.05.07 15:48
    Оценка: -1
    Дорогой друг !
    То что Вам поможет, называется Бритвой Оккамы ("не плодите сущности без необходимости")
    И ей лет намного больше чем нам с вами. Так зачем плодить сущности в виде малополезных статей ?
    Re[19]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 15.05.07 08:00
    Оценка: :)
    Здравствуйте, minorlogic, Вы писали:

    M>Если у вас к-во багов близко к заявленному , и отдается сырым тестерам , я не понимаю как у вас хоть что то работает ....

    В каком смысле? Что такое "сырой тестер"? Почему непонятно, как хоть что-то работает?
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re: О наследовании, иерархиях и проектировании (философское)
    От: minorlogic Украина  
    Дата: 22.05.07 09:18
    Оценка: -1
    Кажется я понял о чем презентация автора. Он открыл для себя "Абстрактные типы данных"

    С.Макконнел. "Совершенный код", глава 6 , 6.1. Основы классов: абстрактные типы данных.
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[31]: ...продолжение
    От: Lloyd Россия  
    Дата: 24.05.07 20:13
    Оценка: -1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Необходимо разработать графический редактор форм, который будет способен создавать и редактировать формы, сохранять их мето-описание в файлах различных форматов и загружать их из файлов различных форматов. Кроме того, необходимо разработать визуализатор (или конструктор) форм, который способен создавать работающие формы на основе их мето-описания.


    Превед, креведко!
    Re[37]: ...продолжение
    От: WolfHound  
    Дата: 25.05.07 21:53
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Да я уже устал повторять. Метаданные контролов это описание свойств, событий,...

    КЛ>Для проектирования нужны конкретные примеры. Нельзя спроектировать дом, не зная, для кого он предназначен.
    Что!?!? Еще раз повторить?

    КЛ>Я говорю не о тех контролах, которые присутствуют в редакторе MS Visual Studio, а о том, что даже для большой и сложной программы вряд ли требуется бесконечное число контролов. И рекомендовал Вам обратить внимание на Word или Studio, где контролов (здесь я имею в виду интерфейс этих программ) — ограниченное количество, и весь интерфейс оформлен в едином стиле.

    Бесконечного не требуется. Но должна быть возможность в любое время добавить любой контрол.

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

    Так зачем для каждого контрола хранить текст и картинку?

    КЛ>А зачем алгоритму размещения знать, что он размещает? Зачем ему нужно знать тип контрола, текст на нем, картинку, обработчики событий и какую-то другую метаинформацию?

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

    КЛ>С точки зрения кого разные? С точки зрения контролов — форма или грид — действительно, разные. Но алгоритму размещения об этом неизвестно. Он работает с "сеткой", представленной набором ячеек. В одном случае ячейками являются ячейки грида, в другом случае — пикселы. Что от этого поменяется?

    Алгоритм размещения у каждого лейаута свой.

    КЛ>Не, сам я смотреть не буду. И так уже много трачу времени на это обсуждение. Если захотите узнать решение, объясните сами. Затем я его опишу.

    Я его знаю. И оно мне не интересно. Ибо таки "решения" я прекратил создавать много лет назад.

    КЛ>А, собственно говоря, что в этом страшного? Ваш код тоже поменяется, если Вы решите размещать контролы вдоль сплайна.

    Мой нет. Я только добавлю новый лейаут. И все. Ни что другое задето не будет.

    КЛ>Извините. Так это просто потому, что Ваша иерархия ничего не делает. Т.е. какой-нибудь функциональный код в ней вообще отсутствует. Классы коллекционируют object'ы — только и всего. На языке C++ все Ваши классы и интерфейсы я могу свести к одной записи:

    Может просто нужно понять что это такое?
    Реально эти интерфейсы позволяют полностью абстрагировать сериализатор и дизайнер от конкретных контролов.

    КЛ>Выглядит короче, а смысла столько же. Человек, работающий с Вашими интерфейсами, просто заколебается преобразовывать object'ы в надлежащие типы данных. Я уж не говорю о том, что в Ваш класс можно добавить какой угодно объект, даже тот, который добавлять нельзя, и компилятор это спокойно проглотит, потому что у Вас там object.

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

    КЛ>Разумеется доступ к этим данным имеет только код визуализации.

    А какже сериализаторы? А дизайнеры?

    КЛ>ИМХО, такой код только запутывает. В малых дозах он раздражает. А в огромных количествах просто становится несопровождаемым. Не забывайте, что после Вас программу может сопровождать совсем другой программист.

    Любой квалифицированный программист знающий C#2 поймет что тут написано вобще не напрягаясь.

    КЛ>Если не верите, предлагаю убедится на собственном опыте.

    Я легко пишу и читаю на множестве языков. C# один из них.

    КЛ>Визуально — различаю. На уровне реализации различий не знаю.

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

    КЛ>Я программирую на C++.

    А другие языки известны?

    Вот я пишу на все что компилируется. Ну или хотябы интерпритируется.

    КЛ>Я Вас все же спрашивал о конкретных проблемах, а не об абстрактном (или визуальном) отличии win от web.

    Если вы не понимаете отличий между такими разными системами то о чем мы тут вобще говорим?

    КЛ>Полагаю, что основная причина монстроидальности — это все-таки преобразование object'а к производным классам. Если бы я на C++ хранил все данные в виде указателей на void, думаю, код тоже был бы монстроидальным.

    Не угадал.
    При реализации контролов метаданные не нужны и соответственно не используются. Но описываются.
    Все интерфейсы контролов строготипизированные.

    При работе из кода с контролом те интерфейсы что я продемонстрировал также не нужны.

    Они нужны для того чтобы сделать уневерсальные редакторы и сериализоторы.
    А так как редакторы и сериализаторы работают с контролами в стиле
    foreach (IProperty prop in type.FilteredElements<IProperty>())
    {
        object value = prop.GetValue(control);
        SerializeValue(value, ...);
    ...
    }

    То ничего удобнее данной модели не придумать.

    Вобще нужно понять что .NET это не С++. И object далеко не тоже самое что void*.

    WH>>Ну например контрол который всем другим контролам добавляет свойство ToolTip

    КЛ>А зачем это делать в виде отдельного контрола?
    А что в замен? Хардкодить тултипы везде и всюду?

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

    Угу после чего прибегает заказчик с криком "Я тут такую классную фичу придумал! Она нам обязательно нужна!"
    А потом еще, и еще, и еше...
    И все. Нет твоей идеальной системы.
    Ибо система должна быть не идеальной, а устойчивой к изменениям.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[39]: ...продолжение
    От: WolfHound  
    Дата: 26.05.07 15:55
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Не смотря на модераторский статус, Вы опять пытаетесь грубить. Это выглядит странно, потому что я стараюсь избегать реплик, задевающих Ваше самолюбие. Хотя мог бы, например, написать, что сказали знакомые .NET программисты, посмотрев на Ваш код.

    Ну давай. Раскажи что же они сказали.
    А лучше давай их самих сюда. Пусть попробуют обосновать свои заявления
    Только пусть они предварительно посмотрят на классы PropertyDecriptor и EventDescriptor из .NET фреймворка. И поймут зачем и как они используются.

    КЛ>Я спрашивал конкретные примеры. Конкретный пример включает название контрола, примеры свойств (перечислить) и примеры событий.

    Зачем это? Я не понимаю.
    Дались тебе конкретные контролы. Всеравно завтра прибежит заказчик и скажет хочу супер крутой контрол. Я его вчера в одной проге подсмотрел.
    И все. Твоя до придела ужатая система начнет трещать по швам ибо нужно будет перелопатить все(сериализаторы, дизайнеры, возможно другие контролы). А моя даже не заметит появление нового контрола. Ну дописали еще одну сборку с контролом и все.
    Модель метаданных от самх контролов не зависит никак.
    Болие того модель метаданных такова что может работать с чем угодно, а не только контролами.
    Это называется повторное использование кода.

    КЛ>Я просил перечислить проблемы, с которыми Вы столкнулись, а не излияния по поводу того, что я не писал HTML-форм. Надо будет — почитаю доку и напишу.

    Так это и были проблемы. Системы фундаментально различные. Но их нужно подвести под общий знаменатель для того чтобы прикладникам (люди рисующие формочки сотнями) не приходилось делать одну и туже работу 2 раза. Болие того тонкости отношений win с web их тоже заботить не должны.

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

    А зачем мне это надо если в мою модель укладываются все контролы? Всключая контролы для принципиально другого UI и вобще то что контролами UI не является.
    Так зачем мне частности если у меня общий случай хорошо работает?

    КЛ>Я вообще не понимаю, чего Вы тут сравниваете. Ведь, судя по Вашим репликам,

    КЛ>у Вас каждый контрол воспринимается, как уникальная сущность,
    Да. А как иначе? Лепить все в кучу? Спасибо нехочу. Я это проходил очень давно. Не понравилось.

    КЛ>и Вы для его обработки (сериализации, размещения или создания) пишете особый код.

    Нет.

    WH>>Так зачем для каждого контрола хранить текст и картинку?

    КЛ>А каково Ваше решение? По особому обрабатывать каждый контрол?
    Каждый контрол это отдельный класс.
    Их можно менять как угодно не затрагивая другие контролы.
    Очень важно иметь возможно перетряхнуть один контрол не трогая другие.

    КЛ>Слишком сильное утверждение. Пока что никаких аргументов для его обоснования Вы не привели.

    Слайн-лейаут.

    WH>>Алгоритм размещения у каждого лейаута свой.

    КЛ>Если layout'ов не так много, то не страшно. А если много, то у Вас получается банальное дублирование кода и данных.
    Не получится. Дело в том что лейауты имеют разную логику. И им нужны разные данные и разный код.
    Например томуже сплайн-лейауту нужна информация о базовых точках и логика интерполяции.
    Ни одному другому лейауту ни то ни другое не нужно.

    КЛ>Сериализаторов и дизайнеров несколько или по одной штуке?

    Произвольное колличество.

    КЛ>Мне вообще непонятно в Вашем решении вот что. Допустим у Вас есть N контролов. С каждым контролом ассоциированы свои метаданные. Допустим, метаданные каждого контрола состоят из M свойств (не уверен, что правильно употребляю это слово). А еще у Вас имеется K форматов файлов, в которые нужно данные сериализовать. Сколько всего у Вас будет классов свойств?

    Реализация данной модели метаданных для всех контролов уместилась в 8 классов.

    КЛ>Вообще, пока совершенно непонятно, как Вы унифицируете метаданные (и метасвойства) разных контролов? И унифицируете ли вообще? Пока что кажется, что для каждого уникального свойства Вы заводите новый класс. И если понадобилось добавить новый контрол с незнакомыми еще свойствами, то просто плодите в коде новые классы. Так?

    Я похож на мазахиста?
    При старте программы я прохожусь по свойствам рефлекшеном. Отфильтровываю те свойства которые размечены определенным аттрибутом.
    И для каждого свойства создаю экземпляр класса ReflectedProperty.
    Вот часть его реализации:
        internal class ReflectedProperty : IProperty
        {
            delegate object GetValueProxy(object instance);
            delegate void SetValueProxy(object instance, object value);
    
            readonly GetValueProxy m_GetValueProxy;
            readonly SetValueProxy m_SetValueProxy;
            readonly IType m_Owner;
            readonly PropertyInfo m_PropertyInfo;
            readonly IType m_PropertyType;
    
            public ReflectedProperty(PropertyInfo pi, IType owner)
            {
                m_Owner = owner;
                m_PropertyInfo = pi;
                m_GetValueProxy = MakeGetValueProxy(pi);
                m_SetValueProxy = MakeSetValueProxy(pi);
                m_PropertyType = m_Owner.Domain.GetType(m_PropertyInfo.PropertyType);
            }
    
            private GetValueProxy MakeGetValueProxy(PropertyInfo pi)
            {
                if (!pi.CanRead)
                    return delegate(object instance)
                    {
                        throw new NotSupportedException();
                    };
                DynamicMethod dm = new DynamicMethod("", typeof(object), new Type[1] { typeof(object) }, this.GetType(), true);
                EmitHelper emmiter = new EmitHelper(dm.GetILGenerator());
                emmiter
                    .ldarg_0
                    .castclass(pi.DeclaringType)
                    .callvirt(pi.GetGetMethod())
                    .boxIfValueType(pi.PropertyType)
                    .ret();
                return (GetValueProxy) dm.CreateDelegate(typeof(GetValueProxy));
            }
    
            private SetValueProxy MakeSetValueProxy(PropertyInfo pi)
            {
                if (!pi.CanWrite)
                    return delegate(object instance, object value)
                    {
                        throw new NotSupportedException();
                    };
                DynamicMethod dm = new DynamicMethod("", typeof(void), new Type[2] { typeof(object), typeof(object) }, this.GetType(), true);
                EmitHelper emmiter = new EmitHelper(dm.GetILGenerator());
                emmiter
                    .ldarg_0
                    .castclass(pi.DeclaringType)
                    .ldarg_1
                    .unbox_any(pi.PropertyType)
                    .callvirt(pi.GetSetMethod())
                    .ret();
                return (SetValueProxy) dm.CreateDelegate(typeof(SetValueProxy));
            }
    
            public object GetValue(object instance)
            {
                return m_GetValueProxy(instance);
            }
    
            public void SetValue(object instance, object value)
            {
                m_SetValueProxy(instance, value);
            }

    Обрати внимание на методы MakeGetValueProxy/MakeSetValueProxy они возвращают делегат который кидает исключение при вызове если операция не поддерживается либо во время исполнения генерируют код для доступа к конкретному свойству.
    Дешево и сердито.

    EmitHelper взят из библиотеки BLToolkit. Привет IT

    WH>>Любой квалифицированный программист знающий C#2 поймет что тут написано вобще не напрягаясь.

    КЛ>К сожалению, проблемы сопровождения возникают не из-за того, что сопровождающий программист плохо знает язык программирования.
    Дык всеже в чем притензия к совершенно тривиальному коду? Приведу его еще раз.
            public IEnumerable<T> FilteredElements<T>() where T : class, IElementBase
            {
                foreach (IElementBase element in m_Elements)
                {
                    T filteredElement = element as T;
                    if (filteredElement != null)
                        yield return filteredElement;
                }
            }

    Для тех кто знает что такое yield return код кристально ясен. Остальные пусть идут учить C#2.

    КЛ>При чем здесь это? Мы ведь обсуждаем не Ваши способности, а вполне конкретные решения конкретной проблемы.

    Я хочу узнать сколько языков ты знаешь. Ибо от этого очень сильно зависит то как человек проектирует.
    Человек знающий только один язык хорошим архитектором быть не может.
    Причем нужно изучать совсем разные языки. Те не ограничиваться C/C++/pascal (C# и жаба пожалуй отдельно от C++ и ко ибо там совсем другой стиль разработки), а еще не забыть про всякие хаскели, форты и прочее.

    Вот скажем я недавно написал интерпретатор XML-based языка. Ничего особенного. Простая стековая машина (она даже не полна по Тьюрингу) заточенная под конкретную задачу. У меня на этом языке теперь демоны разговаривают. И я этому очень рад. Ибо таким образом разработчики смежных демонов говорят что им надо моему демону, а не мне (за исключением тех редких случаев когда нет нужных комманд). И они тоже рады ибо для того чтобы изменить логику не нужно трогать меня тк это много дольше чем самому поправить пару строчек в своем коде.

    WH>>А что в замен? Хардкодить тултипы везде и всюду?

    КЛ>Позвольте переспросить: Для того, чтобы добавить тултипы ко всем контролам формы, Вы заводите специальный контрол, который осуществляет такое добавление?
    Да. Причем этот контрол не знает в лицо ни один другой контрол. И все работает. Забавно правда?
    Кстати не помню как в WinForms 1 но в WinForms 2 сделано также.

    КЛ>После этого Вы спокойно формулируете новые требования к системе, добавляете их к старым требованиям, проверяете их на непротиворечивость. Затем — так же спокойно реализуете и выставляете Заказчику счет за change request.

    Я да.
    А у тебя со "спокойно реализуете" будут большие проблемы.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[40]: ...продолжение
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 26.05.07 19:55
    Оценка: +1
    Здравствуйте, WolfHound, Вы писали:

    Андрюш, дело в том что твой собеседник вобще не понимает что такое КОП. Соотв. и решение, направленное на поддержку этого самого КОП он воспринять просто не в состоянии. И получается разговор слепого с глухим.
    ... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[51]: ...продолжение
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 28.05.07 09:12
    Оценка: +1
    Здравствуйте, Sinclair, Вы писали:

    S>Grid Layout в Web изобретен Microsoft, которые с упорством, достойным лучшего применения, сделали его дефолтным в MS VS 2003. Этот layout никакого отношения к таблицам не имеет, а использует тупое абсолютное позиционирование контролов


    Точно путаешь. Grid layout (термин из Swing, WPF) это то, что в вебе реализуется как раз таки при помощи таблиц и называется табличной версткой. То, о чем ты говоришь, так и называется absolute position layout (Canvas в WPF, в Swing не помню уже).

    S>, ровно как в Windows. Название свое он получил из типографской практики, см. http://en.wikipedia.org/wiki/Grid_%28page_layout%29


    A typographic grid is a two-dimensional structure made up of a series of intersecting vertical and horizontal axis used to structure content.


    Это никак не абсолютное позиционирование. Там же пример есть:

    Очень хорошо видно, что грид тут совсем никак не пиксельная сетка.
    Ну и наконец — при разговоре о GUI под grid layout (не только в Swing) подразумевается вполне конкретная вещь.
    ... << RSDN@Home 1.2.0 alpha rev. 675>>
    AVK Blog
    Re[53]: ...продолжение
    От: Delight  
    Дата: 29.05.07 04:06
    Оценка: :)
    Здравствуйте, Sinclair, Вы писали:

    S>Может быть, может быть. Хотя, насколько я помню SWING, его grid layout значительно жестче, чем даже table layout в вебе, т.к. компоненты не могут пересекать границы клеток.

    Могут. Span поддерживается.

    Когда-то сам делал простенькую сериализацию-десериализацию в XML (.NET 1.1) и пришёл к выводу, что для управления layoutом вполне хватает splitted panel c абсолютными и процентными пропорциями деления. Практически та же HTML-table, только вид в профиль. И, само собой, контролы надо через reflection настраивать.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Re[33]: О сопровождении
    От: WolfHound  
    Дата: 03.06.07 13:37
    Оценка: +1
    Здравствуйте, minorlogic, Вы писали:

    M>Мне кажется вы выбрали плохой пример для разбра. Очевидно что у Киррила нет опыта в решении подобных задач и вы сним находитесь в разном положении. Удачнее было бы выбрать нейтральную тему и не такую объемную , чтонить попроще. А пока вглядит диалог со стороны малоконструктивно.

    Тут все гораздо запущенней. Кирилл как ему кажется изобрел методику получения хороших решений для любых задач. Данная методика также извесна как серебренная пуля. Вот пусть и отвечает за свою серебренную пулю... Пока у него это очень плохо получается.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[33]: О сопровождении
    От: WolfHound  
    Дата: 04.06.07 15:42
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Тут есть только один человек который предлагает засунуть все свойства и все алгоритмы во все контролы

    КЛ>Мягко говоря, это не соответствует истине.
    А кто кроме тебя предлагает тоже?

    Визуальная модель может быть представлена набором таких записей:
    ID.
    Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
    Text.
    Picture.

    Твое?
    Вот скажи зачем edit'у картинка?

    WH>>да еще и использовать одни и теже свойства для разных целей в зависимомти от фазы луны. И это не я.

    КЛ>Про layout'ы я Вам уже объяснял. Жаль, что Вы не поняли. Но ничего более добавить не могу.
    Все я понял. Ибо у тебя там нет ничего кроме грубейших ошибок проектирования которые я просто обхожу на автопилоте. И объяснил почему эта модель не жизнесопособна. Жаль что ты ничего не понял... болие мне нечего сказать.

    WH>>hint: Присоедененные свойства они на то и присоедененные что добавляются к компоненту внешними для этого компонента средствами, а не хардкодятся в сам компонент.

    КЛ>Просто непонятно, что Вы с этими свойствами делаете. Присоединяете ли Вы их лишь виртуально — только для того, чтобы они отображались в property grid вместе с другими свойствами контрола? Или Вы их каким-то образом динамически добавляете к другим свойствам контрола и, фактически, генерируете новый код? Или эти добавленные свойства сохраняются в XML вместе с другими свойствами контрола(т.е. "добавленные свойства" добавляются только для сохранения или только для сохранения и отображения в property grid).
    Еще раз это все детали реализации. Это мелочи которые могут менятся как угодно.
    Главное это то что в контрактах контролов остается только то что там должно быть и ничего больше.
    Те если кнопка умеет нажиматься и показывать текст то она будет уметь только это и ничего больше.
    Если сплайн-лейаут умеет выстраивать контролы вдоль некоторой кривой то в его контракте будет только то что нужно для того чтобы это обеспечить и ничего больше.

    Такое разделение позволяет делать что угодно ибо нет ничего лишнего. Ничто не путается под ногами. Каждый контрол умеет только то что должен и ничего болие. Все просто, понятно и логично.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[35]: О сопровождении
    От: Left2 Украина  
    Дата: 20.06.07 15:38
    Оценка: :)
    WH>>Вот скажи зачем edit'у картинка?
    КЛ>А зачем edit'у список дочерних окон? Или почему окну без заголовка можно установить caption? И еще много "почему" можно задать по поводу Win32.

    КЛ>Тем не менее, Win32 API стал стандартом и достаточно долго использовался разработчиками прикладных программ.


    Мало ли какое фуфло стало стандартом. Вон, каменный топор стал стандартом в каменном веке, и использовался очень долго — уж по сравнению с Win32 API так точно. Предлагаете использовать его наряду с современными инструментами по этой причине?

    Оправдывать кривизну дизайна тем что "так сделано в широкораспространённой системе XXX, и ничего — живёт как-то" — это вопиющий непрофессионализм.
    ... << RSDN@Home 1.2.0 alpha rev. 676>>
    Re[37]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 21.06.07 07:04
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Майерс поменял местами причину со следствием.


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

    КЛ>Точный критерий зацепления формулируется иначе:

    Точный критерий связности, формулируется именно так, как указано у Мейерса, Саттера и Александреску, а так же МакКонела и кучи других ребят. Цитату я уже приводил — "чем больше функций придется менять при изменении реализации — тем выше связность". Других критериев связности нет.

    КЛ> Обширность интерфейса в рамках группы однородных функций на зацепление никак не влияет.

    Еще раз повторить? Мне не сложно: Добавляя новый метод в публичный контракт — ты увеличиваешь количество способов, которыми можно добраться до приватных данных => увеличиваешь связность. Так понятнее?

    КЛ>Тут люди фактически пишут тоже самое, что и я. Они рекомендуют группировать однородные функции в отдельные модули, а не пихать в один класс методы, предназначенные для решения разных задач.

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

    КЛ> Разве алгоритм сортировки не может быть указан в качестве параметра? Почему? Хочет пользователь отсортировать массив quicksort'ом — указывает один параметр, а хочет отсортировать пузырьком — указывает другой параметр. В чем Вы видите проблему?

    Я уже писал в чем проблема. Подробно.

    КЛ>Вы хотели написать, что тем выше "зацепление"?

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

    КЛ>Если Вы обратитесь к источникам, которые я приводил выше (Гради Буч, Тимати Бадд), то увидите, что зацепление характеризует зависимость между модулями, а не между интерфейсом (контрактом) и его реализацией.

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

    КЛ>Поэтому количество функций в контракте не играет никакой роли.

    Именно по этому, число функций в контракте играет первостепенную роль.

    КЛ>Никакого не вижу плюса.

    О, начинаешь понимать?

    КЛ> Но почему Вы решили, будто я советую поместить все функции сортировки в отдельный класс?

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

    КЛ> При этом, необходимо, чтобы все коллекции поддерживали бы единый интерфейс для сортировки.

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

    КЛ>А аргументы? Поверьте, банальное шапкозакидательство без аргументации на профессиональном форуме для инженеров как-то не катит.

    Практически весь форум профессиональных инженеров, оптом, пытается донести до тебя простую мысль, о том что ты... заблуждаешься как в посылках, так и в выводах. Устали уже, внятную аргументацию ты либо игнорируешь, либо она до тебя просто не доходит, поэтому воспринимай это как простое выражение отношения..
    Мы уже победили, просто это еще не так заметно...
    Re[38]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.06.07 08:20
    Оценка: -1
    Здравствуйте, WolfHound, Вы писали:

    WH>А все остальное как всегда проигнорировал.

    WH>Я даже не удивлен.

    Так там нечего комментировать. Вы просто взяли силлогизм и неправильно перевернули его — типичная логическая ошибка.

    WH>И фигня в том что какой интерфейс такая и реализация.

    WH>А раз реализация дерьмо то и интерфейс не лучше.

    Смотрите сами:

    Силлогизм-1: Если интерфейс продуман плохо, то и реализация плохая.
    Силлогизм-2: Если реализация плохая, то и интерфейс плохой.

    Если с истинностью силлогизма-1 можно согласиться, то с истинностью силлогизма-2 — нет. Ибо правильный обращенный силлогизм формулируется так:

    Силлогизм-3: Некоторым плохим реализациям соответствует плохой интерфейс.

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

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

    WH>А я тебе сразу сказал с чем столкнулся. Главная засада из которой прямо или косвенно растут все остальные это фундаментально разные принципы работы этих платформ. Любой спец знакомый в общих чертах с win и web (а тех кто совсем не знаком пожалуй нет) легко выведет кучу очевидных проблем (о них я тоже говорил). Ну еще не нужно забывать про кучу не очевидных заботливо раскиданных меокософтом, w3c и производителями браузеров.


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

    WH>Вот только ты счел это слишкм абстрактным и стал требовать деталей.

    WH>А их в этой задачи столько что...
    Зачем перечислять все проблемы? Конкретизируйте 2 — 3.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[37]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 11:48
    Оценка: +1
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>2 WolfHound сотоварищи: Вообще, ребята, за вами прикольно наблюдать. Как только почуяли, что оппонент играет не на вашем поле, так разве что дураком не обозвали.

    WH>Ты на его "решение" посмотри.

    Обыкновенная затычка для закрывания дыры в дискуссии
    Автор: Кирилл Лебедев
    Дата: 25.05.07
    . Годится как затравка для обсуждения, коль скоро ты не стал выкладывать полный комплект корректно сформулированных требований, когда просили. В общем, можно долго спорить, чем "модель метаданных" отличается от "модели данных", если не упомянуть задачу описания структуры, решаемой метаданными.

    WH>И лично я очень сильно сомневаюсь что на других задачах будет другой результат.


    А меня, вот, обилие "может быть" в упомянутом постинге заставляет сомневаться в "конечности" этого результата.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[36]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.06.07 12:03
    Оценка: -1
    Здравствуйте, WolfHound, Вы писали:

    WH>Основное требование а компоненте это связывание во время работы программы.

    WH>Есдинственный способ связать что-то с чем-то в сатически типизированном языке это интерфейсы.

    Разве эти интерфейсы относятся к компонентам?

    WH>    public interface IElementBase
    WH>    public interface IEventBase : IElementBase
    WH>    public interface IPropertyBase : IElementBase
    
    WH>    public interface IAttachedElement : IElementBase
    WH>    public interface IElement : IElementBase
    
    WH>    public interface IProperty : IPropertyBase, IElement
    WH>    public interface IEvent : IEventBase, IElement
    WH>    public interface IAttachedProperty : IPropertyBase, IAttachedElement
    WH>    public interface IAttachedEvent : IEventBase, IAttachedElement
    
    WH>    public interface IType


    Мы ведь говорим о них, если Вы еще не забыли .

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

    А суть проблемы в том, что Вы наплодили 10 интерфейсов и еще 5 классов для их реализации. И к тому же не можете внятно объяснить, какой интерфейс за что у Вас отвечает. Говорите много "умных" слов про модели данных и метаданных. Но простая мысль о том, что не надо создавать класс (или интерфейс), у которого нет обязанностей, Вам почему-то в голову не приходит. А ведь именно об этом сказано в моей презентации.

    Тут Вам все-таки надо определиться:

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

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

    WH>Хотя если учесть то что экраны с большим колличеством точек на дюйм при сохранении растра не реализуймы... просто столько данных не прокачать... ну сам посчитай поток 6000*8000*3(а то и 6 байт на пиксель)*100(кадров в секунду)


    Ну вот при чем тут 6000 на 8000? Какое отношение это имеет к лэйаутам? Зачем вообще нужно хранить всю сетку? Почему нельзя указывать только целочисленные координаты контролов? Извините, но Ваше сообщение выглядит, как неаргументированный поток сознания. Вы уж либо по-человечески все объясните, либо прекратите "выкрикивать шаманские заклинания и стучать в бубен".

    Я уже писал, что неумение поставить и объяснить задачу фактически означает приговор для инженера. Пожалуй, соглашусь с мнением Геннадия Васильева и сочту, что Вы уклоняетесь от объяснений лишь для того, чтобы использовать мое незнание некоторых деталей (в силу того, что я не программирую на .NET) в качестве преимущества в споре. Похоже, Вы чувствуете, что объясни Вы все мне по-человечески, Ваш дизайн будет разбит в пух и прах, а предложенное решение — будет выглядеть проще и гораздо элегантнее.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[39]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 13:06
    Оценка: +1
    Здравствуйте, WolfHound, Вы писали:

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

    WH>Просто сам факт использования таких структур говорит о многом.
    WH>
    WH>ID.
    WH>Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
    WH>Text.
    WH>Picture.
    WH>


    Ни о чём он в данном случае не говорит. Озвученная Кириллом постановка задачи:

    2. Визуальная. Отвечает за создание и визуализацию контролов (за цвет контрола, надпись на кнопочке или картинку).


    Ладно, "цвета" здесь нет.

    Заменяем button на GUID0, combobox на GUID1 и т.п. Теперь даже сам Байт не сможет сказать, что модель привязана к конкретным типам контролов. Ну а то, что где-то просто обязан храниться идентификатор типа конкретного контрола, надеюсь, и так понятно.

    WH>А затычка там или нет это вопрос десятый.


    К законченному решению, к описанию подхода и к наброску для дискуссии предъявляются разные требования, не правда ли?

    WH>Человек либо всегда проектирует как следует либо всегда проектирует отвратно.


    Можно встречный вопрос? Спасибо. А почему у тебя IAttachedXXXXX вынесены в отдельные интерфейсы? Почему ты не сделал просто список attached-свойств (событий, ...)? По крайней мере, пара интерфейсов благополучно бы исчезла.

    WH>Я бы понял если бы он создал нормальный дизайн пусть не учитывая то о чем я не сказал. Но он изобразил редкостного уродца.


    Я вот, в свою очередь, понял, что ты не удосужился толком объяснить ключевые моменты задачи, а вместо этого кинулся на показанный набросок как на готовое решение по детально расписанной постановке, попутно уличая оппонента во всех мылимых и немыслимых грехах.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[37]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 13:35
    Оценка: +1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Основное требование а компоненте это связывание во время работы программы.

    WH>>Есдинственный способ связать что-то с чем-то в сатически типизированном языке это интерфейсы.
    КЛ>Разве эти интерфейсы относятся к компонентам?
    Они относятся к их метаданным.
    Но есть еще и код для обработчиков в форме. И он работает через интерфейсы конкретных контролов ибо они в зависимотсти от обстоятельств вполне могут иметь разные реализации.

    КЛ>Мы ведь говорим о них, если Вы еще не забыли .


    КЛ>Никакого динамического связывания тут не надо — Вы ведь сами писали, что у Вас имеется только одна их реализация.

    А завтра будет 2. Так всегда бывает.

    КЛ>А суть проблемы в том, что Вы наплодили 10 интерфейсов и еще 5 классов для их реализации. И к тому же не можете внятно объяснить, какой интерфейс за что у Вас отвечает.

    А может просто ты не можешь понять?
    Интерфейсы просты как пробка.
    Каждый из них отвесает за свой кусок функционала.

    КЛ> Говорите много "умных" слов про модели данных и метаданных. Но простая мысль о том, что не надо создавать класс (или интерфейс), у которого нет обязанностей, Вам почему-то в голову не приходит. А ведь именно об этом сказано в моей презентации.

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

    КЛ>

      КЛ>
    1. Либо мысль про функциональную природу класса, изложенная в презентации, для Вас стара и банальна, и Вы ее хорошо понимаете. Но тогда Ваша модель — с точки зрения этой мысли — не выдерживает никакой критики, т.к. Вы не можете сформулировать обязанности приведенных интерфейсов.
      КЛ>
    2. Либо мысль, изложенная в презентации, для Вас нова, и Вы с ней не согласны. В этом случае Вы можете отстаивать свои интерфейсы. Но тогда утверждать, что в презентации для Вас не изложено ничего нового Вы не можете.
      КЛ>
    А тебе не приходил в голову вариант что:
    1)Я понимаю все что написано в презинтации.
    2)Я понимаю ущербность такого подхода.
    Ы?

    КЛ>Ну вот при чем тут 6000 на 8000? Какое отношение это имеет к лэйаутам?

    КЛ>Зачем вообще нужно хранить всю сетку? Почему нельзя указывать только целочисленные координаты контролов?
    Зачем целочисленные?
    Зачем привязка к пикселям?
    Привязка к пикселям это анахренизм. Который тянется с тех времен когда компы были большими и медленными.
    Современные ГУИ оперируют числами с плавующей точкой.
    Посмотри на WPF(ГУИ нового поколения от мелкософт)
    И они использую для расчетов double и совершенно правы ибо это даем массу возможностей.
    Начиная с разлисных хитровывернутых лейаутов (типа такого http://www.codeproject.com/WPF/Panels.asp ) заканчивая возможностью перейти на устройства с большим разрешением.
    И вобще сейчас придет McSeem2 и раскажет про линию толщиной в 1.3 пикселя.

    КЛ>Извините, но Ваше сообщение выглядит, как неаргументированный поток сознания. Вы уж либо по-человечески все объясните, либо прекратите "выкрикивать шаманские заклинания и стучать в бубен".

    А... ну-ну...

    КЛ>Я уже писал, что неумение поставить и объяснить задачу фактически означает приговор для инженера.

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

    КЛ>Пожалуй, соглашусь с мнением Геннадия Васильева и сочту, что Вы уклоняетесь от объяснений лишь для того, чтобы использовать мое незнание некоторых деталей (в силу того, что я не программирую на .NET) в качестве преимущества в споре.

    Да причем тут .НЕТ?
    Отвечу: Совершенно не причем.

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


    Пока что все что тут было разбито в пух и прах это твои таблички...
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[38]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 14:24
    Оценка: +1
    Здравствуйте, WolfHound, Вы писали:

    КЛ>> Говорите много "умных" слов про модели данных и метаданных. Но простая мысль о том, что не надо создавать класс (или интерфейс), у которого нет обязанностей, Вам почему-то в голову не приходит. А ведь именно об этом сказано в моей презентации.

    WH>А тебе не приходила в голову мысль что ты просто не можешь понять о чем я говорю?

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

    WH>А о том что я просто знаю больше методов структуирования системы?


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

    [...]

    КЛ>>Я уже писал, что неумение поставить и объяснить задачу фактически означает приговор для инженера.

    WH>А тебе не кажется что тут проблема может быть не во мне, а в тебе?

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

    WH>Может это просто ты не можешь понять что задачи программистов не ограничиваются написанием конкретной функциональности, а дальше хоть потоп.


    WH>Мои решения направленны на упрощение развития системы.


    Ты просто вытесняешь решение конкретных прикладных задач (о которых, в частности, говорит Кирилл) на уровень самих компонентов. Но это только часть решения задачи, например, построения редактора интерфейса. Конкретно — это только его API. Коих у одного редактора может быть вагон и маленькая телега.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[40]: О сопровождении
    От: IT Россия linq2db.com
    Дата: 21.06.07 23:30
    Оценка: :)
    Здравствуйте, IB, Вы писали:

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

    IB>Удобство понятние растяжимое. Сейчас разговор о том, что ни в коем случае нельзя добиваться удобства, за счет раздувания контракта.

    public interface MyInterface
    {
        Xml Run(Xml inputXml);
    }

    ?
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[42]: О сопровождении
    От: IT Россия linq2db.com
    Дата: 22.06.07 13:47
    Оценка: :)
    Здравствуйте, IB, Вы писали:

    IB>Это ты привел пример раздутого контракта, который кому-то может быть удобен?


    Как раз совсем наоборот. Как ты и хотел я не стал добиваться удобства за счёт раздувания контракта
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[44]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 25.06.07 08:58
    Оценка: -1
    Здравствуйте, WolfHound, Вы писали:

    WH>Проблема в том что закон сохранения сложности никто не отменял.

    Такого закона не существует.

    WH>Сложность нельзя убрать.

    WH>Ее можно только перераспределить.
    Пример, который я уже приводил не раз: перемножьте XLVII и XCIV, не преобразуя их в позиционную систему счисления с фиксированным основанием.

    WH>Те сложность либо в библиотеках либо в прикладном коде.

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

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

    Конвеер — хорошо решает проблему сложности. Это было уже доказано не раз.

    WH>Это все лирика.

    WH>Это делается по умолчанию и на автопилоте.
    У Вас контролы как пишутся? Каждый контрол пишет один программист от начала и до конца? Или есть специализация "написальщиков" контролов? Один программист — составляет функциональные требования ко всем контролам (и только этим и занят), другой — продумывает дизайн (и только этим и занят), третий — занимается layout'ами (и только этим и занят), четвертый — занимается топологией (и только этим и занят), пятый — занимается алгоритмами визуализации (и только этим и занят)?

    Т.е. у Вас существует специализация работников на продемонстрированном уровне или у Вас есть только "написальщики контролов"? Существует ли у Вас разделение операций в пространстве и/или во времени?

    Если этого нет, то ни о каком "автопилоте" и речи быть не может.

    WH>Главное то что тебе нужно знать все про все контролы, а мне это не нужно.

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

    WH>Пока что это именно так и выглядит.

    WH>Иначе тех мутантов что ты описал в предыдущем сообщении ты бы не придумал.
    Заметьте, что Вы опять пытаетесь перевести конструктивный разговор в русло разборок торговцев на базаре. Я же не называю Ваш код "мутантским" или что-то типа этого.

    КЛ>>Если отбросить код на C# и немерле и описать суть решения на концептуальном уровне, то Вы предложили:

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

    WH>Ведь цель получить код который делает то что нужно.

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

    КЛ>>1) Заменить listbox (список элементов в одну колонку) гридом (списком элементов в N колонок).

    WH>VirtualTreeGrid'ом если быть точным.
    Предлагаю заменить этот термин на "контрол, который проявляет свойства дерева и грида".

    WH>Virtual означает то что он не требует чтобы были подняты все данные. Ибо данных может быть очень много.

    "...способный подгружать данные определенными порциями по мере необходимости".

    КЛ>>2) Абстрагироваться от содержимого ячейки грида (т.е. в ячейке может содержаться либо кнопка, либо эдит, либо статический текст, либо картинка, либо что-нибудь еще, например, другой контрол).

    WH>Опять не точно.
    WH>Никаких либо. Никакой конкретики.
    Здесь через "либо" перечислены конкретные примеры. Само собой разумеется, что при проектировании грида не нужно завязываться на какой-либо конкретный перечень контролов.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[45]: О сопровождении
    От: WolfHound  
    Дата: 25.06.07 13:59
    Оценка: -1
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Проблема в том что закон сохранения сложности никто не отменял.

    КЛ>Такого закона не существует.
    Это тебе так кажется.

    КЛ>Пример, который я уже приводил не раз: перемножьте XLVII и XCIV, не преобразуя их в позиционную систему счисления с фиксированным основанием.

    Ну не надо так подстваляться.
    Мы же на форуме программистов, а не тех кто на компе может только тексты в ворде набивать.
    На любом приличном языке это будет выглядить так (с точностью до синтаксиса):
    RomanNumber n1("XLVII");
    RomanNumber n2("XCIV");
    RomanNumber n3 = n1 * n2;

    Остальное детали реализации не имеющие никакого значения на данном уровне абстракции.

    КЛ>Сложность устраняется формальными моделями, которые позволяют решать задачи определенного класса, которые до этого времени решались абы как. Соответственно, для этого эти модели надо сначала разработать.

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

    Недавно мне нужно было посчитать статистику по логам. Я использовал модель потоков и филтров. Сведя задачу к декларативной.
    Болие того данная модель прекрасно распаралеливается что в свете смещеня акцента с гигагерцов на многоядерность становиьтся актуально.
    Но это всеголишь побочный эффект. Главное тут то что код получился декларативным.

    А как ты думаешь почему римская система появилась раньше позиционной?
    Да все просто.
    У нее абстракция нулевая.
    Каждая цифра обозначает конкретное число.
    Не больше и не меньше.
    Модель проста как палка.
    А в случае с позиционной нужно понимать что цифры не сами по себе, а зависят от позиции.
    Те сложность умножения ни куда не делась.
    Мы просто спрятали ее при помощи абстракции.
    А если посмотреть на тот код что я привел выше то абстракция поднята еще выше.
    Там просто введено обозначение умножения чисел и все.
    Ни какого конкретного алгоритма там нет.
    Он спрятан внутри класса RomanNumber.
    А как уж он реализован это другой вопрос.
    Переводим ли мы в позиционныю систему исчисления или перемножаем напримую римские чиселки совершенно не важно.
    Болие того мы можем заменить одно на другое так что прикладной код использующий умножение этого не заметит.
    Те допустим мы изначально не знали о позиционной системе исчисления и реализовали умножение в лоб.
    Но потом открыли позиционную систему и мы спокойно перевели внутренности класса RomanNumber на болие продвинутые алгоритмы разогнав его работу.
    При этом тонны кода которые использовали умножение (и прочие операции) не изменились, а просто стали работать быстрее.
    Все это благодоря тому что была использована абстракция болие высокого уровня чем непосредственно конкретный алгоритм умножения.

    КЛ>Конвеер — хорошо решает проблему сложности. Это было уже доказано не раз.

    Конвеер хорошо решает только массовое штампование совершенно одинаковых чайников по один раз нарисованному чертежу.
    Однако в случае с программой нет никакого массового штампования. (Вернее оно есть но оно давно и полность автоматизировано. Компилятор + утилита copy == сколько угодно копий какой угодно программы. Чайникам такое и не снилось.)

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

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

    Нарпмер есть модели: колесо, винт + гайка, блок,...

    Создание таких моделей автоматизировать невозможно.

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

    КЛ>Т.е. у Вас существует специализация работников на продемонстрированном уровне или у Вас есть только "написальщики контролов"? Существует ли у Вас разделение операций в пространстве и/или во времени?

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

    КЛ>Если этого нет, то ни о каком "автопилоте" и речи быть не может.

    А по чему этот автопилот не может работать на уровне одного человека?

    КЛ>Клиенту нужна работающая программа за минимальные деньги, а не особый контрол.

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

    2)Клиенты они разные бывают. Некоторые очень фенечки любят.

    3)Если клиент за небольшую дополнительную плату получит еще и фенечку которая ему нравится то он будет счеслив.

    КЛ>Заметьте, что Вы опять пытаетесь перевести конструктивный разговор в русло разборок торговцев на базаре. Я же не называю Ваш код "мутантским" или что-то типа этого.

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

    WH>>Так код это главное.

    КЛ>Странно слышать такие утверждения после длинных разговоров про инкапсуляцию, компонентный подход и абстрагирование.
    Нет ничего странного.
    Одно другому помогает.
    Я умею использовать абстракции для того чтобы упрощать разработку и поддержку кода.
    Болие того это дает мне возможность решать такие задачи которые те кто не обладают такими способностями не решат ни когда. Даже очень большой толпой.

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

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

    WH>>VirtualTreeGrid'ом если быть точным.

    КЛ>Предлагаю заменить этот термин на "контрол, который проявляет свойства дерева и грида".
    Хоть горшком назови.

    WH>>Virtual означает то что он не требует чтобы были подняты все данные. Ибо данных может быть очень много.

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

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

    Просто само по себе появление "либо" весьма подозрительно.
    Лично мне конкретные контролы даже в голову не приходили когда я это продумывал.
    Ибо они не имеют значения.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[52]: О сопровождении
    От: Трурль  
    Дата: 27.06.07 04:41
    Оценка: :)
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Это сфероконический пример, пока не выяснится контекст, к которому он реально относится.

    Красивый термин "сфероконический". Вызывает ассоциации то ли с древнерускими шлемами, то ли с кониками в сферическом пространстве.
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 13:51
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>Ниасилил. Сайт жутко тормозит. Отдельный файлик ещё можно было бы подождать пока загрузится. А сидеть ждать постраничнкую загрузку и пялиться тем временем на идиотские цитаты времени нет.


    Цитаты можно пропустить, нажав на ссылку "Далее".

    P.S.: По-любому презентация требует вдумчивого просмотра.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 19.04.07 14:14
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Цитаты можно пропустить, нажав на ссылку "Далее".


    Так это сделано специально?

    КЛ>P.S.: По-любому презентация требует вдумчивого просмотра.


    После издевательства с цитатами уже как-то не очень хочется.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 14:27
    Оценка:
    Здравствуйте, IT, Вы писали:

    КЛ>>Цитаты можно пропустить, нажав на ссылку "Далее".


    IT>Так это сделано специально?


    Цитаты вставлялись не мной, и поэтому поводу я Вам сказать ничего не могу. Если Вы хотите посмотреть презентацию в виде файла PPT, то можно дождаться того момента, когда она будет выложена на сайте Конференции разработчиков игр (думаю, это будет не раньше, чем через месяц). Или я могу выслать Вам ее на email.

    В любом случае, давайте закроем обсуждение чужого сайта. Буду рад, если у Вас будет что сказать по существу.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 14:54
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Хватило сил дочитать до 27-го слайда. В очередной раз понял, чем программисты отличаются от других людей -- все те этапы, которые вы расписывали на 27-и слайдах, в голове программиста проносятся в автоматическом режиме за доли секунды.


    Вот пример
    Автор: igna
    Дата: 03.03.07
    реального обсуждения, где "не пронеслось".
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 15:13
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    E>>Хватило сил дочитать до 27-го слайда. В очередной раз понял, чем программисты отличаются от других людей -- все те этапы, которые вы расписывали на 27-и слайдах, в голове программиста проносятся в автоматическом режиме за доли секунды.


    КЛ>Вот пример
    Автор: igna
    Дата: 03.03.07
    реального обсуждения, где "не пронеслось".


    И вот еще один пример
    Автор: eao197
    Дата: 28.02.07
    , где интуиция подвела и не сработала.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 19.04.07 15:20
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>И вот еще один пример
    Автор: eao197
    Дата: 28.02.07
    , где интуиция подвела и не сработала.


    Да, тоже хороший пример. Спасибо, что следите за моим творчеством.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re: О наследовании, иерархиях и проектировании (философское)
    От: FDSC Россия consp11.github.io блог
    Дата: 19.04.07 15:30
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Требования к AI:


    КЛ> 1. Должен объезжать автомобили соперников

    КЛ> 2. И т.д.

    Угу, очень точное, понятное и развёрнутое описание задач

    Фактически это предложение по введению дополнительных абстрактых слоёв. Не помню, у кого-то в подписи стоит по этому поводу

    Вообще не понимаю, зачем всё это писать на очевидных примерах и причём тут сокращение кода программы, когда он всё равно не сокращается. Скорее, рушится структура программы при "поглощении" классов.
    Где тут новая методика? Где тут вообще методика? Всё уже давно всем известно на интуитивном уровне
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 19.04.07 15:31
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, eao197, Вы писали:


    E>>Хватило сил дочитать до 27-го слайда. В очередной раз понял, чем программисты отличаются от других людей -- все те этапы, которые вы расписывали на 27-и слайдах, в голове программиста проносятся в автоматическом режиме за доли секунды.


    КЛ>Вот пример
    Автор: igna
    Дата: 03.03.07
    реального обсуждения, где "не пронеслось".


    Ну и как же применять ваши принципы с точки зрения наследования квадрата от прямоугольника?
    Re: О наследовании, иерархиях и проектировании (философское)
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 19.04.07 16:38
    Оценка:
    Здравствуйте, Кирилл Лебедев,

    Вопросы по существу.

    Вот эта картинка на основе каких данных получена?

    Вот этот пример ключевых параметров. По сути, здесь в роли ключа сортировки выступает "время, прошедшее c момента X". Или имеется ввиду что-то другое?

    Ну, и терминология, как вечно больное место:


    Хорошо, что хоть не "парадигма, как взгляд на умозрительные конструкции".
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 18:45
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    ZS>На мой взгляд, тезис: чем меньше система, тем она идеальней, в случае ПО не так актуален. Больное место ПО, не "размеры", а качество выполнения основной и прочих функций.


    Не скажите. Чем больше программа, тем сложнее ее сопровождать. Согласитесь, что в "ветвистой" программе, как эта

    if (одно)
    {
    }
    else if (другое)
    {
    }
    else if (третье)
    {
    }
    и т.д.


    разобраться сложнее.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 18:52
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Вот эта картинка на основе каких данных получена?


    На основе анализа ряда примеров. Один из них приведен здесь. Но есть и другие.

    ГВ>Вот этот пример ключевых параметров. По сути, здесь в роли ключа сортировки выступает "время, прошедшее c момента X". Или имеется ввиду что-то другое?


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

    ГВ>Ну, и терминология, как вечно больное место:


    Давайте не будем впадать в "болезнь зловредного определительства". Например, у специалистов по системному анализу так и не появились признанное всеми определение понятия "система". Но это им не мешает пользоваться этим термином.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 20:34
    Оценка:
    Здравствуйте, IT, Вы писали:

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


    Если Вас что-то не устраивает, воспользуйтесь вот этим
    Автор: Кирилл Лебедев
    Дата: 19.04.07
    моим предложением. Но, ради бога, давайте закроем этот оффтоп.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 19.04.07 20:55
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Если Вас что-то не устраивает, воспользуйтесь вот этим
    Автор: Кирилл Лебедев
    Дата: 19.04.07
    моим предложением.


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

    КЛ>Но, ради бога, давайте закроем этот оффтоп.


    Давайте не будем ничего закрывать. Давайте лучше исправим ситуацию и признаем, что данная форма подачи материала свидетельтсвуют прежде всего о наплевательском отношении на посетителей нашего сайта, от которых требуется фитбек. Мне как администратору rsdn.ru это не безразлично.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 21:57
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>Это предложение опять требует от меня некоторых телодвижений. Не проще ли на всё на это забить.


    Забейте.

    IT>Давайте не будем ничего закрывать. Давайте лучше исправим ситуацию и признаем, что данная форма подачи материала свидетельтсвуют прежде всего о наплевательском отношении на посетителей нашего сайта, от которых требуется фитбек. Мне как администратору rsdn.ru это не безразлично.


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

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

    Если администрация сайта поддержит обсуждение в конструктивном русле, я, как автор, выложу презентацию на Вашем ресурсе и дам разрешение на публикацию некоторых других своих статей, которые могут представлять интерес. Если же характер обсуждения (с Вашей стороны) будет иной, то я предпочту размещать статьи на других ресурсах, которые более уважительно (или, если хотите, более бережно) относятся к авторам.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[11]: О наследовании, иерархиях и проектировании (философс
    От: IT Россия linq2db.com
    Дата: 19.04.07 22:13
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    IT>>Это предложение опять требует от меня некоторых телодвижений. Не проще ли на всё на это забить.


    КЛ>Забейте.


    КЛ>Что касается размещения моих авторских материалов на страницах Вашего сайта, то, слава богу, по закону РФ "Об авторском и смежных правах" я, как автор, сам имею право решать — размещать или не размещать.


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

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


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

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


    Размещайте.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.04.07 22:25
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Вот этот пример ключевых параметров.


    Кстати, о птичках... Господа, прежде чем начинать письменно других учить чему-то, прочтите вот это:
    Как не надо писать статьи
    Автор(ы): Михаил Купаев (Kupaev)
    Дата: 14.03.2005
    Поиск в Google по словам "как писать статьи" выдает 664 страницы. Статьи с таким названием писали столь уважаемые люди, как Г.А. Шенгели, А.А.Шалыто и др. Но в целом, 664 страницы — это, конечно, перебор. Понятно, что большая часть этого моря писанины сочинена людьми, писать статьи не умеющими. Если бы они умели писать статьи, они их писали бы, а не учили других. Признаюсь честно – я не знаю, как надо писать статьи. Зато за время своего редакторства я насмотрелся на такое количество уродцев, которого хватило бы на пару питерских Кунсткамер, и еще осталось бы на несколько курортных выставок. Поэтому я достаточно хорошо представляю себе, чего при этом делать не нужно. Вот об этом-то я и попытаюсь рассказать...
    . Или найдите корректора. А то "ключевые параметры" сразу отбивают желание продолжать чтение.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[11]: О наследовании, иерархиях и проектировании (философс
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 19.04.07 22:31
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Что касается размещения моих авторских материалов на страницах Вашего сайта, то, слава богу, по закону РФ "Об авторском и смежных правах" я, как автор, сам имею право решать — размещать или не размещать. В принципе, мне Ваш сайт нравится, и я ничего не имею против, но сначала хочу посмотреть, насколько конструктивным будет обсуждение.


    Как сторонний наблюдатель скажу, что твоя позиция кажется не конструктивной.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 22:31
    Оценка:
    Здравствуйте, IT, Вы писали:

    Еще раз предлагаю, давайте закроем эту тему. Поверьте, эти препирательства не красят ни меня, ни Вас. Давайте удалим оффтопик, начиная с этого сообщения
    Автор: IT
    Дата: 19.04.07
    , и вернемся к конструктивному обсуждению.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 19.04.07 22:36
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Кстати, о птичках... Господа, прежде чем начинать письменно других учить чему-то, прочтите вот это:

    VD>Как не надо писать статьи
    Автор(ы): Михаил Купаев (Kupaev)
    Дата: 14.03.2005
    Поиск в Google по словам "как писать статьи" выдает 664 страницы. Статьи с таким названием писали столь уважаемые люди, как Г.А. Шенгели, А.А.Шалыто и др. Но в целом, 664 страницы — это, конечно, перебор. Понятно, что большая часть этого моря писанины сочинена людьми, писать статьи не умеющими. Если бы они умели писать статьи, они их писали бы, а не учили других. Признаюсь честно – я не знаю, как надо писать статьи. Зато за время своего редакторства я насмотрелся на такое количество уродцев, которого хватило бы на пару питерских Кунсткамер, и еще осталось бы на несколько курортных выставок. Поэтому я достаточно хорошо представляю себе, чего при этом делать не нужно. Вот об этом-то я и попытаюсь рассказать...
    . Или найдите корректора. А то "ключевые параметры" сразу отбивают желание продолжать чтение.


    А что не так в "ключевых параметрах"?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 03:57
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    ГВ>>Вот эта картинка на основе каких данных получена?


    КЛ>На основе анализа ряда примеров. Один из них приведен здесь. Но есть и другие.


    Сколько их было всего? И ещё: что у вас по оси ординат?

    ГВ>>Вот этот пример ключевых параметров. По сути, здесь в роли ключа сортировки выступает "время, прошедшее c момента X". Или имеется ввиду что-то другое?

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

    А что тогда является этим самым "ключевым параметром"?

    ГВ>>Ну, и терминология, как вечно больное место:

    КЛ>Давайте не будем впадать в "болезнь зловредного определительства". Например, у специалистов по системному анализу так и не появились признанное всеми определение понятия "система". Но это им не мешает пользоваться этим термином.

    Мда. Понятно.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 06:32
    Оценка:
    Здравствуйте, IT, Вы писали:

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


    ZS>>Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.

    ZS>>Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.

    IT>Увеличение размеров кода снижает сложность только, если этот код обобщается и переносится из бизнес логики в библиотеки и фреймворки. Т.е. общую сложность можно снизить только её перераспределением.


    + опускаясь ниже, более лаконичный код не всегда более понятный.

    А вообще, мой изначальный посыл был о том, что борьба с размером кода имхо борьба не с тем чем надо. Снижение сложности и уменьшение числа ошибок — вот настоящие проблемы. А то получается, что идеальная программа — workaround.
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: nixxxin  
    Дата: 20.04.07 06:50
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    ZS>Здравствуйте, Кирилл Лебедев, Вы писали:


    КЛ>>Здравствуйте, ZevS, Вы писали:


    ZS>>>На мой взгляд, тезис: чем меньше система, тем она идеальней, в случае ПО не так актуален. Больное место ПО, не "размеры", а качество выполнения основной и прочих функций.


    КЛ>>Не скажите. Чем больше программа, тем сложнее ее сопровождать. Согласитесь, что в "ветвистой" программе, как эта...


    ZS>Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.

    ZS>Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.

    Сложно
    if (одно){}else if (другое){}else if (третье){}и т.д.


    Просто
    if ( одно )
    {
    }
    else if ( другое )
    {
    }
    else if ( третье )
    {
    }
    и т.д.


    Так?
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 07:16
    Оценка:
    Здравствуйте, nixxxin, Вы писали:

    ...

    N>Так?


    Почти — здесь
    Автор: Pavel Dvorkin
    Дата: 12.04.07

    И как это работает? Кто рискнет порефакторить?
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 07:35
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    ZS>Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.

    ZS>Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.

    А что такое "сложность"?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 08:08
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

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


    ZS>>Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.

    ZS>>Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.

    ГВ>А что такое "сложность"?


    Есть довольно много вполне количественных метрик — здесь
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 08:09
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>>>На основе анализа ряда примеров. Один из них приведен здесь. Но есть и другие.


    ГВ>>Сколько их было всего? И ещё: что у вас по оси ординат?


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


    Отсюда
    Автор: Кирилл Лебедев
    Дата: 20.04.07

    ГВ>>И ещё: что у вас по оси ординат?
    КЛ>Сложность системы: количество модулей, классов и т.п.


    Хорошо, с этим ясно — всё таки, какие-то более или менее измеримые характеристики и выборка, судя по всему, репрезентативная.

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


    ГВ>>А что тогда является этим самым "ключевым параметром"?


    КЛ>Каждое из этих действий. Иными словами, нужно проектировать структуры данных под конкретные операции.


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

    ГВ>>Мда. Понятно.


    КЛ>Если Вам непонятен какой-нибудь термин, спросите, я постараюсь пояснить.


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

    КЛ>Про зловредное определительство написано здесь.

    КЛ>Яркий клинический случай описан здесь.

    Спасибо, любопытно. Но об этом позже.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 08:41
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    ZS>>>Ну конечно я слукавил, и всё взаимосвязано. Чем больше сложность системы (но все же не размер), тем больше вероятность ошибок.

    ZS>>>Однако, каждый может привести множество примеров, когда увеличение размеров кода снижает сложнось.

    ГВ>>А что такое "сложность"?


    ZS>Есть довольно много вполне количественных метрик — здесь


    Про метрики я знаю. А можно уточнить, в каком случае увеличение размера программы привело к снижению измеримой сложности? И как эту сложность меряли? Какая конкретно метрика использована?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[5]: ...продолжение
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 08:43
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    ГВ>>Сколько их было всего?


    КЛ>На текущий момент, несколько десятков.


    Тогда вам, вероятно, не составит труда дать агрегированные характеристики проектов. Например, такие:

    — средний размер (в строках, классах);
    — языки программирования (распределение);
    — продолжительность проектов;
    — численность и квалификация команд.

    И, соответственно, сводку по эволюции проектов:

    — Как изменились характеристики проектов после модификации (размеры до и после, сложности, соотношения в разрезе проектов и языков программирования);
    — Продолжительность циклов модификации;
    — Корреляция характеристик модификаций с усреднённым опытом команд.

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


    Хочу заметить, что таки да, "они все вокруг — плохиши". Я в курсе.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 09:15
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    ГВ>>Про метрики я знаю. А можно уточнить, в каком случае увеличение размера программы привело к снижению измеримой сложности? И как эту сложность меряли? Какая конкретно метрика использована?


    ZS>Из личного опыта. Надо было внести иименения в код, довольно небольшой (всего ~500 строк), но со сложной логикой. Кем и когда этот код был написал — не известно. Так вот, изменения удалось внести только после рефакторинга (а по сути написания заново), увеличившего размер кода чуть ли не в два раза. В данном конкретном случае сложность измерялась субъективным критерием наиболее близким к понятности.


    О! Молодец!

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

    ZS>Безусловно между размером кода и сложностью есть связь, но ставить знак равенства...


    Ну как тебе сказать, если метрики зачастую как раз и являются производными от объёма исходного кода... За исключением разных там усредняемых показателй, типа средней цикломатической сложности методов класса.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 20.04.07 10:48
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    IT>>Увеличение размеров кода снижает сложность только, если этот код обобщается и переносится из бизнес логики в библиотеки и фреймворки. Т.е. общую сложность можно снизить только её перераспределением.


    ZS>+ опускаясь ниже, более лаконичный код не всегда более понятный.


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


    В теории? возможно? это так, с теоретиками не буду спорить. Но на практике же оказывается, что в 99% связь между лаконичностью и простотой кода практически прямая. А в случае кода безнес логики это справедливо на 120%.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 20.04.07 11:09
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Яркий клинический случай описан здесь.


    Видимо здесь при подаче материала ты руководствовался именно этой статьёй.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: ZevS  
    Дата: 20.04.07 11:22
    Оценка:
    Здравствуйте, IT, Вы писали:

    ...

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


    В своем первом сообщении я как раз и сказал о том, что надо бороться за качество, а не размер. Уменьшение размера — побочный положительный эффект.
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 11:39
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

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


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

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

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


    И что тут смешного?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: prVovik Россия  
    Дата: 20.04.07 11:50
    Оценка:
    Здравствуйте, IT, Вы писали:


    IT>В теории? возможно? это так, с теоретиками не буду спорить. Но на практике же оказывается, что в 99% связь между лаконичностью и простотой кода практически прямая.


    Поковыряй какой-нибудь boost. Там код весьма лаконичен, но вот простой ли он?
    лэт ми спик фром май харт
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 12:05
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Кирилл Лебедев, Вы писали:



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


    V>Поздравляю, вы открыли для себя структурное программирование


    Не смешивайте два разных понятия: бизнес-функция и функция языка программирования. Я говорю о первой.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 12:27
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Здравствуйте, Кирилл Лебедев, Вы писали:



    КЛ>>Не смешивайте два разных понятия: бизнес-функция и функция языка программирования. Я говорю о первой.


    V>Ок, тогда не смешивайте понятия объектно-ориентированного программирования и Use-Case'ов, ибо первые отлично уживаются со вторыми


    А где Вы заметили смешивание?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[11]: О наследовании, иерархиях и проектировании (философс
    От: prVovik Россия  
    Дата: 20.04.07 12:31
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:


    КЛ>А где Вы заметили смешивание?


    Здесь:


    КЛ>Я же предлагаю ориентироваться не на объекты, а на действия. И проектировать структуры данных, модули под эти действия.


    Проектировать программу вполне можно (и нужно!) согласно Use-Case'ам, но ориентируясь при этом на объекты.
    лэт ми спик фром май харт
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 20.04.07 12:38
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Имхо, тут присутствует некорректное понимание сложности. Мое мнение таково, что сложность невозможно адекватно измерить простыми метриками. Сложность — это количество реализованных идей.


    Какое отношение количество идей имеет к сложности кода?
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: IT Россия linq2db.com
    Дата: 20.04.07 12:38
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    ZS>В своем первом сообщении я как раз и сказал о том, что надо бороться за качество, а не размер.


    Безусловно.

    ZS>Уменьшение размера — побочный положительный эффект.


    При этом получается, что компактный и понятный код практически всегда легко менять
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: IT Россия linq2db.com
    Дата: 20.04.07 12:43
    Оценка:
    Здравствуйте, ZevS, Вы писали:

    IT>>В теории? возможно? это так, с теоретиками не буду спорить. Но на практике же оказывается, что в 99% связь между лаконичностью и простотой кода практически прямая. А в случае кода безнес логики это справедливо на 120%.


    ZS>Короткие лаконичные программы на Perl просто ужасны.


    На перле не пишу. То с чем приходилось сталкиваться вызывало разные чувства. Хорошо отформатированный и откоментированный код не вызывал никаких затруднений при чтении. Квадратные программы (80 строк на 80 символов без единого пробела и пробельной строки) вызывали лёгкий озноб.
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[12]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 12:49
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Проектировать программу вполне можно (и нужно!) согласно Use-Case'ам, но ориентируясь при этом на объекты.


    В том-то и дело, что я как раз предлагаю обратное: ориентироваться не на объекты, а на действия и проектировать эти объекты под необходимые действия.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[14]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 13:12
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>То, о чем вы говорите как раз и называется структурная декомпозииция. Почитайте Гриди Буча, он в самом начале своей книги по ООП разбирал именно два эти подхода, и наглядно, на примере какой-то задачи по обработке файлов демонстрировал недостатки структурной декомпозиции над объектно-ориентированной.


    О качестве некоторых архитектурных решений Гради Буча можно прочитать в этой статье.

    А в этом примере продемонстрирован классический пример иерархии, которая разработана исключительно для рисования. Т.е. целая иерархия классов разработана исключительно ради одного действия. В этом есть смысл, т.к. иерархия избавляет нас в коде от оператора if.

    V>Если же говорится не о декомпозиции уже поставленной и четко сформулированной задачи, а о непосредственно формулировании задачи (то есть определении того, куда копаем), то опять "все украдено до нас". Почитайте про Use Case'ы, не забывая при этом что они совершенно не противоречат ООП.


    Да, use cases используются. Но о том, как use case переводить в структуры данных не сказано ни где.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:34
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    []

    КЛ>Вот пример реального обсуждения, где "не пронеслось".


    Вы не удосужилисть даже посмотреть внимательно эту тему
    ПЕРВЫЙ же ответ (кстати, мой) указывал на правильный с вашей точки зрения ответ
    http://rsdn.ru/Forum/Message.aspx?mid=2392333&amp;only=1
    Автор: FDSC
    Дата: 03.03.07


    Этот ответ — кстати, мой. Так что очень странно, что вы вообще лично МНЕ же теперь говорите о том, что это неочевидно. Может мне вас в плагиате обвинить?
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:44
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Угу, очень точное, понятное и развёрнутое описание задач


    КЛ>Для приведенного в презентации примера подходит. Там сказано, что это — одна из задач. У меня не было цели рассказывать обо всех задачах, с которыми сталкивается программист при проектировании AI.


    FDS>>Фактически это предложение по введению дополнительных абстрактых слоёв. Не помню, у кого-то в подписи стоит по этому поводу


    КЛ>Слои не только добавляются, но и схлопываются. Об этом сказано здесь.


    И? Я не понял, как они схлопываются с сокращением кода. Я не заметил, что бы там говорилось о том, как конкретно это выглядит в коде.



    FDS>>Где тут новая методика? Где тут вообще методика?


    КЛ>Например, здесь, здесь и здесь демонстрируются конкретные методы унификации различий и сокращения кода.


    КЛ>Я прочитал и просмотрел достаточное количество книжек по проектированию. И описаний этих методов там не заметил.


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



    FDS>>Всё уже давно всем известно на интуитивном уровне


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


    Разберите конкретную задачу и посмотрите, помогут ли в её решении ваши принципы.
    Re[4]: А объяснить минус?
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:48
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>Здравствуйте, Кирилл Лебедев, Вы писали:


    КЛ>>Кроме того, рекомендую прочесть еще вот это
    Автор: Кирилл Лебедев
    Дата: 16.02.07
    сообщение.


    FDS>>>Вообще не понимаю, зачем всё это писать на очевидных примерах и причём тут сокращение кода программы, когда он всё равно не сокращается. Скорее, рушится структура программы при "поглощении" классов.


    КЛ>>Если пример "очевиден", то:


    КЛ>>

      КЛ>>
    1. Почему участники обсуждения
      Автор: igna
      Дата: 03.03.07
      так и не пришли к "очевидному" решению, которое описано в презентации?

      Да потому что Я В ПЕРВОМ СООБЩЕНИИ СКАЗАЛ это решение. [b]В ПЕРВОМ СООБЩЕНИИ, потрудитесь его прочитать!!!!!!!!!!!!!!!!!!!! [/b]


      КЛ>>
    2. Почему Вы не уловили связь между задачей, изложенной в презентации, и обсуждением про квадрат и прямоугольник
      Автор: igna
      Дата: 03.03.07
      ? На мой взгляд, эта связь тоже очевидна.
      КЛ>>

    FDS>Потому что эта презентация полное говно. Вместо того, что бы рассказать, что вы предлагаете в общем, вы совершенно занудно рассказываете что вы делали конкретно. Это ужасно! Это невозможно читать! Да ещё и постоянно жать "далее..."
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 14:49
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>Если бы вы внимательно прочитали ту тему, ссылку на которую сами и привели, то увидели бы, что именно это я и говорю в обсуждении. Так что ваш аргумент абсолютно не верен, так как вы привели пример, где сказали, что кому-то что-то в голову не пришло, а в голову там всё, может быть и не всем, но пришло.


    Да, Ваша мысль, изложенная там, правильна. Но решения — в коде — Вы там так и не привели.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 14:51
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>Этот ответ — кстати, мой. Так что очень странно, что вы вообще лично МНЕ же теперь говорите о том, что это неочевидно. Может мне вас в плагиате обвинить?


    Ваша правильная, в принципе, мысль не вылилась в том обсуждении в конкретное решение. Больше запомнились ненужные нагромождения интерфейсов.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[6]: А объяснить минус?
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 14:57
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Будьте вежливы


    А по существу?

    FDS>Потому что эта презентация полное говно. Вместо того, что бы рассказать, что вы предлагаете в общем, вы совершенно занудно рассказываете что вы делали конкретно. Это ужасно! Это невозможно читать! Да ещё и постоянно жать "далее..."
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 14:59
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>Потому что эта презентация полное говно. Вместо того, что бы рассказать, что вы предлагаете в общем, вы совершенно занудно рассказываете что вы делали конкретно. Это ужасно! Это невозможно читать! Да ещё и постоянно жать "далее..."


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

    Не забывайте так же о том, что задача выступления — показать закономерность. И каждое изложенное решение — лишь этап в этой закономерности.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 15:03
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Потому что эта презентация полное говно. Вместо того, что бы рассказать, что вы предлагаете в общем, вы совершенно занудно рассказываете что вы делали конкретно. Это ужасно! Это невозможно читать! Да ещё и постоянно жать "далее..."


    КЛ>Не судите о других людях по себе. То, что Вам очевидно, другим людям вполне может быть неочевидно. Если бы Вы знали, сколько человек городят код такого вида. При чем это делают, опытные программисты, у которых десять и более лет опыт за плечами.


    КЛ>Не забывайте так же о том, что задача выступления — показать закономерность. И каждое изложенное решение — лишь этап в этой закономерности.


    Ну, в общем, вы правы. Просто тут презентация БЕЗ выступления
    Re[4]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 15:09
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>А что не так в "ключевых параметрах"?


    Смысл. Ключевые параметры — это параметры имеющие исключительно важные значения. А то о чем говоришь ты — это нечто используемое в качестве ключа сортировки.

    Вообщем, чем срашивать лучше прочти статью.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[5]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 15:20
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Смысл. Ключевые параметры — это параметры имеющие исключительно важные значения. А то о чем говоришь ты — это нечто используемое в качестве ключа сортировки.


    Нет, я использую термин в первом значении. Не во втором. Ключ сортировки тут в общем-то не при чем.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 16:35
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>А какое может быть решение в коде в абстрактной задаче?

    FDS>>Дайте мне конкретику, я вам сделаю её решение

    КЛ>Понимаете, конкретная задача — лишь один из способов получить решение. По сути дела, о чем нам говорит задача? О том, что конкретная архитектура (конкретный класс или иерархия) не удовлетворяет заданным требованиям и эту архитектуру надо бы переделать. Но для того, чтобы переделать (или спроектировать) архитектуру вовсе необязательно сталкиваться с реальной задачей. Если программист знает закономерность, изложенную в презентации, он знает, что рано или поздно вся иерархия фигур свернется в один класс. Поэтому, возможно, вообще не надо решать вопрос о том, как правильнее — выводить квадрат из прямоугольника или прямоугольник из квадрата.


    КЛ>Скорее всего, этот общий класс фигуры будет основан на понятии пути (последовательности сегментов прямых линий и кривых Безье 3-го порядка). Если же к изложенному еще добавить закон динамизации, который в презентации не изложен, то рано или поздно простое описание фигуры в виде пути перейдет в параметрическое. Т.е. у фигуры появятся какие-то параметры, изменяя которые, пользователь сможет изменять форму и размеры фигуры. Например, для окружности таким параметром станет радиус, для квадрата — сторона, для прямоугольника — высота и ширина. И т.д.


    КЛ>Заметьте, все эти выводы можно сделать, зная закономерность. И совсем не касаясь конкретных задач.


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

    Если разрабатываемое приложение не такое сложное, то необходимость наследования может возникнуть, мало того, должна возникнуть, если только это приложение с самого начала не идёт как "монстр". И здесь в качестве удобного способа программирования будет удобно объявить именно наследника квадрата или прямоугольника. Вовсе не заморачиваясь универсализацией классов.

    В вашем решении есть один большой минус — чем более универсальный класс, тем труднее его использовать, изучать, писать и отлаживать.
    Из него опять, для облегчения программирования, будут наследовать квадрат, прямоугольник и т.д. и вопрос встанет с новой силой.
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 16:39
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>И заметьте, что при этом простота использования и очевидность интерфейсов классов существенно упадёт. Так же, повысится сложность самого класса параметрической фигуры.


    FDS>Если разрабатываемое приложение не такое сложное, то необходимость наследования может возникнуть, мало того, должна возникнуть, если только это приложение с самого начала не идёт как "монстр". И здесь в качестве удобного способа программирования будет удобно объявить именно наследника квадрата или прямоугольника. Вовсе не заморачиваясь универсализацией классов.


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

    FDS>Из него опять, для облегчения программирования, будут наследовать квадрат, прямоугольник и т.д. и вопрос встанет с новой силой.


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

    См. например, и вот это
    Автор: ZevS
    Дата: 20.04.07
    сообщение.

    Там, где нужно и можно работать только с абстрактными данными, ваш способ, возможно, прокатит. Но он лишает программиста, в частности, возможности использования статического контроля типов и т.п. Т.е. всего, что ему предоставляет разбиение системы на несколько классов.
    Возможно, он совершенно не хочет и никогда не захочет писать класс параметрической фигуры, а вот наследовать квадрат от прямоугольника ему будет по каким-то причинам удобно и даже правильно.
    Re[6]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 16:45
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Нет, я использую термин в первом значении. Не во втором. Ключ сортировки тут в общем-то не при чем.


    Тогда поясни, плиз, что вообще означает загадочная фраза "Примеры ключевых параметров порядка"?
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 16:45
    Оценка:
    Здравствуйте, prVovik, Вы писали:

    V>Поковыряй какой-нибудь boost. Там код весьма лаконичен, но вот простой ли он?


    Это в Бусте то код локоничный?
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[13]: О наследовании, иерархиях и проектировании (философс
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 16:45
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>В том-то и дело, что я как раз предлагаю обратное: ориентироваться не на объекты, а на действия и проектировать эти объекты под необходимые действия.


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

    Вообще в твоих рассуждения есть четкая зацикленность на ООП. ООП не панацея. Это всего лишь способ декомпозиции и осмысления. Есть и другие способы. Разные задачи лучше решаются разными срдствами. Например, описание алгоритмов средствами ООП просто дурь.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 20.04.07 16:45
    Оценка:
    Здравствуйте, prVovik, Вы писали:

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


    V>Поздравляю, вы открыли для себя структурное программирование


    Ну, или почти открыл функциональное .
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 20.04.07 18:04
    Оценка:
    Здравствуйте, prVovik, Вы писали:

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


    ГВ>>Про метрики я знаю. А можно уточнить, в каком случае увеличение размера программы привело к снижению измеримой сложности? И как эту сложность меряли? Какая конкретно метрика использована?


    V>Имхо, тут присутствует некорректное понимание сложности.


    Почему? Это вполне измеримая характеристика. Вот "трудность понимания" — да, она не меряется, или меряется очень условно ввиду субъективной природы самого явления "понимание". Если эти два термина перепутать, можно получить забавные рассуждения.

    V>Мое мнение таково, что сложность невозможно адекватно измерить простыми метриками. Сложность — это количество реализованных идей.


    Мда. Идея полёта в космос — что может быть проще?

    С другой стороны:

    int a = 1;


    Аж три идеи в одной строчке!

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


    Такой код прост для восприятия, но и не более того. "Несложным" он от этого не становится.

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


    Не факт. Всё зависит от того, что именно подразумевать под "использованием". Здесь, как я понимаю, имеется ввиду "модификация".

    V>Но компактность со сложностью напрямую нисвязаны. То есть может быть компактный простой код, компактный сложный, раздутый простой код и раздутый сложный


    В повседневной речи и не такое встречается.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[7]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 18:38
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Тогда поясни, плиз, что вообще означает загадочная фраза "Примеры ключевых параметров порядка"?


    Это примеры к этому слайду. См. также это сообщение
    Автор: Кирилл Лебедев
    Дата: 20.04.07
    .
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[14]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 18:47
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Звучит неразумно. Действия — это функции. Крайне глупо без особой на то необходимости проектировать их как объекты. Объкты должны нести информацию, эмулировать суности реального или воображаемог мира, а не действия.


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

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

    VD>Вообще в твоих рассуждения есть четкая зацикленность на ООП. ООП не панацея.


    Вот уж тут Вы приписываете мне совсем не мои мысли . Из чего следует, что я зацикливаюсь на ООП? Наоборот, я считаю, что OOD — не лучшая методика проектирования.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[8]: О наследовании, иерархиях и проектировании (философск
    От: FDSC Россия consp11.github.io блог
    Дата: 20.04.07 18:50
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, VladD2, Вы писали:


    VD>>Тогда поясни, плиз, что вообще означает загадочная фраза "Примеры ключевых параметров порядка"?


    КЛ>Это примеры к этому слайду. См. также это сообщение
    Автор: Кирилл Лебедев
    Дата: 20.04.07
    .


    Тогда это не "ключевые параметры порядка", а упорядочивающие ключевые параметры
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 18:59
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>И заметьте, что при этом простота использования и очевидность интерфейсов классов существенно упадёт. Так же, повысится сложность самого класса параметрической фигуры.


    Совсем необязательно. В этом примере вряд ли класс CTargetSensor как-то стал сложнее классов CCarSensor, CPowerUpSensor и CMineSensor вместе взятых. Аналогично происходит и с фигурами. Обобщенный класс не становится сложным за счет нахождения оптимальной формы представления данных и методов.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.04.07 19:07
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>Тогда это не "ключевые параметры порядка", а упорядочивающие ключевые параметры


    Возможно, так будет лучше. Но термин "параметр порядка" предложен не мной, а отцом синергетики — Германом Хакеном. См. здесь.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: FDSC Россия consp11.github.io блог
    Дата: 21.04.07 08:53
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Тогда это не "ключевые параметры порядка", а упорядочивающие ключевые параметры


    КЛ>Возможно, так будет лучше. Но термин "параметр порядка" предложен не мной, а отцом синергетики — Германом Хакеном. См. здесь.


    Возможно, это просто неудачный перевод. Да и странно было бы думать, что все читали этого человека.
    Re: О наследовании, иерархиях и проектировании (философское)
    От: Eugene Kilachkoff Россия  
    Дата: 21.04.07 11:59
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Ответу на этот вопрос и посвящена презентация «Проектирование игровых и бизнес-программ. Разработка архитектуры, устойчивой к изменениям», которая была показана на Конференции разработчиков игр 2007. В презентации демонстрируется, что понятие «идеальная программа» существует и в программировании, и что это понятие можно успешно использовать для решения задач проектирования.


    Безотносительно к содержанию: приковыряйте туда кнопку "next" -- зачем заставлять пользователя искать в меню следующий пункт, тем более что текущий никак не выделяется.
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.04.07 14:47
    Оценка:
    Здравствуйте, Eugene Kilachkoff, Вы писали:

    EK>Безотносительно к содержанию: приковыряйте туда кнопку "next" -- зачем заставлять пользователя искать в меню следующий пункт, тем более что текущий никак не выделяется.


    Спасибо. Сейчас по этой ссылке презентация выложена в виде отдельного файла PPT.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[8]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 22.04.07 11:08
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Я не зря упомянул об усреднённых цифрах. Средняя величина не колеблется в пределах "от" и "до". Она — единственная и неповторимая.


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

    ГВ>А как же тогда обкатывать методику, если не собирать статистику в процессе обкатки?


    Я говорил о количественной статистике — она действительно не собиралась. Но ни что не мешает производить качественную оценку. А о ней я сказал. Методика позволяет:

    а) Сократить код.
    б) Существенно сократить количество багов (от 2 до 5).
    в) Существенно упростить сопровождение (архитектура не разъезжается).

    КЛ>>Во-первых, считаю, что рано.


    ГВ>То есть десятки (по вашим словам) проектов — это недостаточно для обкатки методики? Ну... в принципе, честь и хвала за такой подход. Но только я не понимаю — графики тогда откуда взялись?


    Опять-таки — я говорил о количественной оценке. Качественная оценка проводилась.
    По поводу графиков... Их легко построить, сравнив количество классов (модулей, функций) в том или ином решении.
    Приведенные в презентации графики ну никак не соотносятся с Вашими вопросами.

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


    Мягко говоря, ложное утверждение. Вы спрашиваете об одном, а графики — совсем о другом. Это называется подмена понятия.

    ГВ>"Правильно" — это как? По вашей методике? Или "вообще"?


    Да.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[12]: О наследовании, иерархиях и проектировании (философс
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 22.04.07 11:21
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>А в этом примере уменьшения кода и нет.


    Как же это нет? Даже первоклассник сможет сказать, что 1 класс — это меньше, чем 4 класса.

    FDS>Здесь есть введение дополнительного абстрактного слоя, о чём я и говорю.


    Давайте говорить предметно. Какой "абстрактный слой" появился благодаря сворачиванию 4-х "датчиков" в один?

    FDS>Любая проблема архитектуры решается введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества абстрактных слоёв, если не ошибаюсь, именно это написано у кого-то из участников форума в подписи. Так что тут ничего нового. Никакого уменьшения ОБЪЁМА кода нет, а раз так, значит по прежнему могут возникнуть очень и очень острые проблемы побочных эффектов, неправильного понимания механизмов работы алгоритмов или неучтённых, но нужных информационных связей.


    Как же это нет? Добавление промежуточного слоя как раз-таки уменьшает количество кода! Но только в пределах одного слоя. Просто "пухлый" код внутри одного слоя разносится по нескольким слоям.

    Но это и есть решение проблемы сложности! Каждый слой от этого становится легче сопровождать! Никто вообще не говорил о том, что уменьшение объема кода должно неминуемо приводить к уменьшение количество character'ов!

    FDS>Т.е. все проблемы остаются. Вы всего лишь пытаетесь научить общественность тому, что она уже умеет: пытаетесь сказать, что вот мол, ребята, давайте вводить более удобные интерфейсы. ДАВАЙТЕ, ДВУМЯ РУКАМИ ЗА!!!


    По-своему, правильно. Но только кроме призывов, у меня содержатся еще и конкретные методы, как этой задачи достичь.

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


    О том, что проектированию надо учить, никто не возражает. Но учить проектированию легче, когда есть конкретные методы. Если методов нет, то и учить сложнее.
    Кстати, почему это Вы называете мои конкретные советы абстрактными? Давайте говорить предметно. Какой из советов Вы считаете абстрактным? И что Вы в нем не понимаете?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[15]: О наследовании, иерархиях и проектировании (философс
    От: WolfHound  
    Дата: 22.04.07 12:58
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Из чего следует, что я зацикливаюсь на ООП? Наоборот, я считаю, что OOD — не лучшая методика проектирования.

    Те существует методика которыя всегда лучше чем ООД?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 22.04.07 13:24
    Оценка:
    Здравствуйте, minorlogic, Вы писали:

    M>P.S. Ваша манера вести диалог, мягко говоря не очень конструктивна (я по результатам ваших постов в этом форуме). Рекомендую проанализировать , и попробовать поменять на более конструктивную.


    Вот давайте и перейдем к конструктивной манере. Думаю, это будет возможно, когда Вы конкретизируете свои претензии. Например, "в слайде № таком-то мне непонятно то-то" или "рекомендация № такая-то мне кажется слишком абстрактной".
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: minorlogic Украина  
    Дата: 22.04.07 16:57
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Вот давайте и перейдем к конструктивной манере. Думаю, это будет возможно, когда Вы конкретизируете свои претензии. Например, "в слайде № таком-то мне непонятно то-то" или "рекомендация № такая-то мне кажется слишком абстрактной".


    У меня нет претензий к вам и к вашей статье. Я просто прочел презентацию и высказал мнение о ней, думал вас именно это интересовало.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[15]: О наследовании, иерархиях и проектировании (философс
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 22.04.07 21:07
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>О качестве некоторых архитектурных решений Гради Буча можно прочитать в этой статье.


    Ну тогда напомним и обсуждение этой статьи
    Автор: Кирилл Лебедев
    Дата: 14.03.06
    на RSDN.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[3]: О наследовании, иерархиях и проектировании (философск
    От: minorlogic Украина  
    Дата: 23.04.07 05:35
    Оценка:
    Кирилл, поясните пожалуйста.

    В первой части презентации показан пример , как надо делать или как не надо ?
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[4]: Конкретизация претензий
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.04.07 08:53
    Оценка:
    Здравствуйте, FDSC,

    Большое спасибо за проделанную работу! Возможно, ряд вопросов объясняются тем, что на html-страницах со слайдами показана статическая картинка. Сейчас по этой ссылке можно скачать презентацию целиком и посмотреть все в динамике.

    Далее отвечу на некоторые вопросы.

    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-18.asp#

    FDS>Очевидное предложение: группа классов объединяется в иерархию.

    Сравните это решение вот с этим. Неужели же непонятно, что в одном случаи "датчики" возвращают "машины", "power-up'ы" и "мины" (это отражено даже в названии функций), а в другом — "target'ы". Т.е. различные объекты приведены к единому типу.

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

    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-22.asp#

    FDS>С какой стати датчики возвращают разные объекты и где это написано на схеме?

    В названии функций — health, score и position. При этом, тип данных может быть один и тот же (например, float), но семантически это разные объекты.

    Но, согласен, в тексте это можно было подчеркнуть.

    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-24.asp#

    FDS>Далее, ввели конкретное решение для задачи, общие рекомендации не даны. Все эти "разные" объекты оказались по своей сути однородными и свелись к возвращению одного скаляра. А если один метод должен вернуть массив, а другой должен вернуть скаляр, третий матрицу 4х4? Какие у вас будут рекомендации, как их физически, в коде, объединить воедино? Это не сказано, вы можете, конечно, сейчас даже объяснить, как это делать, но ничего этого в презентации нет, т.е. свет абстрактный — "ребята, объединяйте объекты, вот видите, как у меня всё здорово". Я видел людей, которые на примере простых для исследования объектов показывают как у них всё замечательно, а как дело по сложнее, оказывается, что у них методика принципиально неправильная.

    О том, как решать такие задачи, сказано здесь, здесь и здесь.

    В соответствии с приведенными рекомендациями, нужно:

    1. Посмотреть только на различия (т.е. на разные объекты, которые возвращают методы).
    2. Задать вопрос: "А для чего мы используем полученные объекты? Что мы делаем с полученными объектами дальше?"
    3. Вот это-то дальше как раз и задаст критерии, которые важны, и позволит отбросить критерии, которые не важны.


    FDS>Например, альтернатива вашему подходу: функция вообще не должна возвращать объект или информацию. Она должна возвращать метод рассчёта поведения объекта.


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

    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-25.asp

    FDS>Сгруппировали в массив и что? А какая дальше цель? Как обрабатывать значения, которые получены от этих датчиков если мы должны различать сущность информации? Где об этом говорится? Сгруппировать любой дурак может, но ведь на датчики ещё нужно реагировать и эта реакция может требовать именно учёта сущности информации, а не просто суммирования с коэффициентами

    Об учете сущности информации говорится здесь, здесь и голосом .

    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-27.asp

    FDS>Дак что мы делаем? Те классы, которые были мы всё-таки не удаляем или удаляем? Свёртывать тут можно несколькими разными способами и ничего не сказано о том, как конкретно идёт свёртка здесь

    Было 2 иерархии. Осталось 2 класса. Что непонятного?


    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-28.asp#

    FDS>Опять же, что подразумевается под свёртыванием на уровне реализации и почему там такая-же UML-схема, как и на свёртке на уровне интерфесов?
    FDS>Тут нет никакого свёртывания на уровне реализации вообще. Нет и в принципе не может быть, это терминологическая ошибка

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


    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-34.asp# и предыдущие два

    FDS>Дак как же всё-таки разнородные веса объединяются в один???? КАК они обрабатываются. Как скорость и здоровье обрабатываются одной и той же функцией?

    Только не скорость, а количество набранных очков.

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

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

    1) Если здоровья маловато, AI должен отклоняться за power-up'ом здоровья.
    2) Если набранных очков маловато, AI должен отклоняться за power-up'ом, добавляющим очки.

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

    В алгоритме выбора направления движения учитываются потребности AI (в виде весов) и лежащие объекты на трассе. Но этому алгоритму совершенно не нужно иметь дело с реальными объектами — минами, машинами и power-up'ами. Ему достаточно представления этих объектов в виде набора объектов CTarget.

    FDS>http://www.triz-ri.ru/themes/kri_2007_lebedev-38.asp

    FDS>А что, мы раньше не формулировали???? Замечательная рекомендация! Это студентам первого курса такую давать надо

    Вы ради разнообразия зайдите как-нибудь на форум "Архитектура" и посмотрите, какие вопросы задают люди,приступающие к проектированию.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[5]: Конкретизация претензий
    От: FDSC Россия consp11.github.io блог
    Дата: 23.04.07 09:46
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-18.asp#

    FDS>>Очевидное предложение: группа классов объединяется в иерархию.

    КЛ>Сравните это решение вот с этим. Неужели же непонятно, что в одном случаи "датчики" возвращают "машины", "power-up'ы" и "мины" (это отражено даже в названии функций), а в другом — "target'ы". Т.е. различные объекты приведены к единому типу.


    КЛ>Т.е. важно не просто "тупое" объединение классов в иерархию, но и выбор такой "точки зрения", с которой различия между названными объектами не важны. Это-то и позволило создать обобщенный класс CTarget.


    Когда классы объединяются в иерархию всегда выбирается такая точка зрения, с которой различия приводятся к "похожестям", иначе что же это за иерархия?


    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-24.asp#

    FDS>>Далее, ввели конкретное решение для задачи, общие рекомендации не даны. Все эти "разные" объекты оказались по своей сути однородными и свелись к возвращению одного скаляра. А если один метод должен вернуть массив, а другой должен вернуть скаляр, третий матрицу 4х4? Какие у вас будут рекомендации, как их физически, в коде, объединить воедино? Это не сказано, вы можете, конечно, сейчас даже объяснить, как это делать, но ничего этого в презентации нет, т.е. свет абстрактный — "ребята, объединяйте объекты, вот видите, как у меня всё здорово". Я видел людей, которые на примере простых для исследования объектов показывают как у них всё замечательно, а как дело по сложнее, оказывается, что у них методика принципиально неправильная.

    КЛ>О том, как решать такие задачи, сказано здесь, здесь и здесь.


    КЛ>В соответствии с приведенными рекомендациями, нужно:


    КЛ>

      КЛ>
    1. Посмотреть только на различия (т.е. на разные объекты, которые возвращают методы).
      КЛ>
    2. Задать вопрос: "А для чего мы используем полученные объекты? Что мы делаем с полученными объектами дальше?"
      КЛ>
    3. Вот это-то дальше как раз и задаст критерии, которые важны, и позволит отбросить критерии, которые не важны.
      КЛ>

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


    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-25.asp

    FDS>>Сгруппировали в массив и что? А какая дальше цель? Как обрабатывать значения, которые получены от этих датчиков если мы должны различать сущность информации? Где об этом говорится? Сгруппировать любой дурак может, но ведь на датчики ещё нужно реагировать и эта реакция может требовать именно учёта сущности информации, а не просто суммирования с коэффициентами

    КЛ>Об учете сущности информации говорится здесь, здесь и голосом .


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

    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-27.asp

    FDS>>Дак что мы делаем? Те классы, которые были мы всё-таки не удаляем или удаляем? Свёртывать тут можно несколькими разными способами и ничего не сказано о том, как конкретно идёт свёртка здесь

    КЛ>Было 2 иерархии. Осталось 2 класса. Что непонятного?


    Вот именно. Здесь у вас осталось два класса, а вот тут http://www.triz-ri.ru/themes/kri_2007_lebedev-30.asp# у вас снова появилась иерархия, просто с дополнительным абстрактным слоем. Т.е. 27-ой слайд неправильно показывает сущность свёртки как внесения абстрактного слоя. Ничего мы в те два класса не выносим, мы только делаем этими двумя классами новый интерфейс.


    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-28.asp#

    FDS>>Опять же, что подразумевается под свёртыванием на уровне реализации и почему там такая-же UML-схема, как и на свёртке на уровне интерфесов?
    FDS>>Тут нет никакого свёртывания на уровне реализации вообще. Нет и в принципе не может быть, это терминологическая ошибка

    КЛ>Почему такая же? Сверху изображена иерархия классов. Снизу — один класс. К тому же, он имеет другое название. И не помечен, как абстрактный. А интерфейс у него и не должен был поменяться, т.к. изменения происходят на уровне реализации. Интерфейс-то остается тем же.


    Вот и возникает вопрос, как это согласуется с 30-ым слайдом. Реализацию-то вы оставили в тех классах, которые были, вы же её не впихнули в один класс. А если впихнули, то: 1. 30-ый слайд неправилен, 2. каким образом это приводит к уменьшению сложности непонятно, ведь этот класс должен включать все методы классов, которые он заменил, т.е. нужно расписать, что вы сделали с этими классами

    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-34.asp# и предыдущие два

    FDS>>Дак как же всё-таки разнородные веса объединяются в один???? КАК они обрабатываются. Как скорость и здоровье обрабатываются одной и той же функцией?

    КЛ>Только не скорость, а количество набранных очков.


    КЛ>Об этом я уже написал выше. Но здесь поясню. В частности, то, что было сказано голосом.


    КЛ>Нам количество набранных очков и здоровье были нужны не сами по себе, а для выполнения какой-то задачи. Применительно к AI-водителю, правила использования количества набранных очков и здоровья могут формулироваться так:


    КЛ>1) Если здоровья маловато, AI должен отклоняться за power-up'ом здоровья.

    КЛ>2) Если набранных очков маловато, AI должен отклоняться за power-up'ом, добавляющим очки.

    КЛ>Т.е. нужен был некий вес, говорящий о том, маловато нам этого (здоровья, набранных очков и т.п.) или достаточно. Этот вес, помимо величины, мог так же содержать тип характеристики, весом которой он является (здоровья, набранных очков). Этот тип можно задать флагом.


    КЛ>В алгоритме выбора направления движения учитываются потребности AI (в виде весов) и лежащие объекты на трассе. Но этому алгоритму совершенно не нужно иметь дело с реальными объектами — минами, машинами и power-up'ами. Ему достаточно представления этих объектов в виде набора объектов CTarget.


    Замечательно. Тут я получил один ответ.
    Но, как же всё-таки быть, когда мне нужно в алгоритме учесть разнородные параметры. Скажем, мне нужно обработать не только целевые факторы, но и возможность их достижения, которая описывается, скажем, массивом матриц 4х4? Что мне делать, если у меня появится ещё одна группа параметров, но это будет уже, скажем, массив матриц 3х3 или, скажем, массив массивов? Как мне объединить эти группы разнородных параметров в один?


    FDS>>http://www.triz-ri.ru/themes/kri_2007_lebedev-38.asp

    FDS>>А что, мы раньше не формулировали???? Замечательная рекомендация! Это студентам первого курса такую давать надо

    КЛ>Вы ради разнообразия зайдите как-нибудь на форум "Архитектура" и посмотрите, какие вопросы задают люди,приступающие к проектированию.


    Мммм. Ну, значит, такие вопросы там задают студенты первого курса .
    Тут тоже вопрос, для каких людей вы писали эту презентацию. Если для студентов, тогда ладно. Причём для довольно слабых студентов.
    Re[7]: Конкретизация претензий
    От: FDSC Россия consp11.github.io блог
    Дата: 23.04.07 13:17
    Оценка:
    Примеры ваши ещё не смотрел.

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

    Если вы действительно чего-то добились, дак и рассказывайте о том, чего вы добились. А то получается, может вы супер классный архитектор, но я не могу понять, КАК вы это делаете. Такие вещи показываются не на одном примере, а на многих примерах. Вы выбрали сразу неправильный подход к подаче материала.
    Пример, всё-таки, сам не такой уж и сложный.
    Короче говоря, вы не рассказали КАК надо делать то, что вы сделали, вы привели только 1 (один) несложный пример того, что вы сделали лично.


    Т.е. моя претензия остаётся в силе, вы не даёте той информации, которая действительно нужна. Вы её затушёвываете. Из-за этого и все обвинения в абстрактности. Нужно это давать сухо и строго. Или наоборот, на многих примерах, эмоционально и убедительно. Но не на одном
    Re[9]: О наследовании, иерархиях и проектировании (философск
    От: vdimas Россия  
    Дата: 23.04.07 20:28
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    V>>Поздравляю, вы открыли для себя структурное программирование


    VD>Ну, или почти открыл функциональное .


    Нет, функциональное тут не при чём. Функциональное программирование использует модель т.н. функциональных преобразователей "без пямяти", в то время как структурный подход не накладывает это ограничение.
    Re[10]: О наследовании, иерархиях и проектировании (философс
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 24.04.07 08:06
    Оценка:
    Здравствуйте, vdimas, Вы писали:

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


    Принцип декомпозиции один и тот же.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: О наследовании, иерархиях и проектировании (философс
    От: FDSC Россия consp11.github.io блог
    Дата: 24.04.07 15:19
    Оценка:
    Здравствуйте, vdimas, Вы писали:

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


    Структурное программирование — это разбиение задачи на части, которые удобны. Некторые задачи удобно разбивать на объекты, некоторые — на функции.
    В данном случае, всё-таки, если действия были первичны, то это всё-таки ближе к ФП
    Re[15]: ...продолжение
    От: FDSC Россия consp11.github.io блог
    Дата: 04.05.07 14:50
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Здравствуйте, FDSC, Вы писали:


    FDS>>Я бы на вашем месте так резко не реагировал даже на личную критику, в конечном итоге это вам нужно вычленить зерно истины из его критики, а не ему (если вам не нужно, то зачем вы вообще спорите?). Если честно, мне очень странно видеть вашу реакцию на критику, вы портите себе репутацию.


    КЛ>Со стороны Capertona была не критика, а грубость.


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


    В любом случае, тогда бы просто не отвечали на его сообщения. Тут одно из двух: или вы пытаетесь понять, что вам пытаются сказать (если в высказываниях есть смысл), но тогда вам надо избегать острых мест и всячески смягчить тон беседы, выяснить, что вам непонятно;
    или наоборот, если это грубость, в которой нет никакого смысла, то просто поставьте минус и не отвечайте на неё. Зачем зря ругаться?

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

    Вот это меня удивляет. Может быть, я не понимаю, и есть какие-то другие мотивы ответов... интересно было бы их услышать
    Re[15]: ...продолжение
    От: Gaperton http://gaperton.livejournal.com
    Дата: 04.05.07 14:50
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    FDS>>Я бы на вашем месте так резко не реагировал даже на личную критику, в конечном итоге это вам нужно вычленить зерно истины из его критики, а не ему (если вам не нужно, то зачем вы вообще спорите?). Если честно, мне очень странно видеть вашу реакцию на критику, вы портите себе репутацию.


    КЛ>Со стороны Capertona была не критика, а грубость.


    Тонкая душевная организация — хороший и удобный повод оставлять без ответа неудобные вопросы. Браво, коллега.

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

    ЗЫ: Слив засчитан.
    Re[13]: ...продолжение
    От: deniok Россия  
    Дата: 04.05.07 14:56
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Вот странный человек. Для того и создаются различные методологии, чтобы сократить количество ошибок в коде. И различные процедуры проверки качества типа code review. А Вы все заладили про постоянство ошибок. Поруководите хотя бы пол годика реальными программистами, и Вы сами уже будете знать, сколько ошибок и их серьезность допустит тот или иной программист.


    Вообще-то народу известно, что он руководил. И какими проектами.
    И его опыт многими весьма ценится. В том числе потому, что он им делится не в форме истины в последней инстанции.
    Re[16]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 16:05
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Тонкая душевная организация — хороший и удобный повод оставлять без ответа неудобные вопросы. Браво, коллега.


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

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


    Внимательно прочтите свои собственные сообщения, начиная с самого первого.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[14]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 16:10
    Оценка:
    Здравствуйте, deniok, Вы писали:

    D>Вообще-то народу известно, что он руководил. И какими проектами.

    D>И его опыт многими весьма ценится. В том числе потому, что он им делится не в форме истины в последней инстанции.

    Это не отменяет необходимости корректно общаться (без наездов). Его отзыв был крайне груб. Я так считаю: если не понимаешь что-то, спроси. Или, по крайней мере, скажи, что не понимаешь. Самоутверждаться за счет других — не лучшая тактика общения.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[14]: ...продолжение
    От: minorlogic Украина  
    Дата: 04.05.07 18:49
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Я-то как раз знаю, сколько ошибок допускают программисты. Скажу по секрету — по метрикам компании CQG, где я работал пару лет назад, плотность ошибок колеблется в среднем в коридоре 20-40 штук на 1000 строк кода. Язык С++.


    Собственно у меня вопрос , вот беру я свой модуль 400 строк кода , и задумываюсь , а как он вааще может работать если там от 8 до 16 ошибок ? Т.е. мне даже представить тяжело программу с таким к-вом багов
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[16]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.05.07 19:40
    Оценка:
    Здравствуйте, minorlogic, Вы писали:

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


    Вот конкретное сообщение
    Автор: Кирилл Лебедев
    Дата: 04.05.07
    из тех, что я пишу людям, которые общаются корректно. Где Вы здесь видите "высокомерие" и "хамство"?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[16]: [от модератора]
    От: IT Россия linq2db.com
    Дата: 04.05.07 22:54
    Оценка:
    Здравствуйте, Gaperton, Вы писали:
    G>Здравствуйте, Кирилл Лебедев, Вы писали:

    Предлагаю обоим сбавить обороты и либо перейти к конструктиву, либо закругляться с дискуссией.
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[15]: ...продолжение
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.05.07 22:59
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Со стороны Capertona была не критика, а грубость.


    Согласен. Но с твоей тоже. Первое его сообщение было ктитикой, а ты начал переводить ее в личностные разборки.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: ...продолжение
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.05.07 22:59
    Оценка:
    Здравствуйте, Gaperton, Вы писали:

    G>Тонкая душевная организация — хороший и удобный повод оставлять без ответа неудобные вопросы. Браво, коллега.


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


    G>ЗЫ: Слив засчитан.


    На самом деле ты тоже хорош. Первое высказывание было по теме. Дальше ты уже подкалывал оппонента. Я конечно понимаю, что это фирменный стиль. Но такой интеллектуальный троллинг ни к чему хорошему не приводит.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: ...продолжение
    От: minorlogic Украина  
    Дата: 05.05.07 05:27
    Оценка:
    Здравствуйте, fmiracle, Вы писали:

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


    Если так — тогда больше на правду похоже , только как тогда измерения проводились ? Врядли человек отдаст комунить неотлаженный и непроверенный код ?
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[14]: ...продолжение
    От: Lazy Cjow Rhrr Россия lj://_lcr_
    Дата: 05.05.07 11:06
    Оценка:
    Gaperton,

    КЛ>>Я не предполагал, что для кого-то банальная истина может быть непонятна. С учетом того, что здесь уже кажется обсуждали, что текст — не единственно возможное представление кода. Поищите, думаю, обсуждение было где-то в марте-апреле.


    G>Охренеть. Вот ведь наука дошла. Ссылочку не дадите — я что-то не нашел .


    Да зачем тебе ссылки-то? Опций — всего ничего: текстовое, графическое и бинарное Подозреваю, что оппонент намекает на графическое представление.
    quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
    Re[14]: Собственный минус
    От: Lazy Cjow Rhrr Россия lj://_lcr_
    Дата: 05.05.07 11:08
    Оценка:
    Gaperton,

    -1
    В знак искренней симпатии
    quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
    Re[15]: ...продолжение
    От: WolfHound  
    Дата: 05.05.07 12:57
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Какой из них лучше?

    КЛ>Не смотря на то, что оба примера плохи, второй пример лучше. Почему? Давайте посчитаем количество классов и интерфейсов, приходящихся на одну сущность.

    КЛ>В первом примере объявлено 9 классов (интерфейс IFigure хоть и объявлен, но не используется — его не считаем). Эти классы используются для представления 3-х сущностей: прямоугольника, ромба и квадрата. Итого: 3 класса на сущность.


    Те много интефейсов всегда хуже чем мало? Я правильно понял?

    Например у меня есть подсистема в которой на 5 сущьностей приходится 10 интерфейсов. Это плохо? Мне надо срочно все рефакторить?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[17]: ...продолжение
    От: FDSC Россия consp11.github.io блог
    Дата: 06.05.07 13:10
    Оценка:
    Здравствуйте, minorlogic, Вы писали:

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


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


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


    Я, например, когда программирую, обычно фиксирую все ошибки письменно. Исключение составляют приложения, которые нужно сделать "к утру, а лучше раньше"
    Re[12]: ...продолжение
    От: FDSC Россия consp11.github.io блог
    Дата: 06.05.07 13:19
    Оценка:
    Здравствуйте, fmiracle, Вы писали:

    F>Пример прямо сегодня был — переписал код программиста (причем не стажера!) — экран кода (строк 20-30), находящегося в глубоко нерабочем состоянии заменил на 3 (три!) строки кода, которые сразу заработали верно (ну, сложно ошибиться в 3 строчках, правда?).


    А за счёт чего происходит такое сокращение количества строк?
    Re[13]: ...продолжение
    От: IT Россия linq2db.com
    Дата: 06.05.07 14:51
    Оценка:
    Здравствуйте, FDSC, Вы писали:

    FDS>А за счёт чего происходит такое сокращение количества строк?


    Например, вот такое:

    if (a == true)
    {
        return true;
    }
    else
    {
        return false;
    }

    можно сократить в 8 раз:

    return a;
    ... << RSDN@Home 1.2.0 alpha rev. 0>>
    Если нам не помогут, то мы тоже никого не пощадим.
    Re[14]: ...продолжение
    От: FDSC Россия consp11.github.io блог
    Дата: 06.05.07 19:11
    Оценка:
    Здравствуйте, IT, Вы писали:

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


    FDS>>А за счёт чего происходит такое сокращение количества строк?


    IT>Например, вот такое:


    IT>
    IT>if (a == true)
    IT>{
    IT>    return true;
    IT>}
    IT>else
    IT>{
    IT>    return false;
    IT>}
    IT>

    IT>можно сократить в 8 раз:

    IT>
    IT>return a;
    IT>


    Ээээ. Я думаю, это бывает далеко не всегда
    Re[17]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 14.05.07 08:44
    Оценка:
    Здравствуйте, minorlogic, Вы писали:
    M>Если так — тогда больше на правду похоже , только как тогда измерения проводились ? Врядли человек отдаст комунить неотлаженный и непроверенный код ?
    Не знаю, как обстоят дела в вашей компании, а у нас есть специальные люди, которым отдают неотлаженный и непроверенный код. Они называются QA, и их задача — проверить код и помочь в его отладке. В идеальной команде программист, конечно же, никогда не закоммитит непротестированный код в VCS. Но в реальной жизни а) программист не всегда идеален и б) у него банально может не хватить ресурсов для проверки всех граничных случаев. К примеру, есть кусок кода, который он коммитит. Его работоспособность по какой-то причине является платформенно-зависимой. Мы что, заставим его поднять локально 24 VM со всеми таргет-платформами и прогнать тестовые сценарии? Нет, он проверяет код на своей локальной платформе и выполняет коммит. Этот код будет проверен QA отделом в рамках значительно более длинных test sequences, и если он таки падает на какой-то другой платформе, то девелоперу вернется баг. Конечно, при починке девелопер будет проверять фикс как раз на той платформе, на которой баг был найден. Но опять же полный цикл тестирования проводить он не станет.

    В итоге, мы имеем в багзилле массу информации о том, как качество кода эволюционирует в процессе разработки. Грамотные пацаны выполняют на этой статистике всякие исследования.
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[18]: ...продолжение
    От: minorlogic Украина  
    Дата: 14.05.07 19:17
    Оценка:
    Если у вас к-во багов близко к заявленному , и отдается сырым тестерам , я не понимаю как у вас хоть что то работает ....
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[20]: ...продолжение
    От: minorlogic Украина  
    Дата: 15.05.07 08:33
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

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


    M>>Если у вас к-во багов близко к заявленному , и отдается сырым тестерам , я не понимаю как у вас хоть что то работает ....

    S>В каком смысле? Что такое "сырой тестер"? Почему непонятно, как хоть что-то работает?

    Сырой код а не тестер, сырой это не готовый не отлаженный , тестер это тот который тестирует еще их называют QA.

    Непонятно , потомцу что и при меньшем к-ве багов приложения которые я встерчал банально нетработали , или работали ошибочно.
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[21]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 15.05.07 08:50
    Оценка:
    Здравствуйте, minorlogic, Вы писали:
    M>Непонятно , потомцу что и при меньшем к-ве багов приложения которые я встерчал банально нетработали , или работали ошибочно.
    Гм. Ну и у нас оно сначала работает ошибочно. QA для того и нужен, чтобы оно работало безошибочно.
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[16]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.05.07 09:55
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Те много интефейсов всегда хуже чем мало? Я правильно понял?


    Вопрос абстрактный. Точно так же можно спросить: "1000 строк кода — это плохо или хорошо?". Нужно еще учитывать и контекст. Например, в случае объектной модели полезно оценить количество интерфейсов и классов, приходящихся на одну сущность. Чем их больше, тем хуже.

    WH>Например у меня есть подсистема в которой на 5 сущьностей приходится 10 интерфейсов. Это плохо?


    А сколько еще на эти 5 сущностей приходится классов? Вот и оцените.

    WH>Мне надо срочно все рефакторить?


    Рефакторить, считаю, не надо до тех пор, пока не столкнетесь со сложностью сопровождения.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[17]: ...продолжение
    От: WolfHound  
    Дата: 23.05.07 11:10
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Например, в случае объектной модели полезно оценить количество интерфейсов и классов, приходящихся на одну сущность. Чем их больше, тем хуже.

    Ты в этом так уверен?

    КЛ>А сколько еще на эти 5 сущностей приходится классов? Вот и оцените.

    5 классов + 2 аттрибута + 1 фабрика из одного однострочного метода. Это одна из реализаций этих сущьностей.
    Другая может содержать другое колличество классов.

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

    КЛ>Рефакторить, считаю, не надо до тех пор, пока не столкнетесь со сложностью сопровождения.

    Так столько классов и интерфейсов и было сделано для того чтобы можно было легко работать, сопровождать и расширять.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[18]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.05.07 13:34
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>Например, в случае объектной модели полезно оценить количество интерфейсов и классов, приходящихся на одну сущность. Чем их больше, тем хуже.

    WH>Ты в этом так уверен?
    Пока меня не разубедили — да.

    КЛ>>А сколько еще на эти 5 сущностей приходится классов? Вот и оцените.

    WH>5 классов + 2 аттрибута + 1 фабрика из одного однострочного метода. Это одна из реализаций этих сущьностей.
    WH>Другая может содержать другое колличество классов.
    Итого — 15 "классов" (10 интерфейсов + 5 классов) на 5 сущностей? Получается — по 3 "класса" на сущность.

    WH>Вся работа осуществляется только через интерфейсы. Таким образом мы можем работать с множеством реализаций одновременно.

    Ну и с классом (без всякого дополнительного интерфейса) программист тоже работает через интерфейс класса.

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

    WH>Те я просто беру коллекцию, отфильтровываю элементы по интерфейсу и вперед.
    Боюсь, ничего не могу сказать, т.к. мне непонятна суть задачи и ее решения. Все описано слишком абстрактно. Лучше рассмотреть конкретный пример. Тогда, думаю, станет все ясно.

    КЛ>>Рефакторить, считаю, не надо до тех пор, пока не столкнетесь со сложностью сопровождения.

    WH>Так столько классов и интерфейсов и было сделано для того чтобы можно было легко работать, сопровождать и расширять.
    Опять-таки, думаю, что конкретный пример прояснит ситуацию.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[20]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.05.07 15:34
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>Пока меня не разубедили — да.

    WH>Это догма. Догмы до добра не доводят.
    Разве ж это догма? Догма — это когда невозможно переубедить. А меня переубедить можно. Правда, на конкретном примере.

    WH>Как ты будешь работать с разными реализациями (читай классами) в статически типизированном языке? Если не через интерфейсы?

    Само собой, через интерфейсы, абстрактные классы или темплейты. Но ведь это и не говорит о том, что для каждой сущности нужно создавать по 2 — 3 интерфейса.

    WH>И того 5 сущьностей: собственное свойство, собственное событие, присоедененное свойство, присоедененное событие и тип.

    Допустим, с сущностями все более-менее понятно. А каковы интерфейсы? Вы писали, что их у Вас 10.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[22]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.05.07 19:23
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Первые 5 интерфейсов нужны для фильтрации и чтобы свойства не копипастить. Остальные собственно интерфейсы конкретных сущьностей.

    Спасибо! Теперь мне все более-менее понятно.

    Мой ответ: Да, именно такой дизайн я не считаю удачным. Он, безусловно, имеет право на существование, как и всякая модель, но, к сожалению, приводит к серьезным проблемам при сопровождении.

    Вопрос: На какой стадии работы программы используются приведенные интерфейсы?

    1. На стадии загрузки или сохранения метаданных?
    2. На стадии конструирования объектов ГУИ (диалогов, контролов и т.д.)?
    3. На стадии работы объектов ГУИ (во время показа диалога и т.п.)?
    4. Другое?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[23]: ...продолжение
    От: WolfHound  
    Дата: 23.05.07 19:50
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Мой ответ: Да, именно такой дизайн я не считаю удачным. Он, безусловно, имеет право на существование, как и всякая модель, но, к сожалению, приводит к серьезным проблемам при сопровождении.

    Интересно к каким?

    КЛ>На стадии загрузки или сохранения метаданных?

    Эти интерфейсы являются моделью метаданных.

    КЛ>На стадии конструирования объектов ГУИ (диалогов, контролов и т.д.)?

    Если ты про востановление формы из сериализованного представления то да.
    Ибо без метаданных невозможно прочитать то что сохранено.

    КЛ>На стадии работы объектов ГУИ (во время показа диалога и т.п.)?

    Нет. Ибо тут уже работают связанные в кучу объекты WinForms.

    КЛ>Другое?

    Во время редактирования формы в дизанере форм.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[24]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 24.05.07 08:04
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>Мой ответ: Да, именно такой дизайн я не считаю удачным. Он, безусловно, имеет право на существование, как и всякая модель, но, к сожалению, приводит к серьезным проблемам при сопровождении.

    WH>Интересно к каким?

    Основных проблем две:

    1. Изменение, добавление или удаление отдельного атрибута приводит к реорганизации иерархии.
    2. Злоупотребление оператором преобразования типов (dynamic_cast в C++ или as в C#) и, как результат, нарушение LSP.

    Более детально обо всех этих проблемах написано в одной из моих статей.

    При использовании интерфейсов возникает еще и третья проблема — изменение прототипа одного из методов интерфейса или добавление метода в интерфейс неминуемо приводит к необходимости изменения во всех реализациях. Это, конечно, характерно для любого интерфейса (например, Win32 API или OpenGL). Но проблема проявляется довольно часто, когда интерфейс строится путем "фильтрации" — когда общие для всех классов свойства выносятся в базовые классы (интерфейсы). Т.е. когда анализируются атрибуты и сходные атрибуты группируются в базовые классы (или интерфейсы).

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

    WH>Эти интерфейсы являются моделью метаданных.

    Это-то мне понятно. Но я спрашивал немного о другом. На всякий случай, переформулирую вопросы:

    1. Какие обязанности существуют у этой иерархии (целиком)?
    2. Какие обязанности существуют у отдельного интерфейса или класса иерархии? У IElementBase, IPropertyBase, IElement, IAttachedElement, IProperty, IAttachedProperty и т.д.?

    Из Вашиз ответов я понял, что обязанности таковы:

    1. Восстановление формы из сериализованного представления.
    2. Сериализация формы.
    3. Редактирование формы (?).
    4. Иное?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[26]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 24.05.07 09:57
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Кирилл, в том что вы говорите про решения Гради Буча и сейчас пытаетесь сказать про решения WolfHound-а просматривается одна и та же красная нить: мол отгребете вы, ребята, по полной, когда будете вынуждены свои иерархии расширять для поддержки новых требований.

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

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

    Расширяемость и повторное использование являются одними из критериев качества программы (привожу ссылку на классика ). Думаю, это не стоит сбрасывать со счетов.

    E>Были в задаче Гради Буча именно такие датчики, он их объеденил в иерархию так, чтобы было не сложно и чтобы работало. Макаронный эфект там наблюдается, на вскидку, только в DisplayManager::display и все. Отказ от этого макаронного кода привел бы, скажем, к реализации Visitor-ов и усложнения датчиков. Т.е. решение Буча подчиняется простой идее: вовремя сделать минимально необходимый и минимально сложный код для решения конкретной задачи. Все остальные проблемы должны решаться по мере их поступления.

    Если "плясать" от предложенной ОО-модели, то, действительно, ничего, кроме dynamic_cast'ов или Visitor'ов не остается. Но эти проблемы — прямое следствие предложенной модели. Если модель переделать, то код не усложниться, а dynamic_cast'ы и Visitor'ы не понадобятся.

    Решение существует и для задачи с датчиками, и для задачи с кнопками и итемами. Если WolfHound'у будет интересно, это новое решение можно будет обсудить.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[25]: ...продолжение
    От: WolfHound  
    Дата: 24.05.07 10:48
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Изменение, добавление или удаление отдельного атрибута приводит к реорганизации иерархии.

    Это ты к чему?

    КЛ>Злоупотребление оператором преобразования типов (dynamic_cast в C++ или as в C#) и, как результат, нарушение LSP.

    Это догма.
    Вот скажи мне зачем нужно заводить 9 коллекций когда можно обойтись одной с фильтрацией?

    Вот пример
    Автор(ы): Чистяков Влад (VladD2)
    Дата: 03.03.2007
    Язык программирования Nemerle заинтересовал многих в первую очередь своей мощнейшей подсистемой мак-росов. Однако и без них Nemerle предоставляет ряд су-щественных улучшений по сравнению с традиционными, императивными языками программирования (такими как Java, C# и C++).
    Nemerle, кроме традиционного императивного програм-мирования, поддерживает функциональное программи-рование. Это выражается в наличии конструкций, упро-щающих манипуляцию функциями, построение и анализ сложных структур данных и т.п.
    К сожалению, если вы не использовали возможности, присущие функциональным языкам ранее, то вам будет трудно оценить, насколько Nemerle может оказаться вам полезным в реальной повседневной работе. Данная статья призвана в неформальной форме продемонс-трировать это.
    того к чему приводят догмы. В этой статье написан клькулятор на C# по всем канонам ООП. И тоже самое на nemerle.
    Я думаю не вызывает сомнений какой вариант предпочтительней.

    КЛ>При использовании интерфейсов возникает еще и третья проблема — изменение прототипа одного из методов интерфейса или добавление метода в интерфейс неминуемо приводит к необходимости изменения во всех реализациях. Это, конечно, характерно для любого интерфейса (например, Win32 API или OpenGL). Но проблема проявляется довольно часто, когда интерфейс строится путем "фильтрации" — когда общие для всех классов свойства выносятся в базовые классы (интерфейсы). Т.е. когда анализируются атрибуты и сходные атрибуты группируются в базовые классы (или интерфейсы).

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

    КЛ>Какие обязанности существуют у этой иерархии (целиком)?

    Я уже сказал. Это модель метаданных.
    Метаданные нужны для того чтобы работать с данными.

    КЛ>Какие обязанности существуют у отдельного интерфейса или класса иерархии? У IElementBase, IPropertyBase, IElement, IAttachedElement, IProperty, IAttachedProperty и т.д.?

    Описание части модели.

    КЛ>Из Вашиз ответов я понял, что обязанности таковы:

    Зачем она нужна я уже написал в этом
    Автор: WolfHound
    Дата: 23.05.07
    сообщении.
    Можешь предложить свой вариант. А я раскажу о его реальных проблемах, а не выдуманных на основе догм.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[26]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 24.05.07 11:01
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Можешь предложить свой вариант.

    Хорошо. Вы можете расписать Ваши интерфейсы целиком (с объявлениями методов)? Мне это нужно, чтобы не заниматься догадками.

    WH>А я раскажу о его реальных проблемах, а не выдуманных на основе догм.

    Расскажите. Будет интересно. Кстати, описываемые мной проблемы тоже увы реальны. И, конечно же, они не выдуманы на основе догм.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[27]: ...продолжение
    От: WolfHound  
    Дата: 24.05.07 11:07
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Можешь предложить свой вариант.

    КЛ>Хорошо. Вы можете расписать Ваши интерфейсы целиком (с объявлениями методов)? Мне это нужно, чтобы не заниматься догадками.
    А зачем собственно? Я дал постановку задачи.
    Зачем тебе мое кривое решение для того чтобы спроектировать прямое?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[26]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 11:08
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Здравствуйте, Кирилл Лебедев, Вы писали:


    КЛ>>Злоупотребление оператором преобразования типов (dynamic_cast в C++ или as в C#) и, как результат, нарушение LSP.

    WH>Это догма.
    WH>Вот скажи мне зачем нужно заводить 9 коллекций когда можно обойтись одной с фильтрацией?
    WH>Вот пример
    Автор(ы): Чистяков Влад (VladD2)
    Дата: 03.03.2007
    Язык программирования Nemerle заинтересовал многих в первую очередь своей мощнейшей подсистемой мак-росов. Однако и без них Nemerle предоставляет ряд су-щественных улучшений по сравнению с традиционными, императивными языками программирования (такими как Java, C# и C++).
    Nemerle, кроме традиционного императивного програм-мирования, поддерживает функциональное программи-рование. Это выражается в наличии конструкций, упро-щающих манипуляцию функциями, построение и анализ сложных структур данных и т.п.
    К сожалению, если вы не использовали возможности, присущие функциональным языкам ранее, то вам будет трудно оценить, насколько Nemerle может оказаться вам полезным в реальной повседневной работе. Данная статья призвана в неформальной форме продемонс-трировать это.
    того к чему приводят догмы. В этой статье написан клькулятор на C# по всем канонам ООП. И тоже самое на nemerle.

    WH>Я думаю не вызывает сомнений какой вариант предпочтительней.

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


    Еще по теме хорошая статейка, где на scala рассматриваются два варианта реализации вычислителя в стороготипизированном языке и анализ проблем (а так же их преодоление )

    Ставится задача:

    • Extensibility in both dimensions: It should be possible
    to add new data variants and adapt existing opera-
    tions accordingly. Furthermore, it should be possible
    to introduce new processors.
    • Strong static type safety: It should be impossible to
    apply a processor to a data variant which it cannot
    handle.
    • No modification or duplication: Existing code should
    neither be modified nor duplicated.
    • Separate compilation: Compiling datatype exten-
    sions or adding new processors should not encom-
    pass re-type-checking the original datatype or exist-
    ing processors.

    • Independent extensibility: It should be possible
    to combine independently developed extensions so
    that they can be used jointly [21].


    И решается Object-Oriented Decomposition и Functional Decomposition с примерами расширения в двух направлениях: по данным и по операциям. Там же к стати приведены ссылки и краткое описание частичных способов решения.

    Т.е. суть поста в том, что проблема не в ООП как таковом, а в существующих реализациях. При реализации на "правильном" языке все эти проблемы "иерархий" решаются более эффективно и расширяемо. И мне лично данная статья оказалась в N раз полезнее, чем обсуждаемая в топике.
    Re[28]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 24.05.07 11:48
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>А зачем собственно? Я дал постановку задачи.

    К сожалению, из Вашего описания
    Автор: WolfHound
    Дата: 23.05.07
    непонятно, что нужно сделать. Вы описали лишь частную проблему с кнопкой и что есть некая объектная модель. Однако для чего — для решения какой задачи — эта модель создается, Вы умолчали.

    Есть предположение, что Вы создаете редактор форм и систему, которая автоматически создает их по метаописанию. Но зачем гадать, когда можно узнать назначение системы у Вас?

    WH>Зачем тебе мое кривое решение для того чтобы спроектировать прямое?


    Для того, чтобы понять, какие действия выполняют приведенные интерфейсы (и классы) и за что, конкретно, они отвечают.

    Если не хотите приводить описание интерфейсов, то, пожалуйста, ответьте на вопрос: Назовите главную полезную функцию проектируемой системы?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[29]: ...продолжение
    От: WolfHound  
    Дата: 24.05.07 12:23
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Для того, чтобы понять, какие действия выполняют приведенные интерфейсы (и классы) и за что, конкретно, они отвечают.

    Из модели метаданных ты это не поймешь.
    Ибо модель очень абстрактна и вобще ничего не знает о кнопках и тп.

    КЛ>Если не хотите приводить описание интерфейсов, то, пожалуйста, ответьте на вопрос: Назовите главную полезную функцию проектируемой системы?

    1)Нужно иметь возможность отображать формы где попало (win, web...)
    2)Нужно иметь возможность сохранать формы где попало. XML, RDB...
    3)Нужен редактор форм.
    4)Различные лейауты необходимы и точка. Те нужен и AbsolutePosition и Grid и много чего еще.

    Нужно спроектировать модель метаданных, и для примера кнопку и грид.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[27]: ...продолжение
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 24.05.07 14:45
    Оценка:
    Здравствуйте, aka50, Вы писали:

    A>Еще по теме хорошая статейка, где на scala рассматриваются два варианта реализации вычислителя в стороготипизированном языке и анализ проблем (а так же их преодоление )


    Нашлась бы добрая душа, да на пальцах бы объяснила, в чем смысл рассматриваемой в этом tech report-е проблемы. И чтобы примеры были более жизненные, а не Plus, PlusNeg и DblPlusNeg.

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


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[28]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 15:01
    Оценка:
    Здравствуйте, eao197, Вы писали:

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


    A>>Еще по теме хорошая статейка, где на scala рассматриваются два варианта реализации вычислителя в стороготипизированном языке и анализ проблем (а так же их преодоление )


    E>Нашлась бы добрая душа, да на пальцах бы объяснила, в чем смысл рассматриваемой в этом tech report-е проблемы. И чтобы примеры были более жизненные, а не Plus, PlusNeg и DblPlusNeg.


    E>А то все закручено, заморочено и сложно понять, нужно это вообще или нет?

    Ну да... замороченно там... немного , могу посоветовать еще вот это статейку, после нее должно быть понятнее http://lamp.epfl.ch/~odersky/papers/ScalableComponent.pdf

    А вообще на всей этой технологии self/this/super у них компилятор спроектрирован. Так что "реальный" пример можно прям в исходниках самого компилятора посмотреть.
    Re[29]: ...продолжение
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 24.05.07 16:45
    Оценка:
    Здравствуйте, aka50, Вы писали:

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


    Ну об этом-то там прямо во вступлении говорится. Мне бы понять, где вся эта байда на практике применяться может.

    От создания компиляторов я далек. Вот на примере GUI-ев каких-нибудь или сетевого взаимодействия примеры бы какие-нибудь посмотреть бы...


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[30]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 18:18
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>От создания компиляторов я далек. Вот на примере GUI-ев каких-нибудь или сетевого взаимодействия примеры бы какие-нибудь посмотреть бы...

    Ну непосредственно к сетевому коду или гуям в общем-то это слабо прикручивается, там рулит паттерн-матчинг и прочие implicit фишки (если конкретно скала рассматривать), а вот в деле фреймворко-компоненто-строения — вполне себе замечательная технология (хотя и не лишенная недостатков, например в том же компиляторе за счет всех эти self и type образуется довольно сильная связанность и например выцепить отдельно SyntaxAnalyzer без всей остальной ботвы довольно сложно)

    Если попытаться порассуждать на каком-то конкретном примере, то например при соотвествующем проектировании можно просто расширяя иерархию например твоего sobjectizer можно было бы внедряться, и даже переопределять, часть функциональности, при этом не нужно никаких ухищрений типа паттерна CoR. И более того, переопределенный фреймворк можно сделать несоместимым (например по генерируемым объектам-сообщениям) с базовым, что дает определенную гарантию typesafe системы (хотя может и определенные сложности привнести).

    А вообще надо бы и правда попробывать чтонить более близкое к людям рассмотреть как пример... правда это уже на целую статью тянет, тут одним постом не отделаешься
    Re[31]: ...продолжение
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 24.05.07 18:39
    Оценка:
    Здравствуйте, aka50, Вы писали:

    E>>От создания компиляторов я далек. Вот на примере GUI-ев каких-нибудь или сетевого взаимодействия примеры бы какие-нибудь посмотреть бы...

    A>Ну непосредственно к сетевому коду или гуям в общем-то это слабо прикручивается, там рулит паттерн-матчинг и прочие implicit фишки (если конкретно скала рассматривать), а вот в деле фреймворко-компоненто-строения — вполне себе замечательная технология (хотя и не лишенная недостатков, например в том же компиляторе за счет всех эти self и type образуется довольно сильная связанность и например выцепить отдельно SyntaxAnalyzer без всей остальной ботвы довольно сложно)

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

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

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


    Вот, кстати, со Scala так постоянно -- какая-то заумность вокруг. Когда читаешь доки по D, Erlang или Nemerle, так сразу понимаешь что к чему и почему. А вот Scala в этом смысле не далеко от Haskell-а ушла


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[32]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 18:53
    Оценка:
    Здравствуйте, eao197, Вы писали:

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


    E>Вот не показалось мне, что для фреймворков это дело подходит. Тем более к расширению чего-нибудь внутри фреймворка безе перекомпиляции самого фреймворка. Ну т.е. если на пальцах объяснять: скажем у меня в SObjectizer при вызове события у агента создается объект, реализующий интерфейс event_data_t.

    Данная техника подходит для расширения в _compile-time_ с проверкой типов на этапе компиляции. Не более и не менее (т.е. если ты начнешь пытаться работать event_data из измененного фреймворка — у тебя будет несоотвествие типов).

    E>Тем более, что подобные расширения в динамических языках с открытыми типами делаются вообще очень прозрачно, без заморочек.

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

    А вообще не хочется опять сваливаться в спор dynamic vs static. Честно. Данный метод для _сатического_ расширения функционала с контролем типов в момент компиляции (т.е. этакий "static" spring). При этом он не отменяет возможности применения "dynamic" spring. Правда при этом все равно будут проверяться типы и допустим frameworkVer1.event_data и frameworkVer2 extends frameworkVer1 event_data будут не совместимы.
    Re[32]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 19:00
    Оценка:
    Здравствуйте, eao197, Вы писали:

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


    E>Вот, кстати, со Scala так постоянно -- какая-то заумность вокруг. Когда читаешь доки по D, Erlang или Nemerle, так сразу понимаешь что к чему и почему. А вот Scala в этом смысле не далеко от Haskell-а ушла


    Просто из разных миров. Я люблю статику и неперевариваю динамику (ну не понимаю я ее ). По этому мне тяжело работать с питоном, а вот в скалу как-то сразу въехал и она мне все больше нравиться... Еще к хаскелю присматриваюсь, уже даже понимать немного его начал, а там с типами вроде как еще хуже
    Re[33]: ...продолжение
    От: deniok Россия  
    Дата: 24.05.07 19:07
    Оценка:
    Здравствуйте, aka50, Вы писали:


    A>Просто из разных миров. Я люблю статику и неперевариваю динамику (ну не понимаю я ее ). По этому мне тяжело работать с питоном, а вот в скалу как-то сразу въехал и она мне все больше нравиться... Еще к хаскелю присматриваюсь, уже даже понимать немного его начал, а там с типами вроде как еще хуже


    С типами в Хаскелле всё хорошо.
    Re[34]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 19:12
    Оценка:
    Здравствуйте, deniok, Вы писали:

    D>С типами в Хаскелле всё хорошо.


    В скала тоже все отлично, но как видишь есть несогласные
    Re[35]: ...продолжение
    От: eao197 Беларусь http://eao197.blogspot.com
    Дата: 24.05.07 19:57
    Оценка:
    Здравствуйте, aka50, Вы писали:

    D>>С типами в Хаскелле всё хорошо.


    A>В скала тоже все отлично, но как видишь есть несогласные


    Дело не в несогласии, а в непонимании. Вот нет по Scala пока такой документации, чтобы прочитал и понял -- о, а ведь этого мне по работе-то и не хватало! Как-то с другими языками (Pascal, C++, Java, Ruby, Eiffel, D, Erlang) ситуация совсем другая, поскольку там материалы, ориентированные на практиков. А вот материалы о Scala больше напоминают отчеты о научных исследованиях.


    SObjectizer: <микро>Агентно-ориентированное программирование на C++.
    Re[36]: ...продолжение
    От: aka50 Россия  
    Дата: 24.05.07 22:14
    Оценка:
    Здравствуйте, eao197, Вы писали:

    E>Дело не в несогласии, а в непонимании. Вот нет по Scala пока такой документации, чтобы прочитал и понял -- о, а ведь этого мне по работе-то и не хватало! Как-то с другими языками (Pascal, C++, Java, Ruby, Eiffel, D, Erlang) ситуация совсем другая, поскольку там материалы, ориентированные на практиков. А вот материалы о Scala больше напоминают отчеты о научных исследованиях.


    Ну да... с доками не очень. Можешь порыться http://scala.sygneca.com, там есть кучка примеров и паттернов, хотя маловато конечно...
    Re[31]: ...продолжение
    От: WolfHound  
    Дата: 25.05.07 05:14
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Необходимо разработать графический редактор форм, который будет способен создавать и редактировать формы, сохранять их мето-описание в файлах различных форматов и загружать их из файлов различных форматов. Кроме того, необходимо разработать визуализатор (или конструктор) форм, который способен создавать работающие формы на основе их мето-описания.

    Что такое метаописание формы?
    Описание формы это данные. Те какие контролы, где лежет, что на них написано и тп это данные.
    А что на контроле может быть написано, можно ли ему задать шрифт итп это метаданные.

    Так вот в твоей архитектуре я нашол только очень плохо спроектированные данные. Никаких метаданных там нет.
    Те все матаданные хардкодятся в сериализаторы и дизайнер. Это очень плохо.

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

    КЛ>Так, структурная модель может быть представлена набором записей такого вида:


    КЛ>

      КЛ>
    1. Parent ID.
      КЛ>
    2. ID.
      КЛ>

    Не может.
    Ибо контролы не всегда просто содержат коллекцию других контролов.
    Может быть свойство содержащие вложенный контрол.

    КЛ>Визуальная модель может быть представлена набором таких записей:


    КЛ>

      КЛ>
    1. ID.
      КЛ>
    2. Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
      КЛ>
    3. Text.
      КЛ>
    4. Picture.
      КЛ>

    Это простите вобще бред.
    Думаешь для всех контролов отделаться текстом и картинкой?
    Да и некоторым контрола не нужны ни картинки ни текст.

    КЛ>Для расположения кнопок на гриде можно использовать вырожденный случай, когда X и Y задают положение ячейки, а Width и Height – всегда равны 1.

    Кул хацкер млин. Как у тебя вобще что-то работает если ты так запросто мешаешь теплое с мягким?

    КЛ>Если вырожденный случай не подходит, то топологическая модель для грида может быть такой:


    А для Dock'а третий, а для Follow четвертый, а я еще их кучу придумаю.

    КЛ>Динамическая модель состоит из набора структур такого вида:


    КЛ>

      КЛ>
    1. ID.
      КЛ>
    2. Handler.
      КЛ>

    Это типа у одного контрола может быть одно событие? Жестоко.

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

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

    КЛ>После проведенной нормализации получили мето-описание формы в виде четырех таблиц. Внутренне каждую таблицу в программе можно представить в виде массива структур (не нужны никакие интерфейсы!). Внешне эти таблицы можно представить практически в любом формате – хоть в xml, хоть в базе данных.

    Данная модель не жизнеспособна. Перечислять все проблемы очень долго.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[31]: ...продолжение
    От: minorlogic Украина  
    Дата: 25.05.07 07:19
    Оценка:
    Это больше похоже на модель данных, а не на описание архитектуры.

    Про расширяемость такого представления, я бы даже не стал заикаться.
    Ищу работу, 3D, SLAM, computer graphics/vision.
    Re[32]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 25.05.07 07:59
    Оценка:
    Здравствуйте, WolfHound,

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

    WH>Что такое метаописание формы?


    Это вопрос к Вам — Вы же ставили задачу. Если для Вас разница между "данными" и "метаданными" важна, соответственно, ее нужно было и подчеркнуть.

    WH>Описание формы это данные. Те какие контролы, где лежет, что на них написано и тп это данные.

    WH>А что на контроле может быть написано, можно ли ему задать шрифт итп это метаданные.

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

    WH>Метаданные нужны сериализаторам и дизайнеру для того чтобы они не знали контролы в лицо.

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

    И что? Просто добавляете контрол в соответствующую таблицу? Зачем трогать все остальное?

    WH>Ибо контролы не всегда просто содержат коллекцию других контролов.

    WH>Может быть свойство содержащие вложенный контрол.

    Там же написано — Parent ID и ID. А что это — идентификаторы контрола или свойства или чего-нибудь еще — совершенно не важно.

    WH>Думаешь для всех контролов отделаться текстом и картинкой?


    Перечислите здесь, что еще — кроме текста и картинки — может содержать (отображать) контрол, и я покажу, как можно изменить таблицу.

    WH>Да и некоторым контрола не нужны ни картинки ни текст.


    При заполнении эти поля можно оставить пустыми.

    КЛ>>Для расположения кнопок на гриде можно использовать вырожденный случай, когда X и Y задают положение ячейки, а Width и Height – всегда равны 1.

    WH>Кул хацкер млин. Как у тебя вобще что-то работает если ты так запросто мешаешь теплое с мягким?

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

    КЛ>>Если вырожденный случай не подходит, то топологическая модель для грида может быть такой:


    WH>А для Dock'а третий, а для Follow четвертый, а я еще их кучу придумаю.


    В Вашей постановке задачи ни про Dock, ни про Follow ничего не написано. Но если Вы детально опишите, что это такое, я могу наглядно показать, как и эти вещи укладываются в предложенную модель.

    WH>Это типа у одного контрола может быть одно событие? Жестоко.


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

    1. ID (контрола).
    2. Event ID.
    3. Handler.

    WH>Кстати я правильно понял что ты в дизайнере предлагаешь держать паралельно контролы используемые дизайнером и вот эти вот твои таблички?


    Вы бы по-человечески описали проблему — тогда можно будет говорить о решении.

    WH>Еще ты проигнорировал то что присоедененные свойства и события могут быть не только информацией о положении контрола.


    Почему проигнорировал? Вы их просто не перечислили. Перечислите, и посмотрим.

    WH>Данная модель не жизнеспособна. Перечислять все проблемы очень долго.


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

    Вы бы привели здесь свою модель, чтобы мы могли с коллегами оценить ее жизнеспособность и проверить на соответствие Вашим же критериям. А то как-то однобоко у Вас все получается.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[33]: ...продолжение
    От: WolfHound  
    Дата: 25.05.07 11:08
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Это вопрос к Вам — Вы же ставили задачу. Если для Вас разница между "данными" и "метаданными" важна, соответственно, ее нужно было и подчеркнуть.

    А для тебе что данные и метаданные одно и тоже?

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

    Еще раз. Метаданные не у формы. Метаданные у контролов. Причем они прибиты к контролам насмерть ибо это описание того что с этими контролами можно вобще делать.
    Имея такое описание мы можем работать с контролом обобщенно.

    КЛ>И что? Просто добавляете контрол в соответствующую таблицу? Зачем трогать все остальное?

    Какую еще таблицу? Контрол нарисовал Выся Пупкин который не имеет доступа к исходникам системы.

    КЛ>Там же написано — Parent ID и ID. А что это — идентификаторы контрола или свойства или чего-нибудь еще — совершенно не важно.

    Да блин... наворачивается системка...

    КЛ>Перечислите здесь, что еще — кроме текста и картинки — может содержать (отображать) контрол, и я покажу, как можно изменить таблицу.

    Да что угодно. Это ограничено только фантазией автора контрола.

    КЛ>При заполнении эти поля можно оставить пустыми.

    А зачем их вобще для всех заводить?

    КЛ>Не вижу здесь никакого хакерства. Наоборот, я использовал обобщение. Алгоритму расположения все равно, что располагать и на чем располагать. Сам алгоритм от этого не изменится — он работает с прямоугольниками.

    Те ты таки настаиваешь на этом? И после такого ты утверждаешь что твои программы легко поддерживать?
    Дело в том что ты создал очень сильную связь на пустом месте. Теперь если мы захотим что-то изменить поедет все. Спрашивается а оно нам надо?

    КЛ>В Вашей постановке задачи ни про Dock, ни про Follow ничего не написано. Но если Вы детально опишите, что это такое, я могу наглядно показать, как и эти вещи укладываются в предложенную модель.

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

    Мой подход этих проблем лишон.

    При реализации данной системы проблемы были. Но ни одна из них не связанна с метаданными. Те были проблемы с кривыми контролами (ну не самим же все писать), были проблемы с разной природой различных представлений (win и web ну очень разные). Но небыло проблем с метаданными. Те вобще небыло.

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

    WH>>Кстати я правильно понял что ты в дизайнере предлагаешь держать паралельно контролы используемые дизайнером и вот эти вот твои таблички?

    КЛ>Вы бы по-человечески описали проблему — тогда можно будет говорить о решении.
    Проблема в том что нужно синхронизировать два разных представления одного и тогоже.
    Ибо редактор был взят тот что в WinForms. Ну не самому же его писать.

    WH>>Еще ты проигнорировал то что присоедененные свойства и события могут быть не только информацией о положении контрола.

    КЛ>Почему проигнорировал? Вы их просто не перечислили. Перечислите, и посмотрим.
    Что перечислить? Все свойства которые один контрол может добавлять другому?
    Так я их не знаю. Каждый новый контрол может иметь возможность комунибудь, чегонибудь добавить.
    Это не фиксируется при разработке системы.
    Добро пожаловать в реальный мир где требования постоянно меняются.

    WH>>Данная модель не жизнеспособна. Перечислять все проблемы очень долго.

    КЛ>Почему же не работоспособна? Вполне работоспособна. Просто либо Вы слишком много требуете от эскиза, либо не полностью описали задачи, решения которых сейчас требуете. Все эти задачи решаемы.
    Не подменяй слова.
    Данная система не жизниспособна по тому что она не выживет под напором изменений.

    КЛ>Вы бы привели здесь свою модель, чтобы мы могли с коллегами оценить ее жизнеспособность и проверить на соответствие Вашим же критериям. А то как-то однобоко у Вас все получается.

    Так это же не я предлогаю серебренную пулю.
    А ты пока еще не продемонстрировал ничего интересного. Все твои решения это то как нельзя делать никогда.
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[34]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 25.05.07 12:44
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>А для тебе что данные и метаданные одно и тоже?

    Это зависит от контекста. Вон даже wikipedia утверждает, что не существует единственного формального определения термина метаданные. Откуда ж я знаю, что Вы имеете в виду?

    WH>Еще раз. Метаданные не у формы. Метаданные у контролов. Причем они прибиты к контролам насмерть ибо это описание того что с этими контролами можно вобще делать.

    WH>Имея такое описание мы можем работать с контролом обобщенно.
    Ну, форму в некотором роде тоже можно рассматривать в виде контрола. В общем, не важно. Вот и привели бы примеры метаданных контрола. А раз не привели — то чего же пенять?

    WH>Какую еще таблицу? Контрол нарисовал Выся Пупкин который не имеет доступа к исходникам системы.

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

    КЛ>>Там же написано — Parent ID и ID. А что это — идентификаторы контрола или свойства или чего-нибудь еще — совершенно не важно.

    WH>Да блин... наворачивается системка...
    Вот это, как раз, и называется абстрагированием, т.к. для описания структуры формы (или контрола) — что в чем содержится — совершенно не важен тип конкретных объектов. Т.е. в рамках конкретной задачи — структурирования — мы абстрагируемся от несущественных для этой задачи деталей.

    КЛ>>Перечислите здесь, что еще — кроме текста и картинки — может содержать (отображать) контрол, и я покажу, как можно изменить таблицу.

    WH>Да что угодно. Это ограничено только фантазией автора контрола.
    Даже в MS Visual Studio или в MS Word'е ограниченное количество контролов. При всем уважении, не думаю, что у Вас система как-то резко сложнее.

    КЛ>>При заполнении эти поля можно оставить пустыми.

    WH>А зачем их вобще для всех заводить?
    Для того, чтобы не плодить сущностей сверх необходимого.

    КЛ>>Не вижу здесь никакого хакерства. Наоборот, я использовал обобщение. Алгоритму расположения все равно, что располагать и на чем располагать. Сам алгоритм от этого не изменится — он работает с прямоугольниками.

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

    WH>Дело в том что ты создал очень сильную связь на пустом месте. Теперь если мы захотим что-то изменить поедет все. Спрашивается а оно нам надо?

    Что это за связь и в чем она состоит? А вообще-то, я очень сильно сомневаюсь, что layout алгоритм как-то сильно изменится в ближайшие лет 10 — 20. Оперирует он прямоугольниками и боксами и будет оперировать еще долго. Сильно сомневаюсь, что для расположения контролов на форме Вы будете оперировать тетраэдрами.

    КЛ>>В Вашей постановке задачи ни про Dock, ни про Follow ничего не написано. Но если Вы детально опишите, что это такое, я могу наглядно показать, как и эти вещи укладываются в предложенную модель.

    WH>Да я сам знаю как уложить это в твою модель. Я давно понял что ты предлогаешь.
    Если поняли, то и хорошо. Значит еще одно возражение снимается. С другой стороны, если все-таки непонятно, то лучше, наверное, рассказать и про Dock, и про Follow. Для профилактики от неверного понимания.

    WH>Вот только я категорически против таких методов.

    WH>Ибо это все очень тяжело делать.
    WH>Ибо при добалении нового типа контейнера да и нового контрола нам придется переделывать ВСЕ! Те совсем ВСЕ!
    WH>Нам придется править и все сериализаторы, и менять структуру таблиц в базах. И допиливать дизайнер.
    Вы приводите возражения, не приводя примеры. Взяли бы да и разобрали конкретный пример. Какой контейнер добавим? Что при этом поменяется? "ВСЁ" — это что? Говорите предметно.

    Лично у меня мнение, что, наоборот, ничего менять не придется, т.к. модель содержит только те данные, которые нужны для алгоритма размещения. А если алгоритм размещения при добавлении нового контейнера не поменяется (что очень вероятно), то и данные менять не придется.

    WH>Мой подход этих проблем лишон.

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

    WH>При реализации данной системы проблемы были. Но ни одна из них не связанна с метаданными. Те были проблемы с кривыми контролами (ну не самим же все писать), были проблемы с разной природой различных представлений (win и web ну очень разные). Но небыло проблем с метаданными. Те вобще небыло.

    Вы бы конкретизировали проблемы, так чтобы коллеги могли понять.

    WH>Когда нужен был новый контрол он просто тупо добавлялся.

    WH>И ничего править было не нужно.
    WH>Ибо система понимет метаданные контрола и по ним все само работает.
    WH>И сериализация, и редактор и все что в голову взбредет.
    А никто и не утверждал, что система не будет работать. Утверждалась другое — будет монстроидальный код и сложности с сопровождением. Судя по тому, что код интерфейсов Вы так и не привели, он действительно монстроидален.

    WH>>>Еще ты проигнорировал то что присоедененные свойства и события могут быть не только информацией о положении контрола.

    КЛ>>Почему проигнорировал? Вы их просто не перечислили. Перечислите, и посмотрим.
    WH>Что перечислить? Все свойства которые один контрол может добавлять другому?
    Да, это было бы хорошо. Или хотя бы перечислите несколько характерных примеров. Абстрактные пожелания как-то плохо воспринимаются.

    WH>Так я их не знаю. Каждый новый контрол может иметь возможность комунибудь, чегонибудь добавить.

    А зачем контролам добавлять что-то другим контролам?

    WH>Это не фиксируется при разработке системы.

    Очень плохо.

    WH>Добро пожаловать в реальный мир где требования постоянно меняются.

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

    WH>Данная система не жизниспособна по тому что она не выживет под напором изменений.

    А на мой взгляд — вполне работоспособна и жизнеспособна. И напор изменений с ней ничего не сделает. Если у Вас иное мнение, то, пожалуйста, привидите пример изменения, который ее разрушит.

    КЛ>>Вы бы привели здесь свою модель, чтобы мы могли с коллегами оценить ее жизнеспособность и проверить на соответствие Вашим же критериям. А то как-то однобоко у Вас все получается.

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

    WH>А ты пока еще не продемонстрировал ничего интересного. Все твои решения это то как нельзя делать никогда.

    На мой взгляд, это уже почти грубость. Я хоть и выдвигал претензии к стилю архитектуры, предлагаемой Вами, но так не говорил. Обычно грубят, когда не хватает аргументации.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[37]: ...продолжение
    От: konsoletyper Россия https://github.com/konsoletyper
    Дата: 25.05.07 20:55
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Я говорю не о тех контролах, которые присутствуют в редакторе MS Visual Studio, а о том, что даже для большой и сложной программы вряд ли требуется бесконечное число контролов. И рекомендовал Вам обратить внимание на Word или Studio, где контролов (здесь я имею в виду интерфейс этих программ) — ограниченное количество, и весь интерфейс оформлен в едином стиле.


    Гы... Где-где это органиченный набор контролов?

    WH>>И пытаемся понять как же сюда впишится лейаут который использует для позиционирования контролов скажем сплайны. Те на лейауте задается некая кривая по кторой выстраиваются контролы.


    КЛ>Ну, во-первых, привязать контролы к сплайну можно еще и во время дизайна формы. А если такое решение не подходит, то придется разделить операцию размещения на две: позиционирование и масштабирование. Соответственно, для позиционирования потребуется отдельная модель. Итого имеем очень ограниченное расширение модели.


    КЛ>А, собственно говоря, что в этом страшного? Ваш код тоже поменяется, если Вы решите размещать контролы вдоль сплайна.


    Прежде чем делать такие вот заявления, советую обратить внимание, например, на GTK.
    ... << RSDN@Home 1.2.0 alpha rev. 672>>
    Re[27]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 26.05.07 19:33
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

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


    Видишь ли, в современных условиях (читай, наличие автоматизированных средств рефакторинга, хороших компиляторов, unit-тестирования), сложность рефакторинга определяется совсем не количеством изменяемого кода, а его читаемостью и простотой изменений. Например, изменение интерфейса с точки зрения поддержки не страшно, потому что компилятор заставит реализовать это изменение везде. Не страшно переименование или удаление ненужных методов, потому что это можно осуществить нажатием одной кнопки.
    Зато по прежнему страшен рефакторинг сложного и запутанного кода. Страшен рефакторинг классов с кучей взаимопересекающейся логики. Страшен рефакторинг контрактов, выраженных не ввиде формальных структур ЯП, а ввиде императивного кода. Страшен рефакторинг кусков, проблемы в которых можно найти только в процессе эксплуатации кода.
    С этой точки зрения прямой зависимости между количеством классов и интерфейсов и сложностью (читай стоимостью) рефакторинга нет. Однако кое какая корреляция имеется, и она отнюдь не в пользу кода, в котором в один класс или интерфейс упихано максимальное количество аспектов.
    P.S. Кстати, а как с точки зрения твоей теории выглядит АОП? Как совсем неверный подход?
    ... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[41]: ...продолжение
    От: WolfHound  
    Дата: 26.05.07 20:04
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

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

    То что предлагает он я прекрасно понимаю. И понимаю чем это черевато.

    Но вобще лично мне просто пофлеймить охота и возможно кто-то другой что-то полезное для себя узнает.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[42]: ...продолжение
    От: konsoletyper Россия https://github.com/konsoletyper
    Дата: 26.05.07 20:37
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Но вобще лично мне просто пофлеймить охота и возможно кто-то другой что-то полезное для себя узнает.


    Да, да, интересный флейм получается. Я как раз сейчас подобными вещами занят. Хотелось бы ещё услышать флейм по поводу того, как в одном флаконе соединяются редакторы win- и web-форм, а то это задача одна из актуальнейших, но подойти к ней как-то тяжело.
    ... << RSDN@Home 1.2.0 alpha rev. 672>>
    Re[43]: ...продолжение
    От: WolfHound  
    Дата: 26.05.07 21:28
    Оценка:
    Здравствуйте, konsoletyper, Вы писали:

    K>Да, да, интересный флейм получается. Я как раз сейчас подобными вещами занят. Хотелось бы ещё услышать флейм по поводу того, как в одном флаконе соединяются редакторы win- и web-форм,

    С редактором поступили очень цинично. Взяли то что упакован во фреймворк. Поищи в сети должны быть примеры реализации IDesignerHost и компании.
    Но редактор это так. Семечки...

    K>а то это задача одна из актуальнейших, но подойти к ней как-то тяжело.

    Скрестить win и web это еще та задачка.
    Расписывать ее по полочкам чисто ради флейма не осилю.

    Но пару советов могу дать:

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

    Также имей в виду что будет засада с лейаутами. Уж больно они разные у win и web.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[44]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.05.07 03:53
    Оценка:
    Здравствуйте, WolfHound, Вы писали:
    WH>Также имей в виду что будет засада с лейаутами. Уж больно они разные у win и web.
    Есть хорошая идея: в Win пользоваться только Flow layout.
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[45]: ...продолжение
    От: WolfHound  
    Дата: 28.05.07 04:22
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    WH>>Также имей в виду что будет засада с лейаутами. Уж больно они разные у win и web.

    S>Есть хорошая идея: в Win пользоваться только Flow layout.
    В web есть еще как минимум grid layout.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[46]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.05.07 04:44
    Оценка:
    Здравствуйте, WolfHound, Вы писали:
    WH>В web есть еще как минимум grid layout.
    Его нужно запретить под страхом смертной казни (вместе с постбэком. Впрочем, за последний можно ограничиться двадцатью пятью годами заключения).
    Это слабая подделка под изначально корявую модель позиционирования в win.
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[47]: ...продолжение
    От: WolfHound  
    Дата: 28.05.07 05:01
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    WH>>В web есть еще как минимум grid layout.

    S>Его нужно запретить под страхом смертной казни (вместе с постбэком. Впрочем, за последний можно ограничиться двадцатью пятью годами заключения).
    S>Это слабая подделка под изначально корявую модель позиционирования в win.
    Не понял что плохого в table?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[48]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.05.07 05:21
    Оценка:
    Здравствуйте, WolfHound, Вы писали:
    WH>Не понял что плохого в table?
    grid layout никакого отношения к table не имеет.
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[49]: ...продолжение
    От: WolfHound  
    Дата: 28.05.07 05:38
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    WH>>Не понял что плохого в table?

    S>grid layout никакого отношения к table не имеет.
    Ты с дефолтным виндовым (который по пикселям работает) не путаешь?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[50]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.05.07 06:07
    Оценка:
    Здравствуйте, WolfHound, Вы писали:
    Гм. Это ты что-то с чем-то путаешь.
    Grid Layout в Web изобретен Microsoft, которые с упорством, достойным лучшего применения, сделали его дефолтным в MS VS 2003. Этот layout никакого отношения к таблицам не имеет, а использует тупое абсолютное позиционирование контролов, ровно как в Windows. Название свое он получил из типографской практики, см. http://en.wikipedia.org/wiki/Grid_%28page_layout%29

    Если ты имел в виду джавовскую трактовку Grid Layout, то в вебе ее называют table layout, и страшно критикуют за разнообразные прегрешения. Впрочем, большинство дизайнеров таки признают, что "без таблиц сверстать мало-мальски сложный сайт для кроссбраузерного отображения практически невозможно".
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[45]: ...продолжение
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 28.05.07 08:51
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    WH>>Также имей в виду что будет засада с лейаутами. Уж больно они разные у win и web.

    S>Есть хорошая идея: в Win пользоваться только Flow layout.

    Этого, мягко говоря, мало.
    ... << RSDN@Home 1.2.0 alpha rev. 675>>
    AVK Blog
    Re[29]: ...продолжение
    От: Lazy Cjow Rhrr Россия lj://_lcr_
    Дата: 28.05.07 09:11
    Оценка:
    aka50,

    E>>Нашлась бы добрая душа, да на пальцах бы объяснила, в чем смысл рассматриваемой в этом tech report-е проблемы. И чтобы примеры были более жизненные, а не Plus, PlusNeg и DblPlusNeg.


    E>>А то все закручено, заморочено и сложно понять, нужно это вообще или нет?


    A>А если в кратце, то там описывается техника deep mixin composition, т.е. глубокая модификация иерархии путем подмешивания в нее нужной функциональности.


    Я уже начал помаленьку лабать статью на эту тему . В принципе обобщение простого наследования, то есть композиция через with и линеаризация — имхо это одни из самых сложных мест в Скале. Уже вторую неделю ломаю голову, как лучше описать их, чтобы было достаточно кратко и понятно.

    ps: Надеюсь сим откровением твои планы не разрушил
    quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
    Re[52]: ...продолжение
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 28.05.07 09:27
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:
    AVK>Точно путаешь. Grid layout (термин из Swing, WPF) это то, что в вебе реализуется как раз таки при помощи таблиц и называется табличной версткой.
    Может быть, может быть. Хотя, насколько я помню SWING, его grid layout значительно жестче, чем даже table layout в вебе, т.к. компоненты не могут пересекать границы клеток.
    AVK> То, о чем ты говоришь, так и называется absolute position layout (Canvas в WPF, в Swing не помню уже).
    S>>, ровно как в Windows. Название свое он получил из типографской практики, см. http://en.wikipedia.org/wiki/Grid_%28page_layout%29
    AVK>

    A typographic grid is a two-dimensional structure made up of a series of intersecting vertical and horizontal axis used to structure content.

    AVK>Это никак не абсолютное позиционирование. Там же пример есть:
    AVK>
    AVK>Очень хорошо видно, что грид тут совсем никак не пиксельная сетка.
    Ну, я так понял, что выбор самих направляющих в значительной мере произволен; и что привязка выполняется только для левого верхнего угла — обрати внимание, как свободно тексты пересекают границы ячеек. Т.е. речь идет о независимом позиционировании элементов, и собственно grid сводится к фиксации возможных значений top и left. Нет никаких намеков на поведение позиционирования при изменении размеров элементов.
    AVK>Ну и наконец — при разговоре о GUI под grid layout (не только в Swing) подразумевается вполне конкретная вещь.
    AVK>
    Может быть, может быть. То, что называлось Grid Layout в VS 2003/2005 — преступление против эстетики и здравого смысла.
    ... << RSDN@Home 1.2.0 alpha rev. 677>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[30]: ...продолжение
    От: aka50 Россия  
    Дата: 28.05.07 09:31
    Оценка:
    Здравствуйте, Lazy Cjow Rhrr, Вы писали:

    LCR>aka50,


    E>>>Нашлась бы добрая душа, да на пальцах бы объяснила, в чем смысл рассматриваемой в этом tech report-е проблемы. И чтобы примеры были более жизненные, а не Plus, PlusNeg и DblPlusNeg.


    E>>>А то все закручено, заморочено и сложно понять, нужно это вообще или нет?


    A>>А если в кратце, то там описывается техника deep mixin composition, т.е. глубокая модификация иерархии путем подмешивания в нее нужной функциональности.


    LCR>Я уже начал помаленьку лабать статью на эту тему . В принципе обобщение простого наследования, то есть композиция через with и линеаризация — имхо это одни из самых сложных мест в Скале. Уже вторую неделю ломаю голову, как лучше описать их, чтобы было достаточно кратко и понятно.

    Для меня пока слжное место — self type и абстрактные типы. В частности не очень понимаю, почему

    trait Base {
     type T <: A
    
     trait A requires T {
       def fun(v: T)
     }
    }
    
    trait Base1 extends Base {
     type T = A1
     class A1 extends A {
       val v = 1
       def fun(v: T) = println(v)
     }
    }
    
    object base1 extends Base1
    
    trait Base11 extends Base1 {
     class A11 extends A1
    }
    
    object base11 extends Base11
    
    object Test extends Application {
     val v1 = new base1.A1
     val v11 = new base11.A11
    
    v1.fun(v11); // this code
    v11.fun(v1); // not work
    }


    pathdep.scala:29: error: type mismatch;
    found   : base11.A11
    required: base1.T
    v1.fun(v11);
           ^
    pathdep.scala:30: error: type mismatch;
    found   : base1.A1
    required: base11.T
    v11.fun(v1);
            ^


    Почему после refinement (как это по русски? ) type T = A1 по идее дальше во всех наследниках тип T должен иметь вполне конктретный тип Base1.A1, но компилятор продолжает упорно втыкать Base11.this.T Base1.this.T и т.д. Т.е. делкарация requires не дает возможности нормально наследоваться, т.к. все методы будут постоянно требовать переорпеледения типа и будут тотально несовместимы при любом refinement...
    ЗЫ: за эту проблемку eao197 спасибо , это он озадачил...

    LCR>ps: Надеюсь сим откровением твои планы не разрушил

    Нарушил , но я тебе мыло отослал, только ты пока не ответил...
    Re[53]: ...продолжение
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 28.05.07 09:43
    Оценка:
    Здравствуйте, Sinclair, Вы писали:

    S>Может быть, может быть. Хотя, насколько я помню SWING, его grid layout значительно жестче, чем даже table layout в вебе,


    Во-первых он настраиваемый, во-вторых есть еще GridBagLayout, в третьих в WPF Grid это умеет. Вобщем, это уже мелочи, не влияющие на принцип.

    AVK>>Очень хорошо видно, что грид тут совсем никак не пиксельная сетка.

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

    Но это же типографский термин. Здесь речь идет уже о GUI, а там этот термин трактуют несколько иначе.
    ... << RSDN@Home 1.2.0 alpha rev. 675>>
    AVK Blog
    Re[53]: ...продолжение
    От: Cyberax Марс  
    Дата: 28.05.07 10:19
    Оценка:
    Sinclair wrote:
    > AVK>Точно путаешь. Grid layout (термин из Swing, WPF) это то, что в вебе
    > реализуется как раз таки при помощи таблиц и называется табличной версткой.
    > Может быть, может быть. Хотя, насколько я помню SWING, его grid layout
    > значительно жестче, чем даже table layout в вебе, т.к. компоненты не
    > могут пересекать границы клеток.
    В SWING есть GridBagLayout, в котором это возможно (как и еще куча
    всего, он даже мощнее вебовского).
    Posted via RSDN NNTP Server 2.1 beta
    Sapienti sat!
    Re[54]: ...продолжение
    От: aka50 Россия  
    Дата: 29.05.07 11:16
    Оценка:
    Здравствуйте, Delight, Вы писали:

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


    S>>Может быть, может быть. Хотя, насколько я помню SWING, его grid layout значительно жестче, чем даже table layout в вебе, т.к. компоненты не могут пересекать границы клеток.

    D>Могут. Span поддерживается.
    D>Когда-то сам делал простенькую сериализацию-десериализацию в XML (.NET 1.1) и пришёл к выводу, что для управления layoutом вполне хватает splitted panel c абсолютными и процентными пропорциями деления. Практически та же HTML-table, только вид в профиль. И, само собой, контролы надо через reflection настраивать.

    Все становиться несокько менее весело, когда хочется использовать liquid css design: http://www.mardiros.net/liquid-css-layouts.html
    пример подобной техники: http://www.glish.com/css/1.asp
    Re[55]: ...продолжение
    От: Delight  
    Дата: 29.05.07 11:56
    Оценка:
    Здравствуйте, aka50, Вы писали:

    A>Все становиться несокько менее весело, когда хочется использовать liquid css design: http://www.mardiros.net/liquid-css-layouts.html

    A>пример подобной техники: http://www.glish.com/css/1.asp

    А тут в чём проблема? ИМХО CSS как раз легко подменить и никакой новой сущности не надо. Другое дело — десктоповые бинарники...
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Re[40]: ...продолжение
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 01.06.07 13:59
    Оценка:
    Здравствуйте, WolfHound,

    Ок, давайте продолжим.

    WH>Ну давай. Раскажи что же они сказали.

    Если перевести их высказывания на нормальный технический язык, то основных недовольства два:

    1. "Мешанина" из интерфейсов, в числе которых есть и совершенно пустые.
    2. Злоупотребление object'ами в качестве аргументов функции.
          public interface IAttachedProperty : IPropertyBase, IAttachedElement
          {
              object GetValue(object owner, object instance);
              void SetValue(object owner, object instance, object value);
                        // ...
          }

    К этому я бы добавил еще две претензии:

    1. Дублирование методов в интерфейсах IProperty и IAttachedProperty, и в интерфейсах IEvent и IAttachedEvent.
          public interface IAttachedProperty : IPropertyBase, IAttachedElement
          {
              object GetValue(object owner, object instance);
              void SetValue(object owner, object instance, object value);
              void AddValueChanged(object owner, object instance, EventHandler handler);
              void RemoveValueChanged(object owner, object instance, EventHandler handler);
              bool CanResetValue(object owner, object instance);
              void ResetValue(object owner, object instance);
              bool ShouldSerializeValue(object owner, object instance);
          }
          public interface IProperty : IPropertyBase, IElement
          {
              object GetValue(object instance);
              void SetValue(object instance, object value);
              void AddValueChanged(object instance, EventHandler handler);
              void RemoveValueChanged(object instance, EventHandler handler);
              bool CanResetValue(object instance);
              void ResetValue(object instance);
              bool ShouldSerializeValue(object instance);
          }

      Методы абсолютно похожи за исключением того, что в IAttachedProperty добавляется еще один аргумент. Из его названия непонятно, но, полагаю, что это контейнер (форма или что-то другое).
    2. Интерфейс IProperty практически полностью повторяет класс PropertyDescriptor, интерфейс IEvent — класс EventDescriptor. Непонятно, зачем потребовалось такое дублирование интерфейсов.

    КЛ>>Я спрашивал конкретные примеры. Конкретный пример включает название контрола, примеры свойств (перечислить) и примеры событий.

    WH>Зачем это? Я не понимаю.
    Затем, чтобы был понятен предмет разговора. Например, в .NET'е термины "атрибут", "свойство" имеют свои специфичные значения. А при программировании на других языках или с использованием иной технологии у этих терминов может быть иное значение. Например, в OOD характеристики объекта (или члены-данные класса) принято называть атрибутами, когда как в .NET это скорее свойства, а атрибуты задают механизм работы с этими свойствами различных инструментов, например, дизайнера форм.

    WH>Дались тебе конкретные контролы. Всеравно завтра прибежит заказчик и скажет хочу супер крутой контрол. Я его вчера в одной проге подсмотрел.

    WH>И все. Твоя до придела ужатая система начнет трещать по швам ибо нужно будет перелопатить все(сериализаторы, дизайнеры, возможно другие контролы). А моя даже не заметит появление нового контрола. Ну дописали еще одну сборку с контролом и все.
    Допустим, контролы будут изменяться. Пусть свойства этих контролов тоже будут совершенно непохожие и не сводимые друг к другу. Но свойства "контролов на форме" (элементов в контейнере) будут практически одинаковыми (или совсем одинаковыми). Это объясняется тем, что форма работает с разными контролами одинаковым образом, и эти дополнительные свойства контролов (Вы их называете добавленными) создаются в ответ на нужды формы. Грубо говоря, форме надо поместить контрол в определенную область, вот он и размещается по заданному X и Y.

    Аналогичная ситуация складывается в .NET'е с атрибутами. Не смотря на то, что контрол может иметь любые свойства, эти свойства имеют определенный набор атрибутов, которые позволяют управлять их отображением в PropertyGrid. Т.е. свойства разные, а атрибуты — одинаковые. Здесь я имею в виду одинаковость типов и/или названий атрибутов, а не их значений.

    То же самое произойдет и с контролами на форме.

    WH>Модель метаданных от самх контролов не зависит никак.

    WH>Болие того модель метаданных такова что может работать с чем угодно, а не только контролами.
    WH>Это называется повторное использование кода.
    И в чем состоит назначение этой модели? Вы просто продублировали и так уже существующие классы PropertyDescriptor и EventDescriptor, при этом, наплодив дубликатов (IProperty и IAttachedProperty, IEvent и IAttachedEvent). И реализовали установку и получение свойства при помощи рефлексии. Классов много, а функциональность — одна. Стоит ли игра свеч?

    WH>Так это и были проблемы. Системы фундаментально различные. Но их нужно подвести под общий знаменатель для того чтобы прикладникам (люди рисующие формочки сотнями) не приходилось делать одну и туже работу 2 раза. Болие того тонкости отношений win с web их тоже заботить не должны.

    С этим никто и не спорит. Но Вы привели общую цель. А для того, чтобы ее можно было достичь, нужно конкретизировать задачи, которые и возникают из-за различий между win и web forms. Каждую задачу желательно сопроводить поясняющим примером.

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

    WH>А зачем мне это надо если в мою модель укладываются все контролы? Всключая контролы для принципиально другого UI и вобще то что контролами UI не является.

    WH>Так зачем мне частности если у меня общий случай хорошо работает?
    О какой модели идет речь? Вы просто написали читалку и сохранялку свойств с использованием отражения. Извините, но даже в статьях на RSDN.ru и gotdotnet.ru описываются способы, как это можно сделать гораздо проще. Без того, чтобы плодить кучу интерфейсов.

    Непонятно, в чем "фишка" Вашего решения?

    WH>Не получится. Дело в том что лейауты имеют разную логику. И им нужны разные данные и разный код.

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

    WH>Реализация данной модели метаданных для всех контролов уместилась в 8 классов.

    С этим более-менее все понятно. Спасибо за поясняющий код.

    WH>Дык всеже в чем притензия к совершенно тривиальному коду?

    В нарушении LSP.

    WH>Я хочу узнать сколько языков ты знаешь. Ибо от этого очень сильно зависит то как человек проектирует.

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

    КЛ>>Позвольте переспросить: Для того, чтобы добавить тултипы ко всем контролам формы, Вы заводите специальный контрол, который осуществляет такое добавление?

    WH>Да. Причем этот контрол не знает в лицо ни один другой контрол. И все работает. Забавно правда?
    WH>Кстати не помню как в WinForms 1 но в WinForms 2 сделано также.
    А каким образом он добавляет это свойство?

    WH>А у тебя со "спокойно реализуете" будут большие проблемы.

    С чего Вы это взяли? С того, что приведенные таблицы не содержат нужное Вам свойство? Так чего Вы хотели от чернового решения? Оно лишь дано для иллюстрации подхода. А вот в Вашем случае, формы, созданные по той же "тултипной" технологии, станут просто несопровождаемыми из-за хаотичной зависимости между контролами. Сопровождающий программист просто запарится определять, какие свойства добавляет какой компонент. Конечно, в том случае, когда таких компонентов не 2 — 3, а 10 — 20.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[28]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 01.06.07 14:30
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

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

    Именно такой запутанный код и порождается продемонстрированным подходом к наследованию. Особенно, если при этом наследование производится путем вынесения общих атрибутов (здесь я пишу об атрибутах объектов в понимании OOD, а не в понимании .NET) в базовые классы или интерфейсы.

    AVK>С этой точки зрения прямой зависимости между количеством классов и интерфейсов и сложностью (читай стоимостью) рефакторинга нет. Однако кое какая корреляция имеется, и она отнюдь не в пользу кода, в котором в один класс или интерфейс упихано максимальное количество аспектов.

    Я писал не о количество классов/интерфейсов вообще, а о количестве классов/интерфейсов, приходящихся на одну сущность.

    AVK>P.S. Кстати, а как с точки зрения твоей теории выглядит АОП? Как совсем неверный подход?

    Не скажу, что много читал про АОП. Но из того, что видел, считаю: идея, как мне кажется, в правильном направлении, но реализация — нехорошая.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[41]: ...продолжение
    От: WolfHound  
    Дата: 01.06.07 17:34
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>"Мешанина" из интерфейсов, в числе которых есть и совершенно пустые.

    Не техническая оценка.
    1)Нет там никакой мешанины. Все абсолютно логично разделено на аспекты.
    2)Ну и что что есть пустой интерфейс? Он необходим для однообразия иерархии. Без него получилось бы ущербно.

    КЛ>Злоупотребление object'ами в качестве аргументов функции.

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

    КЛ>Методы абсолютно похожи за исключением того, что в IAttachedProperty добавляется еще один аргумент. Из его названия непонятно, но, полагаю, что это контейнер (форма или что-то другое).

    Именно.

    КЛ>Интерфейс IProperty практически полностью повторяет класс PropertyDescriptor, интерфейс IEvent — класс EventDescriptor. Непонятно, зачем потребовалось такое дублирование интерфейсов.

    За тем что в модели PropertyDescriptor/EventDescriptor нет присоеденненых свойств и событий.

    КЛ>Допустим, контролы будут изменяться. Пусть свойства этих контролов тоже будут совершенно непохожие и не сводимые друг к другу. Но свойства "контролов на форме" (элементов в контейнере) будут практически одинаковыми (или совсем одинаковыми). Это объясняется тем, что форма работает с разными контролами одинаковым образом, и эти дополнительные свойства контролов (Вы их называете добавленными) создаются в ответ на нужды формы. Грубо говоря, форме надо поместить контрол в определенную область, вот он и размещается по заданному X и Y.

    Нет заданных X и Y. Ну нет. Положение определяют лейауты. Причем лейауты могут быть вложенными.

    КЛ>И в чем состоит назначение этой модели? Вы просто продублировали и так уже существующие классы PropertyDescriptor и EventDescriptor, при этом, наплодив дубликатов (IProperty и IAttachedProperty, IEvent и IAttachedEvent). И реализовали установку и получение свойства при помощи рефлексии. Классов много, а функциональность — одна. Стоит ли игра свеч?

    Еще раз. Нет дублирования. Ну нету. Это разные сущьности и обрабатывать их нужно по разному.
    Что касается PropertyDescriptor и EventDescriptor то я их использую для того чтобы не писать самому PropertyGrid. Но коллекции из этих дескрипторов я формирую сам на основе своей модели производя связывание первого аргумента методов присоедененных совойств и присоедененных событий. Связывание происходит на лету при редактировании. Иначе просто нельзя получить актуальный список присоедененных свойств и событий.

    КЛ>С этим никто и не спорит. Но Вы привели общую цель. А для того, чтобы ее можно было достичь, нужно конкретизировать задачи, которые и возникают из-за различий между win и web forms. Каждую задачу желательно сопроводить поясняющим примером.

    Ради флейма я большую статью, а то и небольшую книгу не осилю.

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

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

    КЛ>О какой модели идет речь? Вы просто написали читалку и сохранялку свойств с использованием отражения. Извините, но даже в статьях на RSDN.ru и gotdotnet.ru описываются способы, как это можно сделать гораздо проще. Без того, чтобы плодить кучу интерфейсов.

    А там описываются присоедененные свойства? Нет? Ай какая неприятность...

    КЛ>Не получится, ну и ладно. В конце-концов, у меня возможность обобщения лэйаутов указывается в качестве дополнительной.

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

    КЛ>Но, мне кажется, если постараться, то такое обобщение создать можно. Надо просто разобраться в разных видах лэйаутов.

    Их бесконечное колличество. И они зависят исключительно от фантации заказчиков.

    WH>>Дык всеже в чем притензия к совершенно тривиальному коду?

    КЛ>В нарушении LSP.
    Далось тебе это LSP. Конкретные проблемы назвать можешь?

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

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

    КЛ>С чего Вы это взяли? С того, что приведенные таблицы не содержат нужное Вам свойство? Так чего Вы хотели от чернового решения? Оно лишь дано для иллюстрации подхода.

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

    КЛ>А вот в Вашем случае, формы, созданные по той же "тултипной" технологии, станут просто несопровождаемыми из-за хаотичной зависимости между контролами. Сопровождающий программист просто запарится определять, какие свойства добавляет какой компонент. Конечно, в том случае, когда таких компонентов не 2 — 3, а 10 — 20.

    Он вобщето пользуется редактором. А редактор железный. Ему хоть 2, хоть 22, хоть 22222.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[41]: ...продолжение
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 01.06.07 22:09
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

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


    Одним словом Блаб в области КОП. Единственно разумное решение дать ссылки на хороший материал по КОП.
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: ...продолжение
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 01.06.07 22:09
    Оценка:
    Здравствуйте, aka50, Вы писали:

    Это... ты бы взял за основу преведенную статью и написал бы для нашего сайта по-русски обо всем об этом. А?
    ... << RSDN@Home 1.2.0 alpha rev. 637>>
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[31]: О сопровождении
    От: WolfHound  
    Дата: 03.06.07 12:45
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Т.е. мало того, что Вам придется дублировать одни и те же алгоритмы в разных контролах (в кнопке, в списке, в радиокнопке и т.д.), так еще и изменять все эти контролы, как только понадобится поменять какой-нибудь алгоритм (скажем, layout). Даже если предположить, что если Вы layout все-таки вынесите в отдельный модуль, но будете хранить свойства, связанные с layout'ом в каждом компоненте (у WolfHound'а они называются добавленными свойствами), Вам придется изменять все контролы, как только поменяется формат данных, необходимых для layout'а.

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

    hint: Присоедененные свойства они на то и присоедененные что добавляются к компоненту внешними для этого компонента средствами, а не хардкодятся в сам компонент.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[32]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 03.06.07 14:48
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Тут есть только один человек который предлагает засунуть все свойства и все алгоритмы во все контролы

    Мягко говоря, это не соответствует истине.

    WH>да еще и использовать одни и теже свойства для разных целей в зависимомти от фазы луны. И это не я.

    Про layout'ы я Вам уже объяснял. Жаль, что Вы не поняли. Но ничего более добавить не могу.

    WH>hint: Присоедененные свойства они на то и присоедененные что добавляются к компоненту внешними для этого компонента средствами, а не хардкодятся в сам компонент.

    Просто непонятно, что Вы с этими свойствами делаете. Присоединяете ли Вы их лишь виртуально — только для того, чтобы они отображались в property grid вместе с другими свойствами контрола? Или Вы их каким-то образом динамически добавляете к другим свойствам контрола и, фактически, генерируете новый код? Или эти добавленные свойства сохраняются в XML вместе с другими свойствами контрола(т.е. "добавленные свойства" добавляются только для сохранения или только для сохранения и отображения в property grid).
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[31]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.06.07 16:37
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Не смотря на то, что английский термин (coupling) упомянут Вами верно, в переводах используется другое слово — "зацепление".


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

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


    Взгляд будет подкреплен аргументами?

    КЛ> Далее при ответе я все-таки буду пользоваться терминами "зацепление" и "связанность", предполагая, что, когда Вы пишите "связанность", Вы все-таки, на самом деле, имеете в виду "зацепление" (см. выше).


    Не связанность, а связность.

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


    Это слишком примитивный взгляд на проблему. На практике, как всегда, все намного сложнее. Дело в том, что близость той или иной функции к другой вещь большей частью субъективная. Опять же, ровнять под одну гребенку разные ситуации нельзя. Вот к примеру метод Sort вробе бы как, на первый взгляд, неразрывно связан с коллекцией. Но, если мы сделаем его методом коллекции, нам придется реализовывать его в каждой коллекции по новой. Поэтому в данном случае более правильным было бы вынести метод Sort наружу. Тем самым мы уменьшаем сложность контракта IList, и упрощаем его реализацию. Теперь нам не надо реализовывать метод Sort в любой коллекции.
    Совсем уж хорошо эта задача решается на C# 3.0, благодаря наличию в нем extension methods.
    На эту тему есть статья Мейерса.
    http://www.softcraft.ru/coding/sm/sm01.shtml

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


    КЛ>Наоборот, если в компоненту поместить функции, решающие разнотипные задачи, то получится несвязанный код и возникнет очень сильное зацепление. Зацепление будет сильным, т.к. к одной и той же компоненте придется обращаться для решения задач разных классов.


    В общеупотребимых терминах это называется грамотная ОО декомпозиция. Только я то совсем о другом говорил.

    КЛ>Приведу пример. Для того, чтобы создать форму (в программе, а не в редакторе форм


    (*)

    КЛ>) с контролами на ней, нужно выполнить последовательность действий:


    КЛ>

      КЛ>
    1. Создать форму и контролы.
      КЛ>
    2. Правильно структурировать дочерние контролы (т.е. прикрепить дочерние элементы к родительским).
      КЛ>
    3. Правильно расположить контролы на форме и внутри других контролов.
      КЛ>
    4. Отобразить форму и контролы.
      КЛ>
    5. Обрабатывать команды от контролов.
      КЛ>
    6. И т.д. (список далеко не полон).
      КЛ>

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

    КЛ>Такой код обладает низкой связанностью и высоким зацеплением.

    Ты это к чему?

    КЛ>если Вы layout все-таки вынесите в отдельный модуль, но будете хранить свойства, связанные с layout'ом в каждом компоненте (у WolfHound'а они называются добавленными свойствами)


    У WH добавленые свойства храняться в владельце этих свойств, а не в тех, к кому они присоединены. В (*) ты заявил, что речь не идет о дизайнере форм. А теперь сослался на пример WH, который как раз разработан прежде всего для поддержки дизайнера. И присоединенность свойств фигурирует там в дизайнере (и при сериализации). В рантайме никаких присоединенных свойств нет, все работает через штатные типизированные интерфейсы. Т.е. в примере с лейаутами в дизайнере мы будем иметь:
        class:Form
            prop:Id = _form
            prop:Layout = Absolute
            class:Button
                prop:Text = O La La
                prop:Location@_form = 10; 10
                prop:Size@_form = 60; 15

    А то же самое в коде будет таким:
    Form _form = new Form();
    _form.Id = "_form";
    _form.Layout = new AbsoluteLayout();
    Button b = new Button();
    b.Text = "O La La";
    _form.SetLocation(b, new Point(10, 10));
    _form.SetSize(b, new Size(60, 15));

    Идея ясна?

    КЛ>, Вам придется изменять все контролы, как только поменяется формат данных, необходимых для layout'а.


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

    AVK>>Но есть еще и наследование, которое здесь обсуждается. Тут есть одна большая засада — дело в том, что в случае наследования в классических языках под одной крышей смешали две сущности — наследование контрактов и наследование реализаций. Второе имеет весьма опосредованное отношение к обсуждаемому вопросу. Остается наследование контрактов. Его можно использовать двояко — во-первых как некий констрейнт, заставляющий соблюдать базовые контракты при декларации соответствия наследуемому. Во-вторых как средство обеспечения полиморфизма.


    КЛ>Наследование — это инструмент реализации.


    Ты внимательно прочел, что я написал?

    КЛ>А, учитывая, что все применение наследования сводится к вынесению общих атрибутов в базовые классы


    А как же полиморфизм?

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


    Без наследования реализаций или без наследования контрактов?

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


    Нет. Ты опять забыл про полиморфизм.

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


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


    Мда. Вот я тебе честно скажу — я архитектора, который изъясняется подобным образом, сразу бы уволил. Куча текста ни о чем.

    КЛ>Что касается Вашего беспокойства о раздувании контрактов, то у меня никакого раздувания не будет.


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

    КЛ> Потому что контракты определяются не атрибутами, а тем, как используется модуль.


    Бред какой то. Контракты определяются требованиями. Атрибуты и методы это составляющие части ОО-контракта.

    КЛ>Наоборот, люди, которые используют наследования для разнесения атрибутов по разным классам, выносят атрибуты в контракты.


    У тебя опять мешанина между наследованием реализаций и контрактов. Если атрибуты не находятся в публичных контрактах, то вынесение их в базовый класс и наследование этой реализации никоим образом не влияет на публичный контракт. Если же атрибуты изначально находятся в контрактах, то они в контрактах и остаются после выделения базового контракта.
    ... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[32]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 03.06.07 18:33
    Оценка:
    КЛ>>Приведу пример. Для того, чтобы создать форму (в программе, а не в редакторе форм

    AVK>(*) <skip>


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


    Тут Вы не поняли. В (*) я говорил о последовательности операций, которые совершаются при появлении формы. А поскольку термин "создание формы" может использоваться, когда хотят показать процесс создания формы в дизайнере, и когда хотят показать процесс создания формы (окна, диалога) в программе, то я конкретизировал.

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

    Имеется PropertyGrid, который работает со свойствами редактируемого объекта. Необходимо сделать так, чтобы PropertyGrid работал и со свойствами, которые свойствами объекта не являются.

    Тогда бы все стало ясно.

    На остальное отвечу позже.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[33]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.06.07 19:18
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Теперь понял, что для дизайнера.


    И для сериализации в человекочитаемом виде.

    КЛ> Изначально (из первого описания задачи) я представлял, что интерфейсы отвечают за сохранение форм и контролов на них с добавленными свойствами в файлах разных форматах


    И это тоже.

    КЛ>[i]Имеется PropertyGrid


    PropertyGrid тут совсе не причем. То, что ты не можешь абстрагироваться от конкретных контролов при описании задачи не есть гуд.
    ... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[34]: О сопровождении
    От: WolfHound  
    Дата: 03.06.07 19:58
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    КЛ>>Теперь понял, что для дизайнера.

    AVK>И для сериализации в человекочитаемом виде.
    Это частности. Главное это вынесение из контрактов контролов то чего там быть не должно.
    А сериализация с пропертигридом это уже детали реализации и их можно прицепить практически к любой модели.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[35]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 03.06.07 20:12
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>А сериализация с пропертигридом это уже детали реализации и их можно прицепить практически к любой модели.


    Мне вобще непонятна попытка формулировать требования к архитектуре в терминах "шоб в пропертигриде показывалось", да еще вкупе с пространными теоретизированиями о слоях, модулях и идиотах-архитекторах.
    ... << RSDN@Home 1.2.0 alpha rev. 675 on Windows Vista 6.0.6000.0>>
    AVK Blog
    Re[32]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.06.07 13:14
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Не знаю в чьих переводах там упоминается зацепление, но в русскоязычном коммьюнити принят термин связность.

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

    "Термин зацепление взят из структурного проектирования, но в более вольном толковании он используется и в объектно-ориентированном проектировании. Стивенс, Майерс и Константайн определяют зацепление как "степень глубины связей между отдельными модулями. Систему с сильной зависимостью между модулями гораздо сложнее воспринимать и модифицировать. Сложность системы может быть уменьшена путем уменьшения зацепления между отдельными модулями". <...>

    Понятие связности также заимствовано из структурного проектирования. Связность — это степень взаимодействия между элементами отдельного модуля (а для OOD еще и отдельного класса или объекта), характеристика его насыщенности. <...> Наиболее желательной является функциональная связность, при которой все элементы класса или модуля тесно взаимодействую в достижении определенной цели."
    Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на C++, 2-е изд./Пер. с англ. — М.: "Издательство Бином", СПб: "Невский диалект", 1998 г. — с. 139.


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


    AVK>Взгляд будет подкреплен аргументами?

    Да. В предыдущем сообщении я изложил свою точку зрения.

    КЛ>>Т.е. полезно в одной компоненте группировать похожие функции, решающие однотипные задачи.


    AVK>Это слишком примитивный взгляд на проблему. На практике, как всегда, все намного сложнее. Дело в том, что близость той или иной функции к другой вещь большей частью субъективная. Опять же, ровнять под одну гребенку разные ситуации нельзя. Вот к примеру метод Sort вробе бы как, на первый взгляд, неразрывно связан с коллекцией. Но, если мы сделаем его методом коллекции, нам придется реализовывать его в каждой коллекции по новой. Поэтому в данном случае более правильным было бы вынести метод Sort наружу. Тем самым мы уменьшаем сложность контракта IList, и упрощаем его реализацию. Теперь нам не надо реализовывать метод Sort в любой коллекции.


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

    Это означает, что берем все функции сортировки и группируем их в одну компоненту или один модуль Сортировщик, а не размазываем их по коллекциям. Точно также разные алгоритмы позиционирования контролов группируются в иерархию классов layout'ов. Можно привести и массу других примеров.

    КЛ>>Наоборот, если в компоненту поместить функции, решающие разнотипные задачи, то получится несвязанный код и возникнет очень сильное зацепление. Зацепление будет сильным, т.к. к одной и той же компоненте придется обращаться для решения задач разных классов.


    AVK>В общеупотребимых терминах это называется грамотная ОО декомпозиция. Только я то совсем о другом говорил.


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

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

    AVK>В том, о чем говорит WH не придется. А вот в предложенном тобой решении придется, потому что ты вынес все в базовый контракт.


    Вы опять приписываете мне какие-то чужие решения.

    КЛ>>Наследование — это инструмент реализации.


    AVK>Ты внимательно прочел, что я написал?


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

    Запись вида:

    interface A {...};
    interface B : A {...};


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

    КЛ>>А, учитывая, что все применение наследования сводится к вынесению общих атрибутов в базовые классы


    AVK>А как же полиморфизм?


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


    AVK>Без наследования реализаций или без наследования контрактов?


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


    AVK>Нет. Ты опять забыл про полиморфизм.


    Так и полиморфизм тоже близок к реализации. Это лишь удобное средство унифицировать разные сущности языковыми средствами. В языках, которые не поддерживают полиморфизм, группировка осуществляется другими средствами. При этом функциональная модель (или, если хотите, контракт) модуля от этого не поменяется.

    AVK>Мда. Вот я тебе честно скажу — я архитектора, который изъясняется подобным образом, сразу бы уволил. Куча текста ни о чем.


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

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

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

    КЛ>> Потому что контракты определяются не атрибутами, а тем, как используется модуль.


    AVK>Бред какой то. Контракты определяются требованиями. Атрибуты и методы это составляющие части ОО-контракта.


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

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


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

    Например, Ваша иерархия прямоугольников и квадратов из обсуждения про прямоугольник и квадрат, является примером атрибутного подхода. На первый взгляд, все сделано умно и по-науке: есть контракты и есть реализации. Однако во главу группирования Вы поставили атрибуты, даже не поинтересовашись о том, нужны ли они.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[34]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.06.07 13:19
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

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

    Неумение объяснить суть задачи на доступном не для дот-нетчика уровне — гораздо хуже. Это говорит о неспособности абстрагироваться от языка или платформы реализации.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[35]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 04.06.07 13:31
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Это частности. Главное это вынесение из контрактов контролов то чего там быть не должно.

    WH>А сериализация с пропертигридом это уже детали реализации и их можно прицепить практически к любой модели.

    Поверьте, это шаманство. Нужно изъясняться просто и доступно. Конечно, использование новомодных терминов по типу "вынесение из контрактов контролов" звучит круто и впечатляет. Но если мы уберем моднявые словечки и сформулируем суть задачи, которое сводится к доступности добавленных свойств в property grid'е и к сериализации кода инициализации этих свойств, то вся крутость как-то уйдет. И в сухом остатке окажется программерская задача 1-го уровня, которая потому и несложная, потому что .NET предоставляет все практически готовые решения.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[36]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.06.07 13:45
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>И в сухом остатке окажется программерская задача 1-го уровня, которая потому и несложная, потому что .NET предоставляет все практически готовые решения.


    И зачем только МС в WPF понадобилась новая компонентная модель?
    ... << RSDN@Home 1.2.0 alpha rev. 675>>
    AVK Blog
    Re[35]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.06.07 13:45
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Неумение объяснить суть задачи на доступном не для дот-нетчика уровне


    Не_для_дот-нетчик вобще то не знает, что такое PropertyGrid.
    ... << RSDN@Home 1.2.0 alpha rev. 675>>
    AVK Blog
    Re[33]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 04.06.07 15:00
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Значит, Вы не читали книгу Гради Буча, ибо там упоминаются и связность и зацепление:


    Читал. Но в оригинале, а не кривой перевод.
    В Лингво, в компьютерном словаре, имеем такой перевод:

    coupling

    1) связь
    2) соединение
    3) связывание, увязка
    4) связность (модулей системы)


    Кстати, проглядывая русский перевод Буча, наткнулся на замечательную цитату:

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


    AVK>>Взгляд будет подкреплен аргументами?

    КЛ>Да. В предыдущем сообщении я изложил свою точку зрения.

    Аргументов я там не увидел. Одни "я считаю".

    AVK>>Это слишком примитивный взгляд на проблему. На практике, как всегда, все намного сложнее. Дело в том, что близость той или иной функции к другой вещь большей частью субъективная. Опять же, ровнять под одну гребенку разные ситуации нельзя. Вот к примеру метод Sort вробе бы как, на первый взгляд, неразрывно связан с коллекцией. Но, если мы сделаем его методом коллекции, нам придется реализовывать его в каждой коллекции по новой. Поэтому в данном случае более правильным было бы вынести метод Sort наружу. Тем самым мы уменьшаем сложность контракта IList, и упрощаем его реализацию. Теперь нам не надо реализовывать метод Sort в любой коллекции.


    КЛ>Вы, похоже, спорите сами с собой, приписываете мне утверждения, которые я не писал


    Например, в случае объектной модели полезно оценить количество интерфейсов и классов, приходящихся на одну сущность. Чем их больше, тем хуже.


    Не ты писал?

    AVK>>В общеупотребимых терминах это называется грамотная ОО декомпозиция. Только я то совсем о другом говорил.


    КЛ>Термин "грамотная ОО декомпозиция" звучит абстрактно и может использоваться разными собеседниками для обозначения совершенно разных решений разного качества.


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

    AVK>>В том, о чем говорит WH не придется. А вот в предложенном тобой решении придется, потому что ты вынес все в базовый контракт.


    КЛ>Вы опять приписываете мне какие-то чужие решения.


    Топологическая модель может быть представлена структурами:
    Визуальная модель может быть представлена набором таких записей:
    ID.
    Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
    Text.
    Picture.

    Итого — мы имеем в базовом контроле Picture. На что тебе справедливо было замечено, что Picture имеет смысл только для некоторых видов контролов, отнюдь не для всех. В ответ ты написал:

    WH>Да и некоторым контрола не нужны ни картинки ни текст.
    При заполнении эти поля можно оставить пустыми.


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

    AVK>>Ты внимательно прочел, что я написал?


    КЛ>Да, и объяснил, почему наследование интерфейса тоже относится к реализации.


    Ты что то совсем другое объяснил. Куча текста не по теме про какие то высосанные из пальца дурацкие решения и 0 аргументов.

    КЛ> Если Вам непонятно, могу повторить еще раз, но другими словами.


    КЛ>Запись вида:


    КЛ>
    КЛ>interface A {...};
    КЛ>interface B : A {...};
    КЛ>


    КЛ>сделана на языке программирования, т.е. уже при помощи средства, предназначенного для реализации.


    Перепиши на UML. Что изменится? Или UML у тебя тоже реализацию описывает?

    КЛ> При формулировании функциональных требований к компоненте и при написании контракта (т.е. прототипов функций) для компоненты никаких базовых и производных интерфейсов (в C# понимании) не существует.


    Неправда. Внешние полиморфные алгоритмы требуют наследования контракта (если язык не поддерживает duck typing).

    КЛ> Это уж потом проектировщик решает вынести похожие функции в базовый интерфейс.


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

    AVK>>Нет. Ты опять забыл про полиморфизм.


    КЛ>Так и полиморфизм тоже близок к реализации.


    Нет конечно. Это базовое свойство контрактов. На цепочку наследования контрактов полагается внешний по отношению к рассматриваемому коду код. Полиморфизм — базовое понятие в ОО-декомпозиции. Альтернативой ему в реально существующих языках может быть только duck typing.

    КЛ>Давайте не будем переходить на личности и скатываться к неаргументированным оценкам. Поверьте, это от слабости.


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

    КЛ>Про лэйаут я уже объяснял несколько раз. Могу повторить еще раз: и в том, и в другом лэйауте используется прямоугольная сетка. Только в одном из них она состоит из пикселов, а в другом — из ячеек грида.


    В Flow-лейауте сетки нет никакой.

    КЛ> Поэтому для всех прямоугольных "сеточных" лэйаутов такое обобщение может иметь место.


    А для остальных?

    КЛ> И сколько бы прямоугольных "сеточных" лэйаутов ни появилось в будущем, все они уложатся в предложенную модель. Если Вы с этим не согласны, то приведите конкретный пример.


    В WPFном Grid есть возможность для отдельных элементов управления задавать объединение ячеек.

    Обрати внимание на то, как расположен лейбл с надписью. Где будем хранить информацию о таком финте ушами?

    КЛ>>> Потому что контракты определяются не атрибутами, а тем, как используется модуль.


    AVK>>Бред какой то. Контракты определяются требованиями. Атрибуты и методы это составляющие части ОО-контракта.


    КЛ>Вы опять спорите сами с собой.


    Это ты споришь непонятно с кем. Я освещал одну конкретную тему — принцип минимизации сложности контрактов. А ты в ответ успел поговорить обо всем. Ау. Ты не мысли свои спонтанным потоком сюда выливать должен, а общаться по конкретной теме.

    КЛ>Совсем нет — нет никакой мешанины. Наоборот, это Вы уцепились за модный термин "наследование контракта"


    Не знаю, с чего ты взял что это модный термин.

    КЛ> Порочность в случае, о котором пишу я, заключается не в контрактах и реализациях, а в атрибутном подходе.


    Вот, опять. Ну какого черта? О чем ты вобще говоришь? Если тебе о чем то хочется поговорить, это еще не означает, что остальным интересно слушать.

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


    Она является примером явной изоляции контракта и реализации.

    КЛ> На первый взгляд, все сделано умно и по-науке: есть контракты и есть реализации. Однако во главу группирования Вы поставили атрибуты, даже не поинтересовашись о том, нужны ли они.


    Это потому что ты не знаешь всей предыстории. Проблема квадратов и прямоугольников тут обсуждалась неоднократно, и основной парадокс, о который было сломано много копий, заключался в том, что с т.з. реализации квадрат не является наследником прямоугольника, а вот с точки зрения контракта является (речь, разумеется, об immutable классах). Как только мы разделяем два понятия, парадокс сам собой исчезает.
    ... << RSDN@Home 1.2.0 alpha rev. 675>>
    AVK Blog
    Re[36]: О сопровождении
    От: WolfHound  
    Дата: 04.06.07 15:15
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Это частности. Главное это вынесение из контрактов контролов то чего там быть не должно.

    WH>>А сериализация с пропертигридом это уже детали реализации и их можно прицепить практически к любой модели.

    КЛ>Поверьте, это шаманство. Нужно изъясняться просто и доступно. Конечно, использование новомодных терминов по типу "вынесение из контрактов контролов" звучит круто и впечатляет. Но если мы уберем моднявые словечки и сформулируем суть задачи, которое сводится к доступности добавленных свойств в property grid'е и к сериализации кода инициализации этих свойств, то вся крутость как-то уйдет. И в сухом остатке окажется программерская задача 1-го уровня, которая потому и несложная, потому что .NET предоставляет все практически готовые решения.


    Сколько пафоса... вот только толку нет.
    1)Судя по всему ты так и не понял что такое присоедененные свойства и для чего они вобще понадобились.
    2)На механизмы .NET эта задача не ложится. Да механизмы .NET несколько облегчают ее решение но не болие того.
    3)Дался тебе этот проперти-грид. Сегодня он. Завтра что-то другое с другой моделью.
    4).NET сериализация тут вобще работать не будет ибо есть требование десералировать в разнае реализации, а .NET так не умеет. Разве что можно попробовать XMLсериалайзером что-то сделать но и тут мы утыкаемся в отсутствие поддержки присоедененных свойств. Да и про то что сериализовать нужно куда попало тоже забывать не стоит.

    ЗЫ И если уж проводить аналогию с той задачкой про мачты то тут не "Предположим, речное судно снабжено заваливающейся мачтой со стойкой длиной 6 м. На судне установили дополнительное палубное оборудование. Как теперь опускать стойку мачты, если свободного пространства (по горизонтали) осталось всего 3 м?", а "Предположим, речное судно снабжено заваливающейся мачтой со стойкой длиной 6 м. На судне непредсказуемым образом меняется конфигурация дополнительноого палубного оборудования. Как теперь опускать стойку мачты?"
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[35]: О сопровождении
    От: WolfHound  
    Дата: 04.06.07 15:15
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

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

    КЛ>Неумение объяснить суть задачи на доступном не для дот-нетчика уровне — гораздо хуже. Это говорит о неспособности абстрагироваться от языка или платформы реализации.
    Это зацикливание на .НЕТ вобще и проперти-гриде в частности говорит о неспособности абстрагироваться от задачи.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[33]: О сопровождении
    От: WolfHound  
    Дата: 04.06.07 15:15
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

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

    AVK>>Взгляд будет подкреплен аргументами?
    КЛ>Да. В предыдущем сообщении я изложил свою точку зрения.
    Там было много слов. Но вот по сути сказано ничего небыло.
    Так почему же бедные контракты это плохо не ясно.

    AVK>>В том, о чем говорит WH не придется. А вот в предложенном тобой решении придется, потому что ты вынес все в базовый контракт.

    КЛ>Вы опять приписываете мне какие-то чужие решения.
    Нет уж. Тут какраз совершенно точно твое творчество. Ибо твои таблички это и есть базовый, вернее единственный, контракт.

    КЛ>сделана на языке программирования, т.е. уже при помощи средства, предназначенного для реализации.

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

    КЛ>При формулировании функциональных требований к компоненте и при написании контракта (т.е. прототипов функций) для компоненты никаких базовых и производных интерфейсов (в C# понимании) не существует.

    Как не существует? А какже обобщение компонент?
    В статически типизированных языках это можно сделать только выделением общих контрактов.

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

    КЛ>Это уж потом проектировщик решает вынести похожие функции в базовый интерфейс. А объявлять или не объявлять для групп одинаковых функций базовый интерфейс — это уже дело реализации (или очень позднего проектирования).

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

    КЛ>Так и полиморфизм тоже близок к реализации. Это лишь удобное средство унифицировать разные сущности языковыми средствами. В языках, которые не поддерживают полиморфизм, группировка осуществляется другими средствами. При этом функциональная модель (или, если хотите, контракт) модуля от этого не поменяется.

    На языках которые на примую не поддерживают полиморфизм его эмулируют.

    AVK>>Мда. Вот я тебе честно скажу — я архитектора, который изъясняется подобным образом, сразу бы уволил. Куча текста ни о чем.

    КЛ>Давайте не будем переходить на личности и скатываться к неаргументированным оценкам. Поверьте, это от слабости.
    А настойчивое требование проделать работу на пару человекомесяцев (этоя про подробное описание всех граблей скрещевания win с web) это надо пологать от силы?

    КЛ>Про лэйаут я уже объяснял несколько раз. Могу повторить еще раз: и в том, и в другом лэйауте используется прямоугольная сетка. Только в одном из них она состоит из пикселов, а в другом — из ячеек грида. Поэтому для всех прямоугольных "сеточных" лэйаутов такое обобщение может иметь место. И сколько бы прямоугольных "сеточных" лэйаутов ни появилось в будущем, все они уложатся в предложенную модель. Если Вы с этим не согласны, то приведите конкретный пример.

    В том то и дело что сеточных лейаутов может и не появиться. Те совсем.
    Например тотже сплайн-лейаут. Ну ни разу не сеточный.
    Да и лейаут с абсолютным позиционированием не обязын быть сеточным. Те там координаты и размеры могут быть во float'ах.
    Скажем при рендере через DirectX это может быть очень даже востребовано.

    КЛ>Совсем нет — нет никакой мешанины. Наоборот, это Вы уцепились за модный термин "наследование контракта", и за этим термином не видите сути. Порочность в случае, о котором пишу я, заключается не в контрактах и реализациях, а в атрибутном подходе. Если человек берет за основу для классификации атрибуты, то он и наворотит похожим образом, что классы — что интерфейсы.

    Что таблички...

    КЛ>А если при проектировании он навремя забудет про атрибуты и будет плясать от функционала (т.е. от того, как и для чего класс используется), то вопрос о группировке атрибутов отпадет сам собой или станет гораздо менее важным.

    Группировака необходима. Без нее просто не сделать гибкую и расширяемую систему.
    Те она не может быть не важной. Ибо она жизненно важна для дальнейшего развития системы.
    А ели этому не уделять внимание то получится как у тебя... уж, еж, камаз и атомный ледокол свалены в одну кучу.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[2]: О наследовании, иерархиях и проектировании (философск
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 06.06.07 11:12
    Оценка:
    Здравствуйте, borisman3,

    Благодарю Вас за корректный и обстоятельный отзыв!

    Хочу сказать, что о прямой адаптации методов ТРИЗ к области разработке ПО речь не идет. В этом легко убедиться, т.к. в наших с С.В. Сычевым статьях:

    "Как вспомнить "и так известное"
    "Освобождение узников оператора "IF"
    "О потерянном уровне"

    в общей сложности разобрано 14 задач. Еще две сквозные задачи были подготовлены для презентации. Но из-за необходимости ограничить объем выступления была изложена только одна. Таким образом, все выводы делаются только на основе практических примеров. Конечно, найденные закономерности сопоставляются с закономерностями и методами классической ТРИЗ. Но механического переноса нет.

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


    Нет сомнения, что словарь предметной области — вещь полезная, и отказываться от него, думаю, не стоит. Однако использование словаря в качестве основы для проектирования модулей и классов порождает, к сожалению, архитектуры, не устойчивые к изменениям. В этом легко убедиться на примерах, изложенных в книгах по OOA и OOD. В одной из наших статей были разобраны две задачи из книги Гради Буча. На этих примерах были наглядно показаны недостатки объектного (или, если хотите, словарного) подхода. Если на Ваш взгляд, примеры выглядят неубедительно, Вы можете предложить какую-нибудь другую задачу — я готов ее разобрать. Но разбор потребует совместно работы.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[34]: О сопровождении
    От: GlebZ Россия  
    Дата: 07.06.07 07:18
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>>>Это слишком примитивный взгляд на проблему. На практике, как всегда, все намного сложнее. Дело в том, что близость той или иной функции к другой вещь большей частью субъективная. Опять же, ровнять под одну гребенку разные ситуации нельзя. Вот к примеру метод Sort вробе бы как, на первый взгляд, неразрывно связан с коллекцией. Но, если мы сделаем его методом коллекции, нам придется реализовывать его в каждой коллекции по новой. Поэтому в данном случае более правильным было бы вынести метод Sort наружу. Тем самым мы уменьшаем сложность контракта IList, и упрощаем его реализацию. Теперь нам не надо реализовывать метод Sort в любой коллекции.


    КЛ>>Вы, похоже, спорите сами с собой, приписываете мне утверждения, которые я не писал


    AVK>

    Например, в случае объектной модели полезно оценить количество интерфейсов и классов, приходящихся на одну сущность. Чем их больше, тем хуже.


    AVK>Не ты писал?


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

    1. Связность по совпадению. В модуле отсутсвуют явно выраженные внутренние связи.
    2. Логическая связность. Части модуля объединены по принципу функционального подобия. Например, модуль состоит из разных подпрограмм обработки ошибок. При использовании такого модуля клиент выбирает только одну из подпрограмм.
    Недостатки:


    3. Временная связность. Части модуля не связаны, но необходимы в один и тот же период работы системы.
    4. Процедурная связность. Части модуля связаны порядком выполняемых ими действий, реализующих некоторый сценарий поведения.
    5. Коммуникативная связность. Части модуля связаны по данным(работают с одной и той же структурой данных).
    6. Информационная (последовательная) связность. Выходные данные одной части используются как входные данные в другой части модуля.
    7. Функциональная связность. Части модуля вместе реализуют одну функцию.

    (c) С.А. Орлов Технологии разработки программного обеспечения. Разработка сложных программных систем.

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

    Фактически, сверхгранулярность в виде функциональной связности — сильно увеличивает стоимость.

    Однако все это теория. На практике, гранулярность определяется эвристически, без всяких методик, согласно своему опыту. Я вполне допускаю что обойтись без такого
    Автор: FDSC
    Дата: 04.06.07
    объекта нельзя. Но если нужно стремиться к сопровождаемости, то упрощение интерфейсов задача приоритетная.
    Re: О наследовании, иерархиях и проектировании (философское)
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.06.07 13:19
    Оценка:
    По адресу http://www.kriconf.ru/2007/rec/KRI_2007_Programming_08apr_Yupiter_01_Kirill_Lebedev_Evosquare.ogg выложена аудиозапись выступления (13 Мб). Запись можно прослушать WINAMP'ом, который можно скачать здесь.

    В самом начале есть небольшая пауза. Не пугайтесь, это техническая накладка. Нужно чуть-чуть подождать или пропустить — далее запись продолжается.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[34]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.06.07 14:48
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Так почему же бедные контракты это плохо не ясно.

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

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

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

    WH>Нет уж. Тут какраз совершенно точно твое творчество. Ибо твои таблички это и есть базовый, вернее единственный, контракт.

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

    WH>В какой нотации записывать проектные решения значения не имеет.

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

    Для иллюстрации приведу пример-аналог: не смотря на то, что программа компилируется в набор нулей и единиц, глупо проектировать в "нулях" и "единицах" (или даже в ассемблерных командах).

    КЛ>>При формулировании функциональных требований к компоненте и при написании контракта (т.е. прототипов функций) для компоненты никаких базовых и производных интерфейсов (в C# понимании) не существует.

    WH>Как не существует? А какже обобщение компонент?
    WH>В статически типизированных языках это можно сделать только выделением общих контрактов.
    Вы путаете обобщение с наследованием. Наследование — всего лишь удобный инструмент. Например, в C++ при помощи template'ов я могу написать обобщенный алгоритм, который будет работать с разными типами данных. Разумеется, эти типы данных должны поддерживать определенный интерфейс. Но для них совершенно не нужно объявлять базовый абстрактный класс (или interface).

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

    WH>Ты групируешь по принцпу "абы похоже было". Это не верный подход.
    С тем, что такой подход неверен, я согласен. Но практикуете его Вы, а не я. Вы же отстаиваете здесь правильность атрибутного наследования. Да еще и некоторые идеологи ООП во главе с Бучем и Рамбо.

    WH>Нужно групировать не то что похоже, а то что логически принадлежит одной сущьности.

    Что значит "логически принадлежит"? Каковы критерии "логичной принадлежности"?

    WH>На языках которые на примую не поддерживают полиморфизм его эмулируют.

    Вы опять зациклились на полиморфизме. Действительно, его можно эмулировать. Но можно и совсем не использовать. Например, можно написать отдельную реализацию для каждого сеточного layout'а. А можно обойтись и одной реализацией, т.к. по сути дела нет никакой разницы (для алгоритма) между ячейкой-пикселем и ячейкой грида.

    WH>А настойчивое требование проделать работу на пару человекомесяцев (этоя про подробное описание всех граблей скрещевания win с web) это надо пологать от силы?

    Не думаю, что составление списка из двух-трех проблем займет пару человекомесяцев. Полагаю, что эта работа на 10 — 15 минут для человека, который с этими проблемами уже сталкивался и их как-то решал.

    WH>В том то и дело что сеточных лейаутов может и не появиться. Те совсем.

    WH>Например тотже сплайн-лейаут. Ну ни разу не сеточный.
    WH>Да и лейаут с абсолютным позиционированием не обязын быть сеточным. Те там координаты и размеры могут быть во float'ах.
    WH>Скажем при рендере через DirectX это может быть очень даже востребовано.
    Но я-то говорю о сеточных лэйаутах. Хотя, при желании, и все остальные лэйауты можно свести к одному виду. Тут главное — не лениться и не возмущаться, что все лэйауты — разные, и что их невозможно скрестить.

    WH>Группировака необходима. Без нее просто не сделать гибкую и расширяемую систему.

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

    Сравните две модели:

    Модель-1. Программист мыслит: "Вот есть объект. У объекта есть такой и такой атрибуты. Вот — другой объект. У него тоже есть атрибуты. Некоторые атрибуты объекта-1 и объекта-2 совпадают. Значит вынесу-ка я их базовый класс. И т.д."

    Модель-2. Программист мыслит: "Согласно спецификации программа должна помогать пользователю решать такие-то и такие-то задачи. Для решения задачи-1 нужно выполнить такой-то набор действий. Для решения задачи-2 нужно выполнить другой набор действий. Эти действия можно распределить по группам. Одна группа отвечает за такой набор функций, другая — за другой, третья — за третий. Каждую группу можно представить в виде отдельной подсистемы, отдельного модуля или класса. Эта подсистема должна поддерживать такой-то интерфейс. Подсистеме передаются на вход такие-то и сякие-то объекты. Чтобы упростить реализацию подсистемы, эти объекты должны поддерживать одинаковый интерфейс. Если объектов немного и времени мало, унифицируем объекты при помощи полиморфизма. Если объектов много, то пытаемся унифицировать их не только на уровне интерфейса, но и на уровне реализации, как с сеточными layout'ами".

    Мне кажется, что модель-2 гораздо продуктивнее.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[34]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.06.07 15:26
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Твое?

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

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

    WH>Вот скажи зачем edit'у картинка?

    А зачем edit'у список дочерних окон? Или почему окну без заголовка можно установить caption? И еще много "почему" можно задать по поводу Win32.

    Тем не менее, Win32 API стал стандартом и достаточно долго использовался разработчиками прикладных программ.

    WH>Все я понял. Ибо у тебя там нет ничего кроме грубейших ошибок проектирования которые я просто обхожу на автопилоте. И объяснил почему эта модель не жизнесопособна. Жаль что ты ничего не понял... болие мне нечего сказать.

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

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

    КЛ>>Просто непонятно, что Вы с этими свойствами делаете. Присоединяете ли Вы их лишь виртуально — только для того, чтобы они отображались в property grid вместе с другими свойствами контрола? Или Вы их каким-то образом динамически добавляете к другим свойствам контрола и, фактически, генерируете новый код? Или эти добавленные свойства сохраняются в XML вместе с другими свойствами контрола(т.е. "добавленные свойства" добавляются только для сохранения или только для сохранения и отображения в property grid).

    WH>Еще раз это все детали реализации. Это мелочи которые могут менятся как угодно.
    Это не детали реализации. Это все относится к сути задачи и к спецификации, которую Вы, как технический специалист, должны уметь писать.

    WH>Главное это то что в контрактах контролов остается только то что там должно быть и ничего больше.

    Контракты — это уже результат проектирования. Контракты нужны для решения задачи. В условиях, когда задача не определена и не поставлена, бесполезно обсуждать правильность или неправимльность, полезность или бесполезность того или иного контракта.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[35]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 20.06.07 16:32
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:


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

    И в том и в другом. Точнее так, чем богаче контракт, тем больше вероятность того, что в одном классе смешали разнородные функции.
    Чем богаче контракт — тем сильнее связность, это азбука. Нам что, хором тебя в этом убеждать?
    Не веришь нам, почитай классиков:

    ...
    We've now seen that a reasonable way to gauge the amount of encapsulation in a class is to count the number of functions that might be broken if the class's implementation changes. That being the case, it becomes clear that a class with n member functions is more encapsulated than a class with n+1 member functions.

    Scott Meyers

    Если класс имеет много функций-членов, которые не обязаны быть членами, но тем не менее являются таковыми (таким образом обес-
    печивается излишняя видимость закрытой реализации) [читай — "богатый" контракт, прим. мое], то закрытые члены-данные класса становятся почти столь же плохими с точки зрения дизайна, как и открытые переменные.
    Функции, не являющиеся членами или друзьями классов, повышают степень инкапсуляции путем снижения зависимостей: тело такой функции не может зависеть от закрытых и защищенных членов класса. Они также разрушают монолитность классов, снижая связность, и повышают степень обобщенности....

    Саттер, Александреску.

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

    Опять все смешалось...
    Алгоритм сортировки — это реализация, она не может быть частью этого контракта. Логика простая: шире контракт => больше методов придется менять при изменении реализации => большая связность. Эта логика работает всегда, как правило буравчика.
    Допустим у нас есть огромный класс с десятком различных реализаций сортировки: При появлении нового метода нам придется менять существующий класс, вместо того, чтобы написать еще одну реализацию в новом классе => больше вероятность сломать существующий код. Очень высокая вероятность того, что один алгоритм неявно завяжется на другой (приватные данные общие) => при изменении одной реализации мы сломаем другую, ect...
    Так что там в плюс?

    КЛ>Мне кажется, что модель-2 гораздо продуктивнее.

    Обе уродские.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Мы уже победили, просто это еще не так заметно...
    Re[35]: О сопровождении
    От: WolfHound  
    Дата: 20.06.07 18:15
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Это относится к реализации, а не к интерфейсу.

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

    КЛ>И продемонстрировано лишь для иллюстрации.

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

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

    Интерфейс простите чего?

    КЛ>Собственно, об этом я уже писал выше не один раз. Но Вы продолжаете повторять одно и то же, как заклинание, не обращая внимание на мои слова. То ли не понимаете, то ли считаете, что от пустого повторения станет очевиднее Ваша правота.

    Тебе я могу сказать тоже самое.

    КЛ>А зачем edit'у список дочерних окон? Или почему окну без заголовка можно установить caption? И еще много "почему" можно задать по поводу Win32.

    Ссылка на авторитеты. Причем весьма сомнительные.
    С демагогией в другой форум пожалуста.

    КЛ>Тем не менее, Win32 API стал стандартом и достаточно долго использовался разработчиками прикладных программ.

    Он еще долго будет использоваться.
    Только к делу это отношение не имеет.
    Кстати сам мелкософт признал ущербность окнной системы виндов.

    КЛ>Вы поете дифирамбы себе и продолжаете бездоказательно утверждать, что у меня там где-то есть "грубейшие ошибки". Между тем, от того, что Вы повторите словосочетание "грубейшие ошибки" сотню раз, грубейшие ошибки не обнаружатся. И обычный повтор не снимет с Вас бремя доказательства Вашего тезиса.

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

    КЛ>Кроме того, обратите внимание, что Вы так по-человечески и не описали Вашу задачу — так, чтобы программист, не программирующий на .NET, мог ее понять.

    А причем тут вобще .НЕТ?
    Это всеголишь одна из возможных платформ для реализации.

    КЛ>От конкретизации Вы уклоняетесь, ссылаясь на абстрагирование. От описания конкретных проблем скрещивания Win с Web тоже уклоняетесь, ссылаясь на месяцы работы.

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

    WH>>Еще раз это все детали реализации. Это мелочи которые могут менятся как угодно.

    КЛ>Это не детали реализации. Это все относится к сути задачи и к спецификации, которую Вы, как технический специалист, должны уметь писать.
    Кому должен?

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

    Или ты про описание собственно деталей реализации чтобы другие могли разобраться?

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

    Это все правильно только не отменяет того факта что чем сильнее формализованы контракты тем лучше было проведено проектирование.
    А у тебя формализация равна нулю.
    ID.
    Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
    Text.
    Picture.

    Ибо это никакия не формализация, а сплошное шаманство.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[36]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.06.07 18:40
    Оценка:
    Здравствуйте, IB, Вы писали:

    IB>We've now seen that a reasonable way to gauge the amount of encapsulation in a class is to count the number of functions that might be broken if the class's implementation changes. That being the case, it becomes clear that a class with n member functions is more encapsulated than a class with n+1 member functions.

    IB>[/q]
    IB>Scott Meyers

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

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

    IB>[q]

    IB>Если класс имеет много функций-членов, которые не обязаны быть членами, но тем не менее являются таковыми (таким образом обес-
    IB>печивается излишняя видимость закрытой реализации) [читай — "богатый" контракт, прим. мое], то закрытые члены-данные класса становятся почти столь же плохими с точки зрения дизайна, как и открытые переменные.

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

    IB>Опять все смешалось...

    Что смешалось? Разве алгоритм сортировки не может быть указан в качестве параметра? Почему? Хочет пользователь отсортировать массив quicksort'ом — указывает один параметр, а хочет отсортировать пузырьком — указывает другой параметр. В чем Вы видите проблему?

    IB>Алгоритм сортировки — это реализация, она не может быть частью этого контракта. Логика простая: шире контракт => больше методов придется менять при изменении реализации => большая связность. Эта логика работает всегда, как правило буравчика.


    Вы хотели написать, что тем выше "зацепление"? Это не так. Если Вы обратитесь к источникам, которые я приводил выше (Гради Буч, Тимати Бадд), то увидите, что зацепление характеризует зависимость между модулями, а не между интерфейсом (контрактом) и его реализацией. Поэтому количество функций в контракте не играет никакой роли. Страшно изменение не реализации, а интерфейса: сколько модулей придется изменить при изменении интерфейса? Очевидно, что таких модулей будет тем больше, чем больше разнородных функций выполняет изменяемый модуль. Хотя бы потому, что к этому модулю обращаются совсем по разным поводам.

    IB>Допустим у нас есть огромный класс с десятком различных реализаций сортировки: При появлении нового метода нам придется менять существующий класс, вместо того, чтобы написать еще одну реализацию в новом классе => больше вероятность сломать существующий код. Очень высокая вероятность того, что один алгоритм неявно завяжется на другой (приватные данные общие) => при изменении одной реализации мы сломаем другую, ect...

    IB>Так что там в плюс?
    Никакого не вижу плюса. Но почему Вы решили, будто я советую поместить все функции сортировки в отдельный класс? Модуль — это не только класс (во всяком случаее, в C++). Если Вы проследите за сообщениями, то увидите, что я сторонник отделения того, что сортируют от того, чем сортируют. Т.е. есть различные коллекции, а есть сортирвщики, которые эти коллекции сортируют. При этом, необходимо, чтобы все коллекции поддерживали бы единый интерфейс для сортировки.

    КЛ>>Мне кажется, что модель-2 гораздо продуктивнее.

    IB>Обе уродские.
    А аргументы? Поверьте, банальное шапкозакидательство без аргументации на профессиональном форуме для инженеров как-то не катит.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[36]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 20.06.07 19:12
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Интерфейс без реализаци не стоит ничего.

    Странно слышать это от человека, который ратует за абстрагирование.

    WH>За такие иллюстрации увольняют сразу.

    WH>Болие того если ты у меня на собеседовании человек с опытом предложит подобную реализацию то собеседование на этом будет окончено со словами: "Извините вы нам не подходите." + Занесение в черный список кандидатов до скончания времен.
    WH>Причем в случае с зеленым студентом еще можно подумать и позадовать вопросы быть может он это сморозил просто по неопытности и его можно относительно быстро переучить.
    WH>Но если человек во время своей практики не понял к чему приводит такое то тут уже ничего не поможет.

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

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

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

    Например, если на вопрос: "С какими задачами Вы сталкивались при унификации win и web forms?" Кандидат отвечает: "Это сложная задача. На описание потребуется 2 человекомесяца", то мы сразу с ним прощаемся. Потому что велика вероятность, что он шаманит. Т.е. профессионализм Кандидата проверяется на сложных и кропотливых задачах. При этом важно не столько правильность решения, сколько подход к выполнению работы и терпение.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[37]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 02:43
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Интерфейс без реализаци не стоит ничего.

    КЛ>Странно слышать это от человека, который ратует за абстрагирование.
    А все остальное как всегда проигнорировал.
    Я даже не удивлен.

    КЛ>А у нас в компании на собеседовании принят иной подход. Если я с решением не согласен, но человек — может его обосновать, то почему бы и нет? Даже если он ошибается, видно, что человек думает и не ленится работать. В том числе, приучен решать сложные задачи.

    Так ты же не можешь...

    КЛ>В конце-концов, научить такого человека другому подходу — дело времени, при чем совсем небольшого.

    А... ну-ну...

    КЛ>Это гораздо дешевле, чем искать "звезду"

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

    КЛ>или брать на работу человека, который умеет говорить "правильные" слова в соответствии с ООП-книгами, но не может решить конкретной задачи.

    Это ты про себя?
    Ведь это ты заладил про нарушение LSP в совершенно простом и безграбельном коде.
    А если ты посмотришь не то как пишут компиляторы на нормальных языках то у тебя волосы дыбом встанут ибо там такие нарушения происходят в массовом колличестве.
    И это не только не приводит к проблемам но и позволяет значительно упростить и удешивить разработку. Раз эдак в 10 относительно С++...

    КЛ>Например, если на вопрос: "С какими задачами Вы сталкивались при унификации win и web forms?" Кандидат отвечает: "Это сложная задача. На описание потребуется 2 человекомесяца", то мы сразу с ним прощаемся. Потому что велика вероятность, что он шаманит. Т.е. профессионализм Кандидата проверяется на сложных и кропотливых задачах. При этом важно не столько правильность решения, сколько подход к выполнению работы и терпение.

    А я тебе сразу сказал с чем столкнулся. Главная засада из которой прямо или косвенно растут все остальные это фундаментально разные принципы работы этих платформ. Любой спец знакомый в общих чертах с win и web (а тех кто совсем не знаком пожалуй нет) легко выведет кучу очевидных проблем (о них я тоже говорил). Ну еще не нужно забывать про кучу не очевидных заботливо раскиданных меокософтом, w3c и производителями браузеров.
    Вот только ты счел это слишкм абстрактным и стал требовать деталей.
    А их в этой задачи столько что...
    Причем парой деталей от тебя не отделаться. Ибо ты тут же предложешь решение которое учитывает только эти детали. Надеюсь не нужно объяснять почему это не приемлемо.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[38]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.06.07 08:44
    Оценка:
    Здравствуйте, IB,

    Относительно терминов

    Мне несложно повторить еще раз: в русскоязычной технической литературе приняты термины зацепление и связность.

    Цитата-1:

    "Двумя важными понятиями при разработке программ являются зацепление (coupling) и связность (cohesion). Связность — это мера того, насколько отдельная компонента образует логически законченную, осмысленную единицу. Высокая связность достигается объединением в одной компоненте соотносящихся (в том или ином смысле) друг с другом функций. <...>

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


    Тимоти Бадд. Объектно-ориентированное программирование в действии / Пер. с англ. — СПб.: Питер, 1997. — с. 61 — 62.

    Цитата-2:

    "Термин зацепление взят из структурного проектирования, но в более вольном толковании он используется и в объектно-ориентированном проектировании. Стивенс, Майерс и Константайн определяют зацепление как "степень глубины связей между отдельными модулями. Систему с сильной зависимостью между модулями гораздо сложнее воспринимать и модифицировать. Сложность системы может быть уменьшена путем уменьшения зацепления между отдельными модулями". <...>

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


    Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на C++, 2-е изд./Пер. с англ. — М.: "Издательство Бином", СПб: "Невский диалект", 1998 г. — с. 139.

    IB>Если ты обратишься к любым, вменяемым источникам, включая того же Буча или тем, что я приводил выше, и дашь себе труд прочитать их внимательно, то станет очевидно, что связность нифига не зависит от того чем ты оперируешь, модулями ли, классами, пространствами имен, сборками или еще чем... Это более фундаментальное понятие, которое характеризуется лишь числом вносимых изменений в компоненты системы при изменении реализации одной из компонент.


    Из цитаты-2 следует: зацепление характеризуется как "степень глубины связей между отдельными модулями. Систему с сильной зависимостью между модулями гораздо сложнее воспринимать и модифицировать. Сложность системы может быть уменьшена путем уменьшения зацепления между отдельными модулями"
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[38]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.06.07 09:13
    Оценка:
    Здравствуйте, IB, Вы писали:

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


    Степень "бедности" контракта — это подсистемный критерий. Его можно использовать, но в ряде случаев (причем довольно значительном) он будет показывать неверный результат. Т.к. "бедность" может быть обусловлена совершенно разными причинами. Например, когда-то давно я был знаком с программистом, который любил экспортировать из DLL'и только одну функцию с именем DoAll() и без параметров. Контракт, как Вы понимаете бедный. И поэтому он начисто лишает вызывающую сторону какой-либо возможности по управлению выполняемой операции.

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

    КЛ>> При этом, необходимо, чтобы все коллекции поддерживали бы единый интерфейс для сортировки.

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

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

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


    Это отмазка, попытка психологического давления и явный уход от ответа на вопрос.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[39]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 21.06.07 09:23
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Мне несложно повторить еще раз:

    Можешь не повторяться, в русскоязычной профессиональной литературе coupling = "связность" (cohension = "сродство").

    КЛ>Тимоти Бадд. Объектно-ориентированное программирование в действии / Пер. с англ. — СПб.: Питер, 1997. — с. 61 — 62.

    Выкини этот перевод.

    КЛ>Гради Буч. Объектно-ориентированный анализ и проектирование с примерами приложений на C++, 2-е изд./Пер. с англ. — М.: "Издательство Бином", СПб: "Невский диалект", 1998 г. — с. 139.

    И этот перевод тоже выкини, вообще, привыкай оригиналы читать, меньше непоняток будет.
    За "Питерские" переводы вообще стрелять надо, достаточно вспомнить как они GoF перевели.

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

    Герб Саттер, Андрей Александреску. Стандарты программирования на C++. 101 правило и рекомендация. Серия C++ In-Depth, – М.: “Вильямс”, 2005. – 224 с.

    КЛ>Из цитаты-2 следует: зацепление характеризуется как "степень глубины связей между отдельными модулями. Систему с сильной зависимостью между модулями гораздо сложнее воспринимать и модифицировать. Сложность системы может быть уменьшена путем уменьшения зацепления между отдельными модулями"

    Угу, осталось разобраться, что же там переводчик имел ввиду под "модулями" и что такое "степень глубины связей"? Ась?
    Перевожу — "степень глубины связей" (заметь связей, а не зацеплений, что так же говорит о качестве перевода), характеризуется количеством изменений, которые надо проделать в системе, при модификации одного "модуля".
    (с) Меерс.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Мы уже победили, просто это еще не так заметно...
    Re[39]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 21.06.07 09:42
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Степень "бедности" контракта — это подсистемный критерий.

    Он не подсистемный и не надсистемный — он объективный.

    КЛ>Его можно использовать, но в ряде случаев (причем довольно значительном) он будет показывать неверный результат.

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

    КЛ> Т.к. "бедность" может быть обусловлена совершенно разными причинами.

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

    КЛ>Когда Вы говорите о "бедности" контракта модуля, Вы как-то забываете, что модуль создается ради того, чтобы оказывать сервис.

    Никто об этом не забывает, не меняй тему разговора...

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

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

    КЛ>С чего это Вы сделали такой вывод?

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

    КЛ> Есть один метод сортировки на входе, который, в зависимости от параметра, вызывает уже конкретную реализацию. Соответственно, метод реализации конкретного алгоритма сортировки не знает о других методах.

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

    КЛ>Но можно поступить и по-другому: есть несколько методов сортировки, в названии которых "зашито" и название алгоритма. Пользователь вызывает любой из них.

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

    КЛ>Это отмазка, попытка психологического давления и явный уход от ответа на вопрос.

    Никакого ухода, я вполне четко аргументировал свою фразу..
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Мы уже победили, просто это еще не так заметно...
    Re[39]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 09:58
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Так там нечего комментировать. Вы просто взяли силлогизм и неправильно перевернули его — типичная логическая ошибка.

    Я там все что нужно написал.
    И ничего не перевертывал.
    Про переворачивания это ты придумал.

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

    И это факт медицинский.
    Ибо хорошо формализованные интерфейсы очень сильно ограничивают вольности реализации. И это хорошо. Ибо излишняя свобода выбора увеличивает поле для ошибок.
    Для того чтобы сделать твое решение на моих интерфейсах придется столько с бубном попрыгать что даже самый упертый любитель табличек забъет и напишет все на классах. (Или уволится... это пожалуй лучшее что он может сделать...)
    Да классы он може написать отвратно. НО того ужоса что у тебя не получится.

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

    WH>>Вот только ты счел это слишкм абстрактным и стал требовать деталей.

    WH>>А их в этой задачи столько что...
    КЛ>Зачем перечислять все проблемы? Конкретизируйте 2 — 3.
    Болие подробное описание любого из пунктов потянет на книгу или по крайней мере на статью.

    1)Принципиально разные модели UI. Те вобще ничего общего кроме того что и то и другое UI.
    Книга по win GUI запросто тянет на болие 1000 страниц.
    С книгой по web таже фигня.

    2)Несовместимость браузеров.
    Нужно перевернуть инте в верх дном чтобы узнать в каком браузе ре и как работет.

    3)Различные принципы кеширования.
    Если в случае с win клиентом даже если он тонкий можно кешировать на клиенте что-попало то в случае с web такие фокусы не пройдут.

    4)Различные методы обеспечения безопасности.
    В случае с win клиентом можно прекрутить любой протокол.
    В случае с web колличество решений резко сокращается.

    5)Различные методы обеспечения быстродействия.
    В случае с win события от пользователя доходят мнгновенно.
    В случае с web обращение к серверу может достигать секунд. Для UI это неприемлемые задержки.
    Те нам нужно кучу всего навернуть на жаба скрипт.

    6)Различные методы валидации пользовательского ввода.
    Если в случае с толстым win клиентом мы можем все валидировать на клиенте. То в случае с тонким и темболие web (ибо жабаскрипты могут быть отключены) мы должны повторить все проверки на сервере.

    7)Различные методы поддержки сессий.
    Проблема с web в том что пользователь может сохранить урлик...
    Да и кластеризация сервера добавляет своих тараканов...

    ...
    Да там вобще практически ничего общего нет.

    При этом прикладники должны написать логику ровно один раз. Никаких завязок ни на web ни на win ни тем болие на конкретный браузер.
    Прикладникам это знать не нужно. Их работа формочки клепать, а не разбираться почему ГУИ тормозит.

    Те модель системы должна быть такой чтобы можно было все это сгенерить.
    Единственный способ это сделать создать модель не завязаную ни на web ни на win.

    Задача очень большого объема и требует серьезных объемов работ и исследований.
    И чтобы на таких задачах вобще чегото добиться нужно уметь отсекать целые классы решений.
    Один из приемов отсекания различного мусора это какраз формализация контрактов.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[38]: О сопровождении
    От: Сергей Туленцев Россия http://software.tulentsev.com
    Дата: 21.06.07 10:27
    Оценка:
    Здравствуйте, IB, Вы писали:

    IB>Здравствуйте, Кирилл Лебедев, Вы писали:



    КЛ>> При этом, необходимо, чтобы все коллекции поддерживали бы единый интерфейс для сортировки.

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

    Это ты, видимо, чего-то недопонял. Кажется, он хотел сказать что-то вроде этого
    public interface ISorter[T]
    {
        Sort(collection : IList[T], comparer : IComparer[T]) : void
    }
    
    public class MergeSort[T] : ISorter[T]
    {}
    
    public class BubbleSort[T] : ISorter[T]
    {}
    
    public interface IMySortableCollection[T] : IList[T]
    {
        Sort(sorter : ISorter[T]) : void;
    }
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    --
    Re[35]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 11:01
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Кроме того, обратите внимание, что Вы так по-человечески и не описали Вашу задачу — так, чтобы программист, не программирующий на .NET, мог ее понять. От конкретизации Вы уклоняетесь, ссылаясь на абстрагирование. От описания конкретных проблем скрещивания Win с Web тоже уклоняетесь, ссылаясь на месяцы работы.


    Кирилл, вы с WolfHound-ом говорите об ортогональных задачах. WolfHound — о построении компонентной инфраструктуры. Ты — о редакторе самом по себе. Справедливости ради, замечу, что WolfHound вполне понятно объяснил, что к чему, просто он опустил некоторые моменты, очевидные для тех, кто плотно занимался подобными задачами. Его интерфейсы решают задачу, которую можно примерно сформулировать так: предоставить описание свойств объектов (или что там — компоненты, модули...) в рамках определённых соглашений. Ну, наприимер, нужно явно "сказать": является свойство "сбрасываемым" или нет.

    Вся же прикладная конкретика (конкретные системы координат, конкретные наборы свойств и прочее) обслуживается самими компонентами. В известном смысле, работа с такими компонентами похожа на использование void*, вернее — на CBaseObject* с последующим приведением к производному типу. Например, перед использованием такого компонента нужно пройтись по его свойствам, проверить наличие тех или иных свойств и их типов, а в случае .Net, вполне вероятно — сгенерировать соответствующие обёртки через Reflection/Emit. По-моему, WolfHound об этом тоже упоминал.

    WH>>Главное это то что в контрактах контролов остается только то что там должно быть и ничего больше.

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

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



    2 WolfHound сотоварищи: Вообще, ребята, за вами прикольно наблюдать. Как только почуяли, что оппонент играет не на вашем поле, так разве что дураком не обозвали.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[36]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 11:06
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>2 WolfHound сотоварищи: Вообще, ребята, за вами прикольно наблюдать. Как только почуяли, что оппонент играет не на вашем поле, так разве что дураком не обозвали.

    Ты на его "решение" посмотри.
    И лично я очень сильно сомневаюсь что на других задачах будет другой результат.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[38]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 11:57
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

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

    Просто сам факт использования таких структур говорит о многом.
    ID.
    Type (button, listbox, combobox, checkbox, radiobutton, edit и т.д.).
    Text.
    Picture.

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

    Я бы понял если бы он создал нормальный дизайн пусть не учитывая то о чем я не сказал. Но он изобразил редкостного уродца.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[37]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 13:00
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Основное требование а компоненте это связывание во время работы программы.

    WH>>Есдинственный способ связать что-то с чем-то в сатически типизированном языке это интерфейсы.

    КЛ>Разве эти интерфейсы относятся к компонентам?


    Ключевое слово: "описание структуры данных". Глянь сюда
    Автор: Геннадий Васильев
    Дата: 21.06.07
    .
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[37]: Ой
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 13:18
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Пожалуй, соглашусь с мнением Геннадия Васильева и сочту [...]


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

    ГВ>Заменяем button на GUID0, combobox на GUID1 и т.п. Теперь даже сам Байт не сможет сказать, что модель привязана к конкретным типам контролов. Ну а то, что где-то просто обязан храниться идентификатор типа конкретного контрола, надеюсь, и так понятно.

    Ответь на простой вопрос: Зачем edit'у картинка?
    У Кирилла не получилось. Может у тебя как его адвоката получится?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[41]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 14:08
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Заменяем button на GUID0, combobox на GUID1 и т.п. Теперь даже сам Байт не сможет сказать, что модель привязана к конкретным типам контролов. Ну а то, что где-то просто обязан храниться идентификатор типа конкретного контрола, надеюсь, и так понятно.

    WH>Ответь на простой вопрос: Зачем edit'у картинка?
    WH>У Кирилла не получилось. Может у тебя как его адвоката получится?

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

    Однако, конструктивного обсуждения пока не состоялось. Кстати, я проголосовал за отделение ветки.

    А теперь ответь на мой вопрос: почему IAttachedXXXXX, а не контейнер attached-элементов?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[42]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 14:32
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Однако, конструктивного обсуждения пока не состоялось.

    А его и не могло получиться ибо для этого Кириллу пришлось бы признать полную не состоятельность его концепции...

    ГВ>Кстати, я проголосовал за отделение ветки.

    Нет смысла.

    ГВ>А теперь ответь на мой вопрос: почему IAttachedXXXXX, а не контейнер attached-элементов?

    А это как?
    Обрати внимание что у IProperty
    object GetValue(object instance);

    и у IAttachedProperty
    object GetValue(object owner, object instance);

    разные сигнатуры методов.

    И ничего ты с этим не сделаешь.
    Засовывать метаданные в объект нельзя ибо это разные сущьности.

    Да и чем тебе эти интерфейсы помешали?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[38]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.06.07 14:37
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Они относятся к их метаданным.

    Это — шаманское заклинание! Оно никак не проясняет обязанности каждого конкретного интерфейса. Корректный ответ на вопрос должен строиться по такой схеме:

    1. Обязанностью интерфейса IElementBase является...
    2. Обязанностью интерфейса IEventBase является...
    3. И т.д. — для каждого интерфейса.

    КЛ>>Никакого динамического связывания тут не надо — Вы ведь сами писали, что у Вас имеется только одна их реализация.

    WH>А завтра будет 2. Так всегда бывает.

    А зачем? Почему может появиться вторая реализация? Сколько может появиться таких реализаций вообще? Одна? Две? Три? Тридацать три?

    Почему Вы решаете задачу, которой нет, а вот задачу унификации IProperty и IAttachedProperty и IEvent и IAttachedEvent, которая реально существует и актуальна, Вы не решаете? Подумать только, на том основании, что в методах IAttachedProperty на один параметр больше, Вы вместо одного интерфейса создали два? А если в дальнейшем потребуется ввести еще один параметр — создадите еще один интерфейс?

    Зачем без необходимости плодить сущности?

    КЛ>>А суть проблемы в том, что Вы наплодили 10 интерфейсов и еще 5 классов для их реализации. И к тому же не можете внятно объяснить, какой интерфейс за что у Вас отвечает.

    WH>А может просто ты не можешь понять?
    Тут уж несколько раз говорили: если читатель не понимает, то виноват автор — значит автор не смог объяснить.

    WH>Интерфейсы просты как пробка.

    WH>Каждый из них отвесает за свой кусок функционала.
    Я не возвражаю. Просто почему-то Вы этот функционал скрываете. И у двух пар интерфейсов этот функционал совпадает.

    WH>А тебе не приходила в голову мысль что ты просто не можешь понять о чем я говорю?

    Вы уклонились от ответов на ряд ключевых вопросов, которые нужны для понимания. Что же Вы после этого хотите?

    WH>А о том что я просто знаю больше методов структуирования системы?

    Честно говоря, я в этом сомневаюсь. В течение дискуссии Вы продемонстрировали:

    1. Неспособность грамотно и понятно отвечать на вопросы собеседника, которые нужны для правильной постановки задачи.
    2. Множество способов ухода от ответов на эти вопросы: путем ссылки на то, что это займет много времени, что собеседник туп и не понимает и т.д.
    3. Различные нечестные приемы, чтобы переспорить собеседника, к числу которых можно отнести: постановку себя в позицию судьи или начальника, проводящего собеседование, неправильное обращение силлогизмов, бесконечный повтор эмоциональных и уничижительных оценок меня и моего решения без обоснования, оценка драфта решения по тем же критериям, по которым оценивается окончательное (релизное) решение и многое-многое другое.

    Порядочные люди и грамотные специалисты так не поступают.

    WH>А тебе не приходил в голову вариант что:

    WH>1)Я понимаю все что написано в презинтации.
    WH>2)Я понимаю ущербность такого подхода.
    WH>Ы?

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

    WH>Начиная с разлисных хитровывернутых лейаутов (типа такого http://www.codeproject.com/WPF/Panels.asp ) заканчивая возможностью перейти на устройства с большим разрешением.

    WH>И вобще сейчас придет McSeem2 и раскажет про линию толщиной в 1.3 пикселя.
    Вы не ответили ни на один вопрос по лэйаутам. Это не способствует прояснению и постановке задачи. В конце-концов, откуда я знаю, что лично Вы или .NET понимаете под лэйаутом. У меня при этом может быть совсем другое понимание, которое почерпнуто из опыта программирования под Win32 API. О каком решении задачи может идти речь, когда Вы, быть может, понимаете одно, а я — другое?

    WH>А тебе не кажется что тут проблема может быть не во мне, а в тебе?

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

    WH>Твои на то чтобы сею секунду налабать абы как и чтобы както работало... до первого изменения...


    WH>Пока что все что тут было разбито в пух и прах это твои таблички...

    Естественно. Ведь Вы описали одну задачу, а решение оценивали с точки зрения другой задачи — нехитрый прием для людей, которые не способны честно и предметно вести разговор.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[39]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 14:49
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Не знаю, как Кириллу, а мне приходит в голову, что ты не можешь толком по-человечески объяснить то, что сделал.

    Это читал?
    Re[19]: ...продолжение
    Автор: WolfHound
    Дата: 23.05.07


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

    Я комбинирую множество различных стилей. Ибо разные задачи требуют разных решений.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[39]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 21.06.07 14:51
    Оценка:
    WH>>Пока что все что тут было разбито в пух и прах это твои таблички...
    КЛ>Естественно. Ведь Вы описали одну задачу, а решение оценивали с точки зрения другой задачи — нехитрый прием для людей, которые не способны честно и предметно вести разговор.

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

    1. Каковы обязанности каждого интерфейса из приведенных десяти? В том числе, меня интересует интерфейс IType. О нем Вы почти ничего не писали.
    2. Почему Вы решили отделить IProperty от IAttachedProperty? Насколько различается реализация этих интерфейсов?
    3. Как используются приведенные Вами интерфейсы? Они где-то хранятся? В какой-то коллекции? Что это за коллекция? Или это чисто хэлперы для сериализации?
    4. Что Вы понимаете под лэйаутами? Почему Вы считаете грид-лэйаут сильно отличающимся от position layout? Как эти лэйауты работают? Не могли бы привести примеры?
    5. Как используется spline layout? В каких ситуациях выгодно использование именно этого layout'а?
    6. Какой интерфейс поддерживают лэйауты? В чем принципиальная разница между реализациями этого интерфейса для absolute position layout и spline layout? В чем там разница, кроме выравнивания по прямой и выравнивания по сплайну?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[43]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 15:19
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Однако, конструктивного обсуждения пока не состоялось.

    WH>А его и не могло получиться ибо для этого Кириллу пришлось бы признать полную не состоятельность его концепции...

    ГВ>>Кстати, я проголосовал за отделение ветки.

    WH>Нет смысла.
    Я проголосовал — "за".

    ГВ>>А теперь ответь на мой вопрос: почему IAttachedXXXXX, а не контейнер attached-элементов?

    WH>А это как?
    WH>Обрати внимание что у IProperty
    WH>
    WH>object GetValue(object instance);
    WH>

    WH>и у IAttachedProperty
    WH>
    WH>object GetValue(object owner, object instance);
    WH>

    WH>разные сигнатуры методов.

    WH>И ничего ты с этим не сделаешь.

    WH>Засовывать метаданные в объект нельзя ибо это разные сущьности.

    Ну, перебираешь же ты их где-то? Не на воздусех же они висят?

    Да и вообще — параметры owner и instance можно было бы замкнуть в самих экземплярах. Тогда сразу упростились бы и остальные интерфейсы. Примерно так:

        public interface IProperty : IPropertyBase
        {
            object GetValue();
            void SetValue(object value);
            void AddValueChanged(EventHandler handler);
            void RemoveValueChanged(EventHandler handler);
            bool CanResetValue();
            void ResetValue();
            bool ShouldSerializeValue();
        }
    
        public interface INativeProperty : IElementBase
        {
          IProperty RequestProperty(object instance);
        }
    
        public interface IAttachedProperty : IElementBase
        {
          IProperty RequestProperty(object owner, object instance);
        }


    Аналогично, ИМХО, стоило бы поступить и с IxxxxxEvent-интерфесами.

    Обрати внимание, что здесь IProperty — это уже просто свойство, которое скрывает экземпляр и владельца. Кроме того, названия INativeProperty и IAttachedProperty содержат характеристику метода дальнейшей работы с экземпляром IProperty.

    Кстати, почему CanRead/CanWrite не продублированы по отношению к экземпляру-носителю свойства? У тебя не бывает такого, что какой-то элемент объявляется read-only в процессе редактирвоания?

    WH>Да и чем тебе эти интерфейсы помешали?


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

    ГВ>>Не знаю, как Кириллу, а мне приходит в голову, что ты не можешь толком по-человечески объяснить то, что сделал.

    WH>Это читал?
    WH>Re[19]: ...продолжение
    Автор: WolfHound
    Дата: 23.05.07


    Естественно. Тебя потом переспросили о самой задаче (а не о подходе к её решению, каковым являются "собственные и присоединённые свойства") и понеслась... Короче говоря, извини, но общее впечатление всё равно именно таково, как я о нём написал.

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

    WH>Я комбинирую множество различных стилей. Ибо разные задачи требуют разных решений.

    Так как же называется "метод структурирования системы"?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[39]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 15:46
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Они относятся к их метаданным.

    КЛ>Это — шаманское заклинание! Оно никак не проясняет обязанности каждого конкретного интерфейса. Корректный ответ на вопрос должен строиться по такой схеме:
    Интерфейсы IProperty, IEvent, IAttachedProperty, IAttachedEvent являются описателями конкретных элементов объекта.
    Их обязанности предоставлять обощенный доступ к конкретным элементам объекта.
    Интерфейсы IElementBase, IEventBase, IPropertyBase, IAttachedElement, IElement отвечают за обобщенную работу с группами элементов объекта.

    КЛ>А зачем? Почему может появиться вторая реализация? Сколько может появиться таких реализаций вообще? Одна? Две? Три? Тридацать три?

    Сколько угодно.
    Таковы реалии.
    И чем болие библиотечный код тем больше вероятность того что будут нужны альтернативные реализаци.
    В данном случае у нас весьма фундаментальная система.
    Скажем если я захочу написать контрол на немерле то есть вероятность близкая к 1 что метаданные и кучу деталий реализации будут генерить макросы.
    И иметь интерфейсы в данном случае необходимо ибо иначе мне придется удалять гланды через зад автогеном.

    КЛ>Почему Вы решаете задачу, которой нет, а вот задачу унификации IProperty и IAttachedProperty и IEvent и IAttachedEvent, которая реально существует и актуальна, Вы не решаете? Подумать только, на том основании, что в методах IAttachedProperty на один параметр больше, Вы вместо одного интерфейса создали два?

    Нет. Я их не объеденяю на основании того что это разные сущьности.
    А вот откуда взялась необходимость их объеденения это вопрос к тебе.

    КЛ>А если в дальнейшем потребуется ввести еще один параметр — создадите еще один интерфейс?

    А зачем?
    Давай конкретно.
    Что еще нужно добавить в модель метаданных?

    КЛ>Зачем без необходимости плодить сущности?

    Зачем сливать в одну сущьность различные сущьности?

    WH>>А может просто ты не можешь понять?

    КЛ>Тут уж несколько раз говорили: если читатель не понимает, то виноват автор — значит автор не смог объяснить.
    Правда? Очень интересная теория. Только к жизни отношения не имеет.

    КЛ>Я не возвражаю. Просто почему-то Вы этот функционал скрываете.

    Не скрываю.
    Я уже несколько раз говорил что к чему.

    КЛ>И у двух пар интерфейсов этот функционал совпадает.

    Не совпадает.

    КЛ>Вы уклонились от ответов на ряд ключевых вопросов, которые нужны для понимания. Что же Вы после этого хотите?

    Каких?

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

    Это ты про вопросы типа: Перечисли проблемы интеграции win с web?

    КЛ>В таком случае Вы должно быть воююете сразу на два фронта: и со мной, и с классиками ООП. Мне ведь было сказано, что я не сказал ничего нового, и что все это описано у классиков ООП.

    Авторитеты не имеют значения.
    Лишь конкретные идеи имеют значение.

    КЛ>Вы не ответили ни на один вопрос по лэйаутам.

    Да я только и делаю что отвечаю.
    А то что ты изобрел и зациклился на сеточных лейаутах (которых есть всего один) это ИМХО не моя проблема.

    КЛ>Это не способствует прояснению и постановке задачи. В конце-концов, откуда я знаю, что лично Вы или .NET понимаете под лэйаутом.

    Я тебе уже 100 раз говорил.
    Это объект который отвечает за расположение и размер контролов.

    КЛ>У меня при этом может быть совсем другое понимание, которое почерпнуто из опыта программирования под Win32 API.

    В WinAPI есть всего один убогий лейаут.

    WH>>Пока что все что тут было разбито в пух и прах это твои таблички...

    КЛ>Естественно. Ведь Вы описали одну задачу, а решение оценивали с точки зрения другой задачи — нехитрый прием для людей, которые не способны честно и предметно вести разговор.
    Я оценивал то что оценивал.
    Я оценил конкретное решение.
    Если бы твое решние не рассыпалось при малейшей критеке я бы уточнил детали.
    Но я увидил решение которое является образцом ужасной архитектуры. И я не верю в то что один и тот же человек будет по разному проектировать прототипы и законченные решения.
    Ибо оно не выдерживает никаких изменений.
    Там полностью отсутствует инкапсуляция.
    Те все контролы видят внутренности всех контролов.
    К нему невозможно подключать контролы без модификации кода. Те Вася Пупкин не сможет написать свой контрол.
    ...
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[44]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 16:02
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Ну, перебираешь же ты их где-то? Не на воздусех же они висят?

    Получаю по System.Type объект IType, беру из него коллекцию интересующих меня элементов и вперед.

    ГВ>Да и вообще — параметры owner и instance можно было бы замкнуть в самих экземплярах. Тогда сразу упростились бы и остальные интерфейсы. Примерно так:

    1) Нет имеет смысла.
    2) Ты в серьез на каждый объект предлагаешь создать еще десяток? Причем совершенно на пустом месте.

    ГВ>Кстати, почему CanRead/CanWrite не продублированы по отношению к экземпляру-носителю свойства? У тебя не бывает такого, что какой-то элемент объявляется read-only в процессе редактирвоания?

    Такой функциональности нет и в .NET'ных свойствах...

    WH>>Да и чем тебе эти интерфейсы помешали?

    ГВ>Пышностью.
    Очень конструктивно
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[44]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 21.06.07 16:06
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Да и вообще — параметры owner и instance можно было бы замкнуть в самих экземплярах.


    Нельзя. В таком раскладе вместо сравнительно небольшого и кешируемого дерева метаданных придется на каждую форму строить их развесистое дерево. Вобщем, тот самый случай, когда state лучше вынести наружу.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[45]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 16:19
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Да и вообще — параметры owner и instance можно было бы замкнуть в самих экземплярах. Тогда сразу упростились бы и остальные интерфейсы. Примерно так:

    WH>1) Нет имеет смысла.

    Упрощается клиенсткий код, ИМХО.

    WH>2) Ты в серьез на каждый объект предлагаешь создать еще десяток? Причем совершенно на пустом месте.


    Почему на пустом месте? В данном случае интерфейсы INative/IAttached отвечают только за "работу" объекта в контейнере и за создание экземпляра, реализующего IProperty для работы с конкретными объектами.

    ГВ>>Кстати, почему CanRead/CanWrite не продублированы по отношению к экземпляру-носителю свойства? У тебя не бывает такого, что какой-то элемент объявляется read-only в процессе редактирвоания?

    WH>Такой функциональности нет и в .NET'ных свойствах...

    Ну мы же не .Net-ные свойства обсуждем, верно?

    WH>>>Да и чем тебе эти интерфейсы помешали?

    ГВ>>Пышностью.
    WH>Очень конструктивно

    Это эстетический критерий, под которым лежат вполне реальные основания: зачем вводить дополнительный параметр во все методы интерфейса, когда его можно упрятать внутрь, в реализацию? А заодно упростить унифицированную обработку значений свойств.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[45]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 16:43
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

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


    ГВ>>Да и вообще — параметры owner и instance можно было бы замкнуть в самих экземплярах.


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


    Возможно. Хотя, ИМХО, экземпляры можно создавать непосредственно перед использованием. Да и, собственно, никто не мешает реализовать свойства примерно так:

    public class NativePropertyImpl : IAttachedProperty, IProperty {...}
    public class NativePropertyImpl : INativeProperty, IProperty {...}


    Тогда и накладные расходы на перезапрос интерфейса IProperty будут минимальными. В любом случае, пользователю хорошо известно, с каким объектом он собирается работать — Native или Attached.

    С другой стороны, stateless-дизайн можно ещё оправдать тем, что ситуация с выполнением многочисленных одинаковых операций для свойств разных объектов (например, SetValue для всех контролов) встречается чаще, чем вызов разных методов для одного объекта (например, последовательность CanReset/Reset/GetValue или что-то в этом роде). Но я бы тут подумал, что в конечном итоге лучше — быстро создавать объект или передавать один-два дополнительных параметра.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[46]: Отбой
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 16:46
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>
    ГВ>public class AttachedPropertyImpl : IAttachedProperty, IProperty {...}
    ГВ>public class NativePropertyImpl : INativeProperty, IProperty {...}
    ГВ>


    Что-то я зарапортовался малость. Нельзя их так реализовывать. Соответственно, снизить накладные расходы тоже не получится.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[40]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 16:54
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>1)Каковы обязанности каждого интерфейса из приведенных десяти? В том числе, меня интересует интерфейс IType. О нем Вы почти ничего не писали.

    IType — Описатель типа. Хранит коолекцию элементов. И коллекцию базовых типов.
    IDomain — Хранит отображение System.Type в IType. Необходим для работы с разными реализациями. Например win и web.

    Интерфейсы IProperty, IEvent, IAttachedProperty, IAttachedEvent являются описателями конкретных элементов объекта.
    Их обязанности предоставлять обощенный доступ к конкретным элементам объекта.
    Интерфейсы IElementBase, IEventBase, IPropertyBase, IAttachedElement, IElement отвечают за обобщенную работу с группами элементов объекта.

    КЛ>2)Почему Вы решили отделить IProperty от IAttachedProperty? Насколько различается реализация этих интерфейсов?

    По тому что это различные сущьности.
    IProperty — Собственное свойство объекта.
    IAttachedProperty — Свойство которое данный объект прицепляет к другому.
    С событиями аналогично.

    КЛ>3)Как используются приведенные Вами интерфейсы? Они где-то хранятся? В какой-то коллекции? Что это за коллекция? Или это чисто хэлперы для сериализации?

    См пункт 1

    КЛ>4)Что Вы понимаете под лэйаутами?

    Объект который отвечает за положение, размер и ориентацию вложеных объектов.

    КЛ>Почему Вы считаете грид-лэйаут сильно отличающимся от position layout? Как эти лэйауты работают? Не могли бы привести примеры?

    Во первых: это разные лейауты. А мешать теплое с мягким нельзя.
    Во вторых: сейчас есть вполне логичная тенденция отказываться от привязки к пикселям. Те все новые системы ГУМ используют плавующею точку. Мелкософт в своем WPF использует double.

    КЛ>5)Как используется spline layout? В каких ситуациях выгодно использование именно этого layout'а?

    Например если пользователь захочет расположить картинки вдоль какойто кривой.
    Как вариант можно еще сюда посмотреть http://www.codeproject.com/WPF/Panels.asp тут же можно посмотреть на один из вариантов обсчета лейаутов.
    Вобще можно придумать много разных лейаутов.

    КЛ>6)Какой интерфейс поддерживают лэйауты?

    interface IControlContainer
    {
        IControlCollection Controls { get; }
    }


    КЛ>В чем принципиальная разница между реализациями этого интерфейса для absolute position layout и spline layout?

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

    КЛ>В чем там разница, кроме выравнивания по прямой и выравнивания по сплайну?

    position layout — не занимается выравниванием. Он четко забивает позицию и размеры.

    ЗЫ Не пользуйся тегом list его не удобно комментировать.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[46]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 17:04
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Упрощается клиенсткий код, ИМХО.

    Ни разу не упрощается.
    К тому же клиенты этой модели сериалайзеры и дизайнеры.

    ГВ>Почему на пустом месте? В данном случае интерфейсы INative/IAttached отвечают только за "работу" объекта в контейнере и за создание экземпляра, реализующего IProperty для работы с конкретными объектами.

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

    ГВ>Ну мы же не .Net-ные свойства обсуждем, верно?

    Всеравно не вижу смысла.

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

    И превратить stateless в statefull?
    Ты уверен что оно того стоит?

    ГВ>А заодно упростить унифицированную обработку значений свойств.

    Не упростит.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[47]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 17:11
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Упрощается клиенсткий код, ИМХО.

    WH>Ни разу не упрощается.
    WH>К тому же клиенты этой модели сериалайзеры и дизайнеры.

    Можно пару-тройку сценариев их работы?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[48]: О сопровождении
    От: WolfHound  
    Дата: 21.06.07 17:44
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    WH>>Ни разу не упрощается.

    WH>>К тому же клиенты этой модели сериалайзеры и дизайнеры.
    ГВ>Можно пару-тройку сценариев их работы?
    Обрати внимание на этот интерфейс:
        public interface IAttachedElement : IElementBase
        {
            bool Recursive { get; }
            bool CanAttach(object owner, object instance);
        }

    При клике на контрол в дизайнере мы генерируем дескрипторы для PropertyGrid'а
    Проходимся по всем собственным элементам объекта.
    Потом по присоедененным элементам предка. Игнорируя свойство Recursive и проверяя CanAttach.
    Потом по присоедененным элементам деда, прадеда... попроверяя Recursive и CanAttach.

    Если забиндить owner'а (до создания конкретного дескриптора для PropertyGrid'а) мы потеряем доступ к данной информации. Либо нам придется вводить костыль в описатель свойства/события.

    Короче кривь получается.
    Так что от Attached'ов никуда не деться.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[49]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 21.06.07 19:53
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Можно пару-тройку сценариев их работы?

    WH>Обрати внимание на этот интерфейс:
    WH>
    WH>    public interface IAttachedElement : IElementBase
    WH>    {
    WH>        bool Recursive { get; }
    WH>        bool CanAttach(object owner, object instance);
    WH>    }
    WH>

    WH>При клике на контрол в дизайнере мы генерируем дескрипторы для PropertyGrid'а

    Значит, дескрипторы свойств держатся не постоянно? Интересно.

    WH>Проходимся по всем собственным элементам объекта.

    WH>Потом по присоедененным элементам предка. Игнорируя свойство Recursive и проверяя CanAttach.
    WH>Потом по присоедененным элементам деда, прадеда... попроверяя Recursive и CanAttach.

    А Recursive что означает? Перевод названия мне не нужен, разумеется.

    И ещё вопросы.

    Это алгоритм чего конкретно? Что получается на выходе? Описатель + конкретное значение свойства конкретного контрола? Почему игнорируется Recursive? Зачем выполнять CanAttach и что служит вторым аргументом CanAttach в данном случае?

    WH>Если забиндить owner'а (до создания конкретного дескриптора для PropertyGrid'а) мы потеряем доступ к данной информации. Либо нам придется вводить костыль в описатель свойства/события.


    Для CanAttach два аргумента оправданы (ИМХО).

    WH>Короче кривь получается.

    WH>Так что от Attached'ов никуда не деться.

    Я пока не призывал куда-то деваться от attached-ов самих по себе.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[46]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 22.06.07 08:41
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Возможно. Хотя, ИМХО, экземпляры можно создавать непосредственно перед использованием.


    Можно. Но алгоритмы диайнера и сериализатора таковы, что это создаст очень серьезный оверхед. Количество контролов, помноженное на количество свойств, помноженное на количество attached свойств, помноженное на количество проходов даст очень неслабую цифру.

    ГВ>Тогда и накладные расходы на перезапрос интерфейса IProperty будут минимальными. В любом случае, пользователю хорошо известно, с каким объектом он собирается работать — Native или Attached.


    Не всегда.

    ГВ>С другой стороны, stateless-дизайн можно ещё оправдать тем, что ситуация с выполнением многочисленных одинаковых операций для свойств разных объектов (например, SetValue для всех контролов) встречается чаще, чем вызов разных методов для одного объекта (например, последовательность CanReset/Reset/GetValue или что-то в этом роде). Но я бы тут подумал, что в конечном итоге лучше — быстро создавать объект или передавать один-два дополнительных параметра.


    Вариантов решения проблемы хватает. Сейчас, к примеру, owner передается в любом случае, просто для обычного свойства он игнорируется. Можно еще визитор использовать. Если в языке есть pattern matching, то можно использовать его. Вобще, в реальном проекте все намного сложнее и хитрее, но смысла это все описывать здесь нет.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[41]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 22.06.07 09:38
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>IType — Описатель типа. Хранит коолекцию элементов. И коллекцию базовых типов.

    Т.е. его задача — хранить все эти properties, events, attached events и attached properties? Так?

    WH>IDomain — Хранит отображение System.Type в IType.

    Его задача — возвращать IType по System.Type?

    WH>Необходим для работы с разными реализациями. Например win и web.

    Он инкапсулирует различия между win и web? Какие?

    WH>Интерфейсы IProperty, IEvent, IAttachedProperty, IAttachedEvent являются описателями конкретных элементов объекта.

    WH>Их обязанности предоставлять обощенный доступ к конкретным элементам объекта.
    WH>Интерфейсы IElementBase, IEventBase, IPropertyBase, IAttachedElement, IElement отвечают за обобщенную работу с группами элементов объекта.

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

    Поясню на примере.

    Ваши интерфейсы базовых элементов выглядят так:

    public interface IElementBase
    {
        string Name { get; }
        IType Owner { get; }
    }
    
    public interface IEventBase : IElementBase
    {
        IType EventHandlerType { get; }
    }
    
    public interface IPropertyBase : IElementBase
    {
        IType PropertyType { get; }
        bool CanRead { get; }
        bool CanWrite { get; }
    }


    В интерфейсах IEventBase и IPropertyBase объявляется свойство, которое возвращает IType (показано жирным). Если этим свойствам дать одинаковые имена, то три интерфейса можно склеить:

    public interface IElementBase
    {
        string Name { get; }
        IType Owner { get; }
        IType ElementType { get; }
        bool CanRead { get; }
        bool CanWrite { get; }
    }


    Понимаю, что свойства CanRead и CanWrite для события не нужны. Но если бы они и были, то всегда возвращали бы true. Поэтому ничего страшного не случится, если они будут определены и для события тоже — вернее, для IElementBase, который у нас заменит сразу три интерфейса.

    КЛ>>2)Почему Вы решили отделить IProperty от IAttachedProperty? Насколько различается реализация этих интерфейсов?

    WH>По тому что это различные сущьности.

    А все-таки: насколько отличается реализация интерфейсов IProperty и IAttachedProperty?
    А также — насколько сильно различается код использования этих интерфейсов?

    WH>IProperty — Собственное свойство объекта.

    WH>IAttachedProperty — Свойство которое данный объект прицепляет к другому.
    WH>С событиями аналогично.

    А нельзя ли обойтись вообще без прикрепленных свойств? Пусть добавленные свойства будут видны в property grid, но храниться и обрабатываться они будут где-нибудь в другом месте.

    КЛ>>Почему Вы считаете грид-лэйаут сильно отличающимся от position layout? Как эти лэйауты работают? Не могли бы привести примеры?

    WH>Во первых: это разные лейауты. А мешать теплое с мягким нельзя.
    WH>Во вторых: сейчас есть вполне логичная тенденция отказываться от привязки к пикселям. Те все новые системы ГУМ используют плавующею точку. Мелкософт в своем WPF использует double.

    Это не ответы. Интересует другое — насколько сильно будет отличаться алгоритм расположения элементов в grid'е от алгоритма расположения элементов

    WH>Как вариант можно еще сюда посмотреть http://www.codeproject.com/WPF/Panels.asp тут же можно посмотреть на один из вариантов обсчета лейаутов.

    Спасибо, посмотрю.

    КЛ>>6)Какой интерфейс поддерживают лэйауты?

    WH>
    WH>interface IControlContainer
    WH>{
    WH>    IControlCollection Controls { get; }
    WH>}
    WH>

    Не, я имел в виду — какой контракт у самого лэйаута?

    КЛ>>В чем принципиальная разница между реализациями этого интерфейса для absolute position layout и spline layout?

    WH>Этого ни в чем. В принципе при реализации (интерфейс никто не отменял) тут даже можно воспользоваться наследованием (реализации) чтобы не дублировать код, а можно и не воспользоваться... в этом и есть прелесть интерфейсов.
    WH>Но у них есть свои интерфейсы.
    WH>position layout — содержит присоедененные свойства для задания позиции и размеров.
    WH>spline layout — содержит коллекцию опорных точек сплайна.
    Т.е. все различие — во внутренних данных?

    WH>ЗЫ Не пользуйся тегом list его не удобно комментировать.

    Хорошо.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[40]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 22.06.07 12:54
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Нет. Я их не объеденяю на основании того что это разные сущьности.

    WH>А вот откуда взялась необходимость их объеденения это вопрос к тебе.

    Если механизм работы с IProperty и IAttachedProperty одинаков (т.е. алгоритм один и тот же, только параметры — разные), то в объединении есть смысл, чтобы убрать дублирование кода.

    Если вдобавок и реализация методов IProperty и IAttachedProperty похожая, то объединение тоже будет полезно, т.к. устранит дублирование кода.

    КЛ>>Зачем без необходимости плодить сущности?

    WH>Зачем сливать в одну сущьность различные сущьности?

    Разные сущности или одинаковые — это определяется отнюдь не их названиями, а тем — одинаково или по-разному мы с ними работаем.

    КЛ>>И у двух пар интерфейсов этот функционал совпадает.

    WH>Не совпадает.
    Почему? Названия функций одинаковые. Только в IAttachedXXXXX добавляется дополнительный параметр.

    WH>Я оценивал то что оценивал.

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

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

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

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

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

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

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

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

    Поясню свою мысль на примере.

    Предположим, в GUI системе необходимо иметь такие контролы:

    1) Обычный listbox.
    2) Check listbox.
    3) Listbox с картинкой.
    4) Check listbox с картинкой.

    В последнем случае существуют разные варианты расположения маркера (checkbox'а), текста и картинки. Например:

    1) Маркер — Картинка — Текст
    2) Маркер — Текст — Картинка
    3) Картинка — Текст — Маркер
    4) И т.д.

    Как реализовывать эти контролы?

    Если придерживаться строго компонентного подхода, то каждый из этих контролов представляет собой отдельную сущность, которая реализуется в отдельной компоненте. Но тогда мы получим 4 компоненты с дублированием кода! Ведь помимо различий в тексте и картинках, у всех этих listbox'ов есть много общего: позиционирование элементов, скроллирование, механизм выделения элементов и многое-многое другое. Все это будет продублировано!

    Можно немного отступить от компонентного подхода, и реализовать все 4 листбокса в виде одной компоненты. Но тогда у этой компоненты будет жирный интерфейс (например, как в виндах для того же листбокса — он может быть малтиселект или синглселект, он может располагать строки в порядке добавления или сортировать их). К тому же нет никакой гарантии, что в дальнейшем не потребуется check listbox с картинкой с порядком расположения:

    5) Текст — Картинка — Маркер
    6) Текст — Маркер — Картинка
    7) И т.д.

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

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

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

    В предложенном мною эскизе выделены такие типовые операции (для формы):

    1) Структурирование (упорядочение элементов формы по принципу "родитель — ребенок").
    2) Визуализация.
    3) Упорядочение (расположение дочерних элементов внутри области родителя).
    4) Обработка событий.

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

    WH>Ибо оно не выдерживает никаких изменений.

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

    WH>Там полностью отсутствует инкапсуляция.

    Это не так. Только инкапсуляцию нужно оценивать не относительно контролов/компонент, а относительно типовых операций. Т.е. алгоритмы и данные для типовой операции "Структурирование" не пересекаются с данными и алгоритмами типовой операции "Визуализация".

    WH>Те все контролы видят внутренности всех контролов.

    В предложенном мною подходе нет никаких контролов, которые можно рассматривать в виде компонент. Контрол (как сущность) существует для пользователя. В конвейерной системе компонентами являются типовые операции. И все данные, используемые для типовой операции, инкапсулированы в этой типовой операции.

    WH>К нему невозможно подключать контролы без модификации кода. Те Вася Пупкин не сможет написать свой контрол.

    Если контрол стандартен, то его можно будет добавить вообще без написания кода — как комбинацию типовых элементов и типовых операций. Если контрол нестандартен, то стоит ли оно того? Если стоит, то в лучшем случае придется поменять отдельные элементы конвейера, а в худшем — модифицировать конвейер (например, добавить одну-другую типовую операцию и один-другой стандартный элемент). При этом остальные типовые операции не будут затронуты. Т.е. переделывать то, что уже написано, не придется. И нет никакого дублирования кода.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[41]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 22.06.07 13:21
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Если придерживаться строго компонентного подхода, то каждый из этих контролов представляет собой отдельную сущность


    Совершенно не обязательно.

    КЛ>, которая реализуется в отдельной компоненте. Но тогда мы получим 4 компоненты с дублированием кода! Ведь помимо различий в тексте и картинках, у всех этих listbox'ов есть много общего: позиционирование элементов, скроллирование, механизм выделения элементов и многое-многое другое. Все это будет продублировано!


    Можешь поглядеть на ItemsControl и data templates в WPF — там и дублирования нет, и с компонентностью все в порядке, и реюз кода такой, что тебе и не снилось.

    КЛ>Можно немного отступить от компонентного подхода, и реализовать все 4 листбокса в виде одной компоненты. Но тогда у этой компоненты будет жирный интерфейс


    Не только жирный, но и дурацкий, содержащий свойства, которые будут значимы тольео при определенном типе. И компонентность тут совсе не при чем.

    КЛ>или с двумя картинками. Компонентный подход посоветует создать новый listbox


    Это только твое неверное понимание КОП такое может посоветовать.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[41]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 22.06.07 13:41
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>?

    Это ты привел пример раздутого контракта, который кому-то может быть удобен?
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Мы уже победили, просто это еще не так заметно...
    Re[42]: О сопровождении
    От: WolfHound  
    Дата: 22.06.07 14:29
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Необходим для работы с разными реализациями. Например win и web.

    КЛ>Он инкапсулирует различия между win и web? Какие?
    Есть два экземпляра класса реализующего IDomain. В одном лежит реализация для win в другом для web.
    В общем случае таких экземпляров может быть сколько угодно.

    КЛ>А нужно ли проводить различия между элементами объекта/класса? Т.е. я понимаю, что свойство или событие может быть элементом класса. Но для чего нам нужно отличать одно от другого?

    Гм... Не понял.

    КЛ>В интерфейсах IEventBase и IPropertyBase объявляется свойство, которое возвращает IType (показано жирным). Если этим свойствам дать одинаковые имена, то три интерфейса можно склеить:

    Это разные типы. То что их описатели реализуют IType ничего не значит.

    КЛ>Понимаю, что свойства CanRead и CanWrite для события не нужны. Но если бы они и были, то всегда возвращали бы true. Поэтому ничего страшного не случится, если они будут определены и для события тоже — вернее, для IElementBase, который у нас заменит сразу три интерфейса.

    Это криво.

    КЛ>А все-таки: насколько отличается реализация интерфейсов IProperty и IAttachedProperty?

    КЛ>А также — насколько сильно различается код использования этих интерфейсов?
    Одному нужен 1 объект второму 2.

    КЛ>А нельзя ли обойтись вообще без прикрепленных свойств?

    Нельзя.

    КЛ>Пусть добавленные свойства будут видны в property grid, но храниться и обрабатываться они будут где-нибудь в другом месте.

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

    КЛ>Это не ответы. Интересует другое — насколько сильно будет отличаться алгоритм расположения элементов в grid'е от алгоритма расположения элементов

    Практически ничего общего.
    В случае position layout просто тупое масштабирование и сдвиг.
    В случае с grid'ом могут быть строки/колонки размеры которых зависят от размеров контролов лежащих в гриде.
    В случае со сплайном нам нужно расположить контролы вдоль некоторой кривой. Причем чтобы это хорошо выглядило в общем случае придется поплясать с бубном.

    КЛ>Не, я имел в виду — какой контракт у самого лэйаута?

    Это в общем то он и есть.
    Ничего другого абстрактному лейауту не нужно.

    WH>>position layout — содержит присоедененные свойства для задания позиции и размеров.

    WH>>spline layout — содержит коллекцию опорных точек сплайна.
    КЛ>Т.е. все различие — во внутренних данных?
    Не только.
    Алгоритмы тоже очень разные.

    Есдинственное что нужно протащить это логику расчетов размеров, положения и ориентации контролов.
    Но эта логика не относится к модели собственно контролов.
    Она относится к реализации.
    Причем у разных реализаций она разная.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[41]: О сопровождении
    От: WolfHound  
    Дата: 22.06.07 17:40
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

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

    Проблема в том что конвеерное производство в программировании работает очень плохо.
    Ибо если появляется что-то что можно производить конвеерным способом то есть 99.9999999% вероятность что это автоматизируется.
    А если что-то можно автоматизировать то это должно быть автоматизировано.

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

    В этом случае можно создавать составные контролы, DSL'и, биндинги итп
    После чего клепать по 20 формочек в день.

    КЛ>Именно поэтому у Вас возникло впечатление, что архитектура разъезжается. Я ведь не анализировал все типовые контролы. Этого, на мой взгляд, и не требовалось. Суть примера заключалась в другом — продемонстрировать подход к решению и дать наметки решения. Справедливости ради следует сказать, что и Вы в постановке задачи тоже отказались приводить конкретные примеры и варианты контролов и ограничились только кнопкой.

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

    КЛ>Если же составить список типовых контролов (полагаю, что в различных проектах он может содержать от десяти до тридцати-сорока позиций), то вероятность возникновения ситуации, при которой архитектура "разъезжается", крайне низка. Ну а если и появится какой-нибудь нестандартный контрол, то что с того? В условиях конвейерного производства проще и дешевле найти для него стандартный аналог, т.е. тот, что укладывается в конвейер.

    Меня не интересуют вероятности. (С) Red Queen из фильма Resident Evil

    КЛ>Если придерживаться строго компонентного подхода, то каждый из этих контролов представляет собой отдельную сущность, которая реализуется в отдельной компоненте. Но тогда мы получим 4 компоненты с дублированием кода! Ведь помимо различий в тексте и картинках, у всех этих listbox'ов есть много общего: позиционирование элементов, скроллирование, механизм выделения элементов и многое-многое другое. Все это будет продублировано!


    КЛ>Можно немного отступить от компонентного подхода, и реализовать все 4 листбокса в виде одной компоненты. Но тогда у этой компоненты будет жирный интерфейс (например, как в виндах для того же листбокса — он может быть малтиселект или синглселект, он может располагать строки в порядке добавления или сортировать их). К тому же нет никакой гарантии, что в дальнейшем не потребуется check listbox с картинкой с порядком расположения:

    Все ясно.
    Ты просто не понимаешь принципов построения слабосвязанных компонентных архитектур.
    В этом случае будут созданы:
    1)VirtualTreeGrid
    2)MultistateButton
    3)Label
    4)Image
    Все остальное будет скомбинированно так как нам захечется.
    Причем в этой схеме я могу сделать так чтобы внутри ListBox'а был другой ListBox.

    Например у нас есть список людей. У каждого есть ФИО, фото и список телефонов.
    class PhoneNumber
    {
        public Number : string { get; }
        public Description : string { get; }
    }
    class Person
    {
        public FirstName : string { get; }
        public LastName : string { get; }
        public Photo : Image { get; }
        public PhoneNumbers : IList[PhoneNumber] { get; }
    }


    Нам нужно это отобразить.
    Для этого создается DSL.
    Языки типа немерле для этого подходят идеально.
    view PhoneNumberListView
    type collection[PhoneNumber]
    control VirtualTreeGrid
    {// тут переопределяем свойства контрола
        ReadOnly = true;
        IsTreeView = false;
        ShowColumnCaptions = false;
    }
    
    view PersonListView
    type collection[Person]
    control VirtualTreeGrid
    {
        ReadOnly = true;
        IsTreeView = false;
        ShowColumnCaptions = true;
        Columns
        {
            Column
            {
                [LocalizeKey]
                Name = FirstName;
                localize(Caption);
                AllowSort = true;
            }
            Column
            {
                [LocalizeKey]
                Name = LastName;
                localize(Caption);
                AllowSort = true;
            }
            Column
            {
                [LocalizeKey]
                Name = Photo;
                localize(Caption);
            }
            Column
            {
                [LocalizeKey]
                Name = PhoneNumber
                localize(Caption);
                View = PhoneNumberListView;
            }
        }
    }


    Caption грузим из ресурсов "/PersonListView/Columns/Column[@Name='FirstName']/Caption"...

    Теперь мы можем кинуть PersonListView на любую форму и забиндить любой список персон.

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

    Если у нас некоторая комбинация контролов часто повторяется то создаем составной контрол.

    Кстати VirtualTreeGrid тоже не с нуля пишется. Он будет создан на основе ScrollBox и GridLayout.

    WH>>Ибо оно не выдерживает никаких изменений.

    КЛ>Это проблема эскиза,
    Нет. Это проблема подхода.

    КЛ>т.к. анализ всех типовых контролов и типовых форм не проводился.

    Он не нужен.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[43]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 22.06.07 18:20
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>А нужно ли проводить различия между элементами объекта/класса? Т.е. я понимаю, что свойство или событие может быть элементом класса. Но для чего нам нужно отличать одно от другого?

    WH>Гм... Не понял.
    Если нигде не нужно учитывать различия между свойством и событием, то зачем создавать две сущности? А если это различие все-таки где-то учитывается, то нельзя ли переделать алгоритм так, чтобы его не учитывать?

    КЛ>>В интерфейсах IEventBase и IPropertyBase объявляется свойство, которое возвращает IType (показано жирным). Если этим свойствам дать одинаковые имена, то три интерфейса можно склеить:

    WH>Это разные типы. То что их описатели реализуют IType ничего не значит.

    Тем не менее и тот и другой интерфейс Вы вывели из IElementBase, т.е. хотели показать, что и свойство, и событие являются элементами. Это означает, что между свойством и событием есть нечто общее. Почему же тогда не продемонстрировать эту общность и не назвать свойство ElementType?

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

    КЛ>>Понимаю, что свойства CanRead и CanWrite для события не нужны. Но если бы они и были, то всегда возвращали бы true. Поэтому ничего страшного не случится, если они будут определены и для события тоже — вернее, для IElementBase, который у нас заменит сразу три интерфейса.

    WH>Это криво.

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

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

    Но это — не догма, а вопрос для размышления.

    КЛ>>А все-таки: насколько отличается реализация интерфейсов IProperty и IAttachedProperty?

    КЛ>>А также — насколько сильно различается код использования этих интерфейсов?
    WH>Одному нужен 1 объект второму 2.

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

    КЛ>>Пусть добавленные свойства будут видны в property grid, но храниться и обрабатываться они будут где-нибудь в другом месте.

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

    1) Объект.
    2) Свойство.

    Т.е. возможны два варианта. В первом варианте свойства прикрепляются к объекту и хранятся в нем (так, если не ошибаюсь, сделано у Вас). Во втором варианте — существует единая таблица, которая связывает прикрепленное свойство и объект.

    Опять-таки, этот вариант — лишь повод для размышления, т.к. возможно он поможет снять проблему дублирования.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[43]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 23.06.07 06:46
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>Как раз совсем наоборот. Как ты и хотел я не стал добиваться удобства за счёт раздувания контракта

    Ну здрааасьте.. Параметр это же тоже часть контракта, и делая его слегка типизированым xml-ем, ты раздул его практически до бесконечности... =)
    Мы уже победили, просто это еще не так заметно...
    Re[39]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 23.06.07 07:06
    Оценка:
    Здравствуйте, Сергей Туленцев, Вы писали:

    СТ>Это ты, видимо, чего-то недопонял. Кажется, он хотел сказать что-то вроде этого

    Угу.. Внимание, вопрос.
    Зачем метод Sort() делать членом класса коллекции? Очевидно его реализация будет пользоваться только публичным контрактом коллекции, так зачем этот метод делать членом класса коллекции, когда с тем же успехом можно воспользоваться вызовом снаружи СoncreteSorter.Sort(MyCollection), вместо MyCollection.Sort(ConcreteSorter)?
    Декларация общего интерфейса для сортировки для всех коллекций, без нужды раздувает контракт коллекции, увеличивая связность — делает как раз то от чего предостерегал Меерс...

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

    Мы уже победили, просто это еще не так заметно...
    Re[40]: О сопровождении
    От: Сергей Туленцев Россия http://software.tulentsev.com
    Дата: 23.06.07 07:43
    Оценка:
    Здравствуйте, IB, Вы писали:

    IB>Здравствуйте, Сергей Туленцев, Вы писали:


    СТ>>Это ты, видимо, чего-то недопонял. Кажется, он хотел сказать что-то вроде этого

    IB>Угу.. Внимание, вопрос.
    IB>Зачем метод Sort() делать членом класса коллекции?

    В этом вопросе я с тобой полностью согласен. Я лишь возражал на твоё ошибочное предположение о том, что каждый метод сортировки будет вынужден знать о всех остальны.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    --
    Re[44]: О сопровождении
    От: EvilChild Ниоткуда  
    Дата: 23.06.07 09:41
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

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


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


    Различия бывают как позитивные, так и негативные (в оригинале Positive and Negative Variability) и учитывать при проектировании надо и те и другие.
    Это здорово описано в книге Multi-Paradigm Design for C++.
    now playing: Break — Submerged (Calyx & TeeBee Remix)
    Re[40]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.06.07 11:53
    Оценка:
    Здравствуйте, IB, Вы писали:

    IB>Зачем метод Sort() делать членом класса коллекции?

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

    Наоборот, я писал, что метод Sort() НЕ нужно делать членом класса коллекции.

    IB>Очевидно его реализация будет пользоваться только публичным контрактом коллекции, так зачем этот метод делать членом класса коллекции, когда с тем же успехом можно воспользоваться вызовом снаружи СoncreteSorter.Sort(MyCollection), вместо MyCollection.Sort(ConcreteSorter)?

    Можно сделать так, а можно — чуть-чуть по-другому.

    AllSorters.Sort(MyCollection, SortType);


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

    Имелись в виду итераторы, которые используются функциями сортировки, как в STL. Иначе как еще унифицировать различные коллекции, чтобы не пришлось плодить алгоритмы сортировки для каждой коллекции?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[45]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.06.07 12:18
    Оценка:
    Здравствуйте, EvilChild, Вы писали:

    EC>Различия бывают как позитивные, так и негативные (в оригинале Positive and Negative Variability) и учитывать при проектировании надо и те и другие.

    Полагаю, что это совершенно не важно. Потому что лучше концентрироваться не на различиях, а на сходстве. А вернее — на том, что нам нужно сделать с совершенно разными сущностями.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[40]: О сопровождении
    От: Andrei N.Sobchuck Украина www.smalltalk.ru
    Дата: 23.06.07 12:31
    Оценка:
    Здравствуйте, IB, Вы писали:

    IB>Зачем метод Sort() делать членом класса коллекции? Очевидно его реализация будет пользоваться только публичным контрактом коллекции, так зачем этот метод делать членом класса коллекции, когда с тем же успехом


    Производительность обобщенного алгоритма может становиться просто неприемлимой. Так что алгоритм (стратегия) сортировки может быть разным у разных коллекций и просто обязан лазить в "потроха". Та же фигня что и с итератором.
    ... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
    Я ненавижу Hibernate
    Автор: Andrei N.Sobchuck
    Дата: 08.01.08
    !
    Re[46]: О сопровождении
    От: EvilChild Ниоткуда  
    Дата: 23.06.07 12:39
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    EC>>Различия бывают как позитивные, так и негативные (в оригинале Positive and Negative Variability) и учитывать при проектировании надо и те и другие.

    КЛ>Полагаю, что это совершенно не важно.
    На чём основано это положение?
    КЛ>Потому что лучше концентрироваться не на различиях, а на сходстве. А вернее — на том, что нам нужно сделать с совершенно разными сущностями.
    Предлагаю всё же ознакомиться с вышеозначенной книгой — она есть в p2p, можно хотя бы эту главу почитать.
    now playing: Calyx & Teebee — Telepathy
    Re[41]: О сопровождении
    От: IB Австрия http://rsdn.ru
    Дата: 23.06.07 12:57
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Такое впечатление, что Вы спорите сами с собой.

    Такое впечатление, что ты не читаешь...

    КЛ> Ну скажите, где я писал о том, что хочу сделать метод Sort() членом класса коллекции? Где? Укажите, плииз!

    Если внимательно почитать, то станет очевидно, что это не моя идея, а Сергея Туленцова. И отвечал я ему, на его предположение о том, что ты имел ввиду (на основании чего он так предположил — другой вопрос и не ко мне).

    КЛ>Можно сделать так, а можно — чуть-чуть по-другому.

    Чем плохо это "по другому" я тоже уже описывал.
    Мы уже победили, просто это еще не так заметно...
    Re[42]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 23.06.07 13:09
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Проблема в том что конвеерное производство в программировании работает очень плохо.

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

    Само производство программ у нас пока не конвеерное. Но ряд шагов в этом направлении тоже сделан.

    WH>Ибо если появляется что-то что можно производить конвеерным способом то есть 99.9999999% вероятность что это автоматизируется.

    WH>А если что-то можно автоматизировать то это должно быть автоматизировано.
    Разумеется. Об этом я и говорил. При конвеерной архитектуре один шаг "Создание контрола" разбивается на ряд более простых операций:

    1) Создание функциональной модели.
    2) Создание топологической модели.
    3) Создание лэйаута.
    4) Создание визуального представления.
    5) И т.д.

    WH>Ты просто не понимаешь принципов построения слабосвязанных компонентных архитектур.


    Это не так. Если отбросить код на C# и немерле и описать суть решения на концептуальном уровне, то Вы предложили:

    1) Заменить listbox (список элементов в одну колонку) гридом (списком элементов в N колонок).
    2) Абстрагироваться от содержимого ячейки грида (т.е. в ячейке может содержаться либо кнопка, либо эдит, либо статический текст, либо картинка, либо что-нибудь еще, например, другой контрол).

    Продолжение следует...
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[43]: О сопровождении
    От: WolfHound  
    Дата: 23.06.07 15:15
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>У нас в компании программы, в основе которых лежит конвеерная архитектура, работают хорошо. А если бы они были бы сделаны по-другому, то оказались бы либо слишком сложными, либо постоянно глючили бы, либо и то и другое.

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

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

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

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

    Если мне нужно показать список товаров на складе колличество которых больше MinCount я хочу чтобы в коде было написано следующие
        grid.DataSource = select * from goods where count > MinCount;

    Те это весь прикладной код.
    А DataSource пусть сам соображает что нужно поднимать в память не все, а только начиная с позиции 1000000 до 1000020.
    Чтобы когда пользователь делает в гриде сортировку то к запросу добавлялась сортировка по соответствующему полю. Ибо тянуть все на клиент когда можно отсортировать в базе используя индексы глупость.

    А главное что эта логика написана и отлажена 1 раз. И ее не видно в прикладном коде.

    Да над библиотекой придется поколдовать. Но сделать это нужно один раз.

    КЛ>Само производство программ у нас пока не конвеерное. Но ряд шагов в этом направлении тоже сделан.

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

    WH>>Ибо если появляется что-то что можно производить конвеерным способом то есть 99.9999999% вероятность что это автоматизируется.

    WH>>А если что-то можно автоматизировать то это должно быть автоматизировано.
    КЛ>Разумеется. Об этом я и говорил. При конвеерной архитектуре один шаг "Создание контрола" разбивается на ряд более простых операций:
    Это все лирика.
    Это делается по умолчанию и на автопилоте.

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

    WH>>Ты просто не понимаешь принципов построения слабосвязанных компонентных архитектур.

    КЛ>Это не так.
    Пока что это именно так и выглядит.
    Иначе тех мутантов что ты описал в предыдущем сообщении ты бы не придумал.

    КЛ>Если отбросить код на C# и немерле и описать суть решения на концептуальном уровне, то Вы предложили:

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

    КЛ>1) Заменить listbox (список элементов в одну колонку) гридом (списком элементов в N колонок).

    VirtualTreeGrid'ом если быть точным.
    Virtual означает то что он не требует чтобы были подняты все данные. Ибо данных может быть очень много.
    Tree означает что я могу отображать не только плоские но и иерархические структуры. А также проводить группироваку плоских. Причем благодоря умной прокладке между базой и гридом группировкой будет заниматься база. Причем для этого не понадобится никаких движений со стороны прикладного программиста.

    КЛ>2) Абстрагироваться от содержимого ячейки грида (т.е. в ячейке может содержаться либо кнопка, либо эдит, либо статический текст, либо картинка, либо что-нибудь еще, например, другой контрол).

    Опять не точно.
    Никаких либо. Никакой конкретики.
    В ячейке может быть абсолютно любой контрол.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[44]: О сопровождении
    От: WolfHound  
    Дата: 23.06.07 15:15
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Если нигде не нужно учитывать различия между свойством и событием, то зачем создавать две сущности? А если это различие все-таки где-то учитывается, то нельзя ли переделать алгоритм так, чтобы его не учитывать?

    Нельзя.
    Обработка делается совсем по разному.

    КЛ>Тем не менее и тот и другой интерфейс Вы вывели из IElementBase, т.е. хотели показать, что и свойство, и событие являются элементами. Это означает, что между свойством и событием есть нечто общее.

    И туда вынесено ровно то что должно быть вынесено.

    КЛ>Почему же тогда не продемонстрировать эту общность и не назвать свойство ElementType?

    По тому что не нужно объеденять мух с котлетами.

    КЛ>Не скажу, что такое направление размышлений единственно правильное. Но если оно поможет избавиться от дублирования кода, работающего с интерфейсами, то почему бы и нет?

    Не поможет.

    КЛ>Я же в данном случае стараюсь применить иной подход — пытаюсь сконцентрироваться не на том, что свойство и событие различает, а на том, что их объединяет. Почему? Потому что в случае успешности попытки, можно будет уменьшить количество сущностей (интерфейсов) и, как результат, сократить вызывающий код. Т.е. вместо двух участков кода, один из которых работает с IPropertyBase, а другой — с IEventBase, можно будет получить один участок кода без какого-либо усложнения.

    Такие случаи видны сразу. Причем сразу же находится то что эти сущьности роднит.
    Например IAttachedElement.
    Выделение этого интерфейса в некоторых случаях позволило обобщенно работать с IAttachedEvent и IAttachedProperty.
    Но в отличии от предлогаемых тобой притянутых за уши обобщений это абсолютно логическое обобщение.
    И то и другое может цепляться к объекту.
    Следовательно можно выделить сущьность которая цепляется к объекту.

    КЛ>Если все различие заключается в количестве передаваемых параметров, то код можно сократить, т.е. от одного интерфейса можно просто избавиться.

    Нельзя. Ибо от логики получения второго объекта всеравно не избавиться.

    КЛ>Т.е. возможны два варианта. В первом варианте свойства прикрепляются к объекту и хранятся в нем (так, если не ошибаюсь, сделано у Вас).

    Ошибаешься.

    КЛ>Во втором варианте — существует единая таблица, которая связывает прикрепленное свойство и объект.

    Зачем единая?
    Зачем себя ограничивать?

    КЛ>Опять-таки, этот вариант — лишь повод для размышления, т.к. возможно он поможет снять проблему дублирования.

    Нет никакого дублирования. Его ты придумал.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[44]: О сопровождении
    От: deniok Россия  
    Дата: 23.06.07 18:07
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>2) Абстрагироваться от содержимого ячейки грида (т.е. в ячейке может содержаться либо кнопка, либо эдит, либо статический текст, либо картинка, либо что-нибудь еще, например, другой контрол).

    WH>Опять не точно.
    WH>Никаких либо. Никакой конкретики.
    WH>В ячейке может быть абсолютно любой контрол.

    Да ты просто пишешь высоко-полиморфный код, который "мономорфизироваться" будет где-нибудь в Индии. А твой оппонент пытается его "преждевременно мономорфизировать" Понятно, что многие "священные принципы" прикладного ООП у тебя не работают. Поскольку объект, будучи создан, всегда имеет конкретный мономорфный тип, а ты с конкретными объектами уже дела не имеешь. Это всё ФП-зараза
    Re[51]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 24.06.07 21:29
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Это алгоритм чего конкретно?

    WH>Заполнения PropertyGrid'а в дизайнере для выбранного контрола.

    "Родитель", "дед" и пр. — это связь между классами или между экземплярами? Иными словами, это наследование или ссылки вроде owner/parent?

    [...]

    WH>Например когда рисуешь диалог удобно без написания кода выставить кнопке предопределенные действия например Ok/Cancel. А если впсомнить про web то это становится просто необходимым.

    WH>Таким образом у диалога заводится присоедененное свойство которое цепляется только к кнопкам.

    У диалога заводится такое свойство? То есть оно как-то привязывается к экземпляру контейнера?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[47]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 24.06.07 21:42
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    ГВ>>Возможно. Хотя, ИМХО, экземпляры можно создавать непосредственно перед использованием.


    AVK>Можно. Но алгоритмы диайнера и сериализатора таковы, что это создаст очень серьезный оверхед. Количество контролов, помноженное на количество свойств, помноженное на количество attached свойств, помноженное на количество проходов даст очень неслабую цифру.


    Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать. Да и генерация свойств для PropertyGrid-а по словам Wolfhound-а
    Автор: WolfHound
    Дата: 22.06.07
    :

    Так что проще сгенерить блпго это практически ничего не стоит.


    ГВ>>Тогда и накладные расходы на перезапрос интерфейса IProperty будут минимальными. В любом случае, пользователю хорошо известно, с каким объектом он собирается работать — Native или Attached.


    AVK>Не всегда.


    Не может быть. Здесь же не унифицированы интерфейсы Native и Attached. Ergo, пользователь всегда знает, с чем работает. Под "пользователем" я имею ввиду программиста, разумеется.

    ГВ>>С другой стороны, stateless-дизайн можно ещё оправдать тем, что ситуация с выполнением многочисленных одинаковых операций для свойств разных объектов (например, SetValue для всех контролов) встречается чаще, чем вызов разных методов для одного объекта (например, последовательность CanReset/Reset/GetValue или что-то в этом роде). Но я бы тут подумал, что в конечном итоге лучше — быстро создавать объект или передавать один-два дополнительных параметра.


    AVK>Вариантов решения проблемы хватает. Сейчас, к примеру, owner передается в любом случае, просто для обычного свойства он игнорируется.


    А куда передаётся owner?

    AVK>Можно еще визитор использовать. Если в языке есть pattern matching, то можно использовать его. Вобще, в реальном проекте все намного сложнее и хитрее, но смысла это все описывать здесь нет.


    ИМХО — есть. Уж коль скоро появились конкретные интерфейсы.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[52]: О сопровождении
    От: WolfHound  
    Дата: 25.06.07 04:17
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>"Родитель", "дед" и пр. — это связь между классами или между экземплярами?

    Между объектами.

    ГВ>Иными словами, это наследование или ссылки вроде owner/parent?

    Второе.

    ГВ>У диалога заводится такое свойство? То есть оно как-то привязывается к экземпляру контейнера?

    Attached элементы это такие волшебные элементы которые принадлежат одним объектам, а цепляются к другим.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[48]: О сопровождении
    От: WolfHound  
    Дата: 25.06.07 04:17
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать. Да и генерация свойств для PropertyGrid-а по словам Wolfhound-а
    Автор: WolfHound
    Дата: 22.06.07
    :


    ГВ>

    ГВ>Так что проще сгенерить блпго это практически ничего не стоит.

    В дизайнере форм. По запросу пользователя. А генерить все в рантайме на на каждую сериализацию/десериализацию уже дорого.

    ГВ>Не может быть. Здесь же не унифицированы интерфейсы Native и Attached. Ergo, пользователь всегда знает, с чем работает. Под "пользователем" я имею ввиду программиста, разумеется.

    Тут смотря какой программист.
    Разработчик системных компонентов да.
    А те кто пишут бизнес логику как правило нет.
    Бросил кнопку на форму. Выставил те свойства что появились в PropertyGrid'е и пошол дальше.

    ГВ>ИМХО — есть. Уж коль скоро появились конкретные интерфейсы.

    Это ты скатываешься к предложению схожему с преложением Кирилла описать все детали скрещивания win с web. Никто этого делать не будет.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[48]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 25.06.07 08:50
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать.


    Это долго расписывать.

    ГВ> Да и генерация свойств для PropertyGrid-а по словам Wolfhound-а
    Автор: WolfHound
    Дата: 22.06.07
    :


    ГВ>

    ГВ>Так что проще сгенерить блпго это практически ничего не стоит.


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

    ГВ>>>Тогда и накладные расходы на перезапрос интерфейса IProperty будут минимальными. В любом случае, пользователю хорошо известно, с каким объектом он собирается работать — Native или Attached.


    AVK>>Не всегда.


    ГВ>Не может быть. Здесь же не унифицированы интерфейсы Native и Attached.


    Еще раз повторю — все намного сложнее в реальности, чем здесь описывается.

    AVK>>Вариантов решения проблемы хватает. Сейчас, к примеру, owner передается в любом случае, просто для обычного свойства он игнорируется.


    ГВ>А куда передаётся owner?


    В специальный объект, аналог PropertyDescriptor.

    ГВ>ИМХО — есть. Уж коль скоро появились конкретные интерфейсы.


    Это не конкретные интерфейсы, конкретные интерфейсы отличаются от того, что приводил WH.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[45]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 25.06.07 11:25
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>Если нигде не нужно учитывать различия между свойством и событием, то зачем создавать две сущности? А если это различие все-таки где-то учитывается, то нельзя ли переделать алгоритм так, чтобы его не учитывать?

    WH>Нельзя.
    WH>Обработка делается совсем по разному.
    Приведите, пожалуйста, примеры обработки.

    КЛ>>Тем не менее и тот и другой интерфейс Вы вывели из IElementBase, т.е. хотели показать, что и свойство, и событие являются элементами. Это означает, что между свойством и событием есть нечто общее.

    WH>И туда вынесено ровно то что должно быть вынесено.
    Да, но это дробление сущностей, а не обобщение. Вынести можно и так, и эдак. Но в моем варианте количество сущностей сокращается.

    КЛ>>Почему же тогда не продемонстрировать эту общность и не назвать свойство ElementType?

    WH>По тому что не нужно объеденять мух с котлетами.
    Это — не аргумент.

    КЛ>>Не скажу, что такое направление размышлений единственно правильное. Но если оно поможет избавиться от дублирования кода, работающего с интерфейсами, то почему бы и нет?

    WH>Не поможет.
    Почему?

    WH>Такие случаи видны сразу. Причем сразу же находится то что эти сущьности роднит.

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

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

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

    WH>И то и другое может цепляться к объекту.

    WH>Следовательно можно выделить сущьность которая цепляется к объекту.
    Древнекитайская классификация животных делила их на четвероногих, крылатых, нарисованных тушью, принадлежащих императору и т.п.Вам не приходит в голову, что предложенная Вами классификация элементов объекта на свойства, события, добавленные свойства, добавленные события напоминает китайскую классификацию?

    КЛ>>Если все различие заключается в количестве передаваемых параметров, то код можно сократить, т.е. от одного интерфейса можно просто избавиться.

    WH>Нельзя. Ибо от логики получения второго объекта всеравно не избавиться.
    "Логику получения второго объекта" можно инкапсулировать.

    КЛ>>Во втором варианте — существует единая таблица, которая связывает прикрепленное свойство и объект.

    WH>Зачем единая?
    WH>Зачем себя ограничивать?
    В этом случае мы имеем один объект, которому делегируем обязанность получать и устанавливать значения добавленных свойств и событий. Получается: 1 обязанность — 1 класс — 1 объект. Легко менять и разбираться в случае чего.

    КЛ>>Опять-таки, этот вариант — лишь повод для размышления, т.к. возможно он поможет снять проблему дублирования.

    WH>Нет никакого дублирования. Его ты придумал.
    Вы же сами утверждали — код, работающий с IProperty и IAttachedProperty похож.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[46]: О сопровождении
    От: WolfHound  
    Дата: 25.06.07 16:21
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    WH>>Нельзя.

    WH>>Обработка делается совсем по разному.
    КЛ>Приведите, пожалуйста, примеры обработки.
    Дизайнер работает с ними по разному.
    При сереализации/десериализации их нужно обрабатывать по разному.
    Короче мест где можно работать с ними обобщенно меньше чем мест где они различаются.

    КЛ>Да, но это дробление сущностей, а не обобщение. Вынести можно и так, и эдак. Но в моем варианте количество сущностей сокращается.

    Это не дробление ибо ничего не дробится.
    Типы у них разные и используются они по разному.

    КЛ>Почему?

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

    КЛ>Пока у Вас нет критериев "абсолютно логического обобщения", невозможно сказать, какое обобщение "логическое", а какое — "притянуто за уши".

    Почему же? Если в нектором контексте связь отвечает на вопрос "is a" то можно обобщать.
    Если нет то нельзя ибо даже если мы вдруг сможем гдето немного срезать то нам это аукнется при поддержке.

    КЛ>Например, у меня такой критерий есть: обобщение, которое сокращает вызывающий код, является "абсолютно логичным". А вот если обобщение плодит сущности, то оно — "притянуто за уши".

    Те сокращение колличества кода и сущьностей любой ценой?
    Странный критерий.
    В лучшем случае получишь небольшое преимущество на очень коротких дистанциях.
    Но на длинной дистанции закопаешься.

    Вобще говря есть очень хорошая эвристика.
    Работает лучше чем выбор некого критерия (например уменьшение кода любой ценой) и параноидальное следование ему.

    Если в модель ни добавить ни убавить без потери целостности то это хорошая модель.
    Модель интерфейсов сейчас выглядит так:

    Модель симметрична. Отсутствие любого элемента приведет к потери симметрии. Добавление тоже.

    Вобще картинке место в начеле теста IQ.
    Можно убрать 3 интерфейса находящихся в разных строках и разных столбцах и по остальным можно однозначно востановить пропущенные.
    Даже не зная значения тех слов что там написаны.

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

    Причем даже если бы там были интерфейсы бездельники я бы всеравно картинку ломать не стал ибо:
    1)В данном случае интерфейсы ничего не стоят.
    2)Практика показывает что если появляется подобная картинка то рано или поздно таки придется закрыть все дыры. И лучше это сделать рано чтобы не пришлось код трогать.

    КЛ>Древнекитайская классификация животных делила их на четвероногих, крылатых, нарисованных тушью, принадлежащих императору и т.п.Вам не приходит в голову, что предложенная Вами классификация элементов объекта на свойства, события, добавленные свойства, добавленные события напоминает китайскую классификацию?

    Куда идти с доказательствами по аналогии напомнить?

    WH>>Нельзя. Ибо от логики получения второго объекта всеравно не избавиться.

    КЛ>"Логику получения второго объекта" можно инкапсулировать.
    Так она и нкапсулирована на том уровне где работают с метаданными...
    На другие уровни ни эта логика ни эти интерфейсы не вылезают.

    КЛ>В этом случае мы имеем один объект, которому делегируем обязанность получать и устанавливать значения добавленных свойств и событий. Получается: 1 обязанность — 1 класс — 1 объект. Легко менять и разбираться в случае чего.

    Нельзя.
    Мало того что свойства и события это разные сущьности так у них еще и механизмы работы различны.

    КЛ>Вы же сами утверждали — код, работающий с IProperty и IAttachedProperty похож.

    Гдето похож. Гдето нет. Гдето похожи механизмы работы IAttachedProperty и IAttachedEvent...
    Короче всем интерфейсам работа есть...
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[49]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 25.06.07 17:44
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Не может быть. Здесь же не унифицированы интерфейсы Native и Attached. Ergo, пользователь всегда знает, с чем работает. Под "пользователем" я имею ввиду программиста, разумеется.

    WH>Тут смотря какой программист.
    WH>Разработчик системных компонентов да.
    WH>А те кто пишут бизнес логику как правило нет.
    WH>Бросил кнопку на форму. Выставил те свойства что появились в PropertyGrid'е и пошол дальше.

    ГВ>>ИМХО — есть. Уж коль скоро появились конкретные интерфейсы.

    WH>Это ты скатываешься к предложению схожему с преложением Кирилла описать все детали скрещивания win с web. Никто этого делать не будет.

    Тогда нет смысла приводить эти интерфейсы в качестве опровержения достаточно абстрактного тезиса. Либо нужно расписывать весь круг решаемых задач, окружающие API и прочее. Третьего не дано.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[51]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 25.06.07 22:14
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>>>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать.

    AVK>>>Это долго расписывать.
    ГВ>>А ты попробуй.
    WH>Если в двух словах то в твоей модели на каждый десериализуемый объект нужно создавать еще пару десятков объектов.
    WH>Причем цель жизни каждого из них один раз установить значение свойства.
    WH>Это дорого.
    WH>Да и не нужно ибо создание + однократное использование твоего объекта не проще чем однократное использование моего.

    Трудно сказать. Я так понял, что есть ещё некий промежуточный объект, который, собственно, и скрывает от пользователя различия в интерфейсах Attached и не-Attached.

    ГВ>>Ясно. Я пока склоняюсь к тому, что те интерфейсы, который показал WolfHound — это очень низкий уровень в иерархии абстракций. Ergo, надо копать остальные абстракции тоже.

    WH>Не надо. Это абсолютно самодостаточная модель.

    Если это самодостаточная модель, то откуда рассуждения о недопустимой дороговизне создания дополнительных объектов? Модель существует во вполне конкретном окружении и заточена под вполне определённые задачи и характер использования. Собственно именно это (описание использования и окружения) я и пытаюсь из тебя "вытрясти", поскольку без этого в принципе ничего нельзя сказать о проектировании и [не-]уместности принятых решений.

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

    WH>Не нужно. В прочем ты себя послушай... расписать задачу от и до. Да где ты такое видел? Такого не бывает ни где и ни когда. В принципе.

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

    WH>Ну разве что сюда опять зайдут программисты софта для АЭС или шатлов


    WH>Что касается посылок достаточно посмотреть к чему они приводят... А приводят они к ужасной лапше в которой все завязано на все.

    WH>Просто идеи типа дать всем контролам текст и картинку с моей точки зрения является абсолютно не допустимыми при создании чего бы то нибыло.
    WH>И не надо тут говорить про пример, затычку, отмазку и тп. Данное решение говорит лучше 1000 слов. Я никогда не позволю себе такое даже в качестве отмашки. Я корее просто пошлю чем изрбражу такое.

    WH>Причем мои интерфейсы тут абсолютно не причем.

    WH>Они нацелены на совершенно иной уровень абстракции и порядка в системе.

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

    WH>А тому что напректировал Кирилл ничето не поможет.

    WH>Ибо он действует из совершенно не верных посылок.
    WH>И наиболие фатальныя из них это: Система должна быть минимальной.
    WH>БРЕД! Эта посылка работает при создании материальных систем ибо там основные затраты это воплощение в железе, камне и тп. Хотя даже тут пока еще работает... ибо чем дальше тем не матереальная составляющея становится все больше и больше.

    "Бред", спору нет, это аргумент офигенной силы и сильного колдунства.

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

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

    Ещё одна абстракця? Что такое "чистота"?

    WH>Но тут и близко не тот случай.

    WH>Сравнивается макаронная архитектура в которой все завязано на все и при попытке добавить то на что в начале создания не закладовались все посыпится. Скажем сплайн лейаут Кирилл не добавит никогда ибо на него не расчитана система. Он просто не влезет в его таблички. Никак.

    На самом деле, тут сталкиваются более узкая и более широкая постановки. Только и всего. Вопрос о правомерности сужения задачи Кириллом или о расширении её тобой разрешается на уровне маркетингвого анализа, посему спорить об этом в текущем контексте нет смысла. Вот ответь на вопрос: с чего ты взял, что, допустим, тот же Кирилл столкнётся с необходимостью вводить splain-based layouts? Почему ему не должно хватить "обычных" layout-ов, базирующихся на строчно-колоночном представлении? С другой стороны, сплайны могут потребовать и соответствующей поддержки со стороны контролов (изгибы там всякие и т.п.), а это уже выходит за рамки возможностей стандартных Win32-контролов (comctl32.dll, я имею ввиду). Как, кстати, и за рамки "удобного интерфейса", по крайней мере — на сегодняшний день. Во всяком случае, я был бы рад посмотреть на удобное воплощение сплайн-организованного интерфейса пользователя (я не считаю это невозможным).

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

    WH>Разве что ему придется поравить все.


    WH>Со слабосвязанной компонентной системой которой в очень широких рамках всеравно с чем работать.

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

    WH>Да в первой системе сущьностей и возможно кода на первых этапах меньше.


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


    WH>Но с моей точки зрения это плохой путь.

    WH>Ибо если уж написал и взял за это деньги то обеспечь сопровождение на должном уровне.
    WH>А если не можешь не берись.

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

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

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

    WH>Ты что тоже не понимаешь чем win от web отличается и почему за 5 минут на коленке под них общий интерфейс не подвести?

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

    [skip, понятно]

    WH>Для тех кто не понял в чем суть повторю еще раз:

    WH>1)Отделить от объектов (контролов в частности) то что им знать не нужно.
    WH>2)Обеспечить работу абстрактных сериалайзеров и дизайнеров с данной объектоной моделью.

    А абстрактные сериалайзеры — они как, совсем абстрактные, или имеют некий собственный интерфейс и/или требования к интерфейсу сериализуемых объектов?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[52]: О сопровождении
    От: WolfHound  
    Дата: 26.06.07 06:32
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Трудно сказать. Я так понял, что есть ещё некий промежуточный объект, который, собственно, и скрывает от пользователя различия в интерфейсах Attached и не-Attached.

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

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

    ГВ>Если это самодостаточная модель, то откуда рассуждения о недопустимой дороговизне создания дополнительных объектов? Модель существует во вполне конкретном окружении и заточена под вполне определённые задачи и характер использования. Собственно именно это (описание использования и окружения) я и пытаюсь из тебя "вытрясти", поскольку без этого в принципе ничего нельзя сказать о проектировании и [не-]уместности принятых решений.

    От туда что это модель метаданных.
    Заводить на каждый объект еще несколько десятков только ради того чтобы один раз передать на один параметер меньше...
    Ты сам то оценил все прелести этого подхода?

    ГВ>Хотя бы в приблизительных набросках обычно можно. Так, что будут ясны основные ограничения, откуда они берутся и т.д, и т.п. Пока что задача вытряхивается по кусочкам.

    В приблизительных я описывал не раз.

    ГВ>Решение Кирилла иллюстрирует прежде всего подход. Соответственно, коль скоро дело доходит до сравнения результатов применения подходов, то нужно брать и сопоставимые задачи.

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

    ГВ>"Бред", спору нет, это аргумент офигенной силы и сильного колдунства.

    Все ясно.
    По сути сказать нечего.

    ГВ>Ещё одна абстракця? Что такое "чистота"?

    Это когда в решении есть только то что нужно. Не больше и не меньше.
    В решении Кирилла куча паразитных свойств и связей.
    Нафига едиту картина? Ну нафига? Можешь сказать?
    Зачем эта грязь на ровном месте?

    ГВ>На самом деле, тут сталкиваются более узкая и более широкая постановки. Только и всего.

    Нет.
    Тут сталкиваются подходы:

    1)Запихнем все в одну кучу и какимто чудом заставим работать.
    Вполне себе подход если нужно по быстрому срубить бабла и свалить.

    2)Разложем все по полочкам и все само заработает.
    А при этом подходе можно долго развивать сложную систему.
    Причем проблем с реализацией того о чем и не подозревали не будет.

    ГВ>Вопрос о правомерности сужения задачи Кириллом или о расширении её тобой разрешается на уровне маркетингвого анализа, посему спорить об этом в текущем контексте нет смысла. Вот ответь на вопрос: с чего ты взял, что, допустим, тот же Кирилл столкнётся с необходимостью вводить splain-based layouts? Почему ему не должно хватить "обычных" layout-ов, базирующихся на строчно-колоночном представлении? С другой стороны, сплайны могут потребовать и соответствующей поддержки со стороны контролов (изгибы там всякие и т.п.), а это уже выходит за рамки возможностей стандартных Win32-контролов (comctl32.dll, я имею ввиду). Как, кстати, и за рамки "удобного интерфейса", по крайней мере — на сегодняшний день. Во всяком случае, я был бы рад посмотреть на удобное воплощение сплайн-организованного интерфейса пользователя (я не считаю это невозможным).

    Это лейаут исключительно как пример того что в модель Кирилла не впишется.
    В прочем в нее вобще ничего не впишется.

    А вот в мою модель впишется.
    Даже с учетом искривления контролов если оно конечно комуто будет нужно. (Хотя вероятность существует http://fotki.yandex.ru/users/romashka-smile88/view/5066/ )
    Да стандартный рендер Win32 придется послать и использовать что-то типа http://antigrain.com/ или что-то другое. Тут нужны исследования.
    Но мне будет нужно переписать только рендер и реализацию основных контролов, а их в моем случае не много. Все составные автоматически заработают.
    Вся написанная логика будет рабоать как работала.

    Кириллу придется переписать все.

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

    ГВ>Хотя на самом деле обе постановки имеют примерно одинаковое право на существование.
    Не имеют.
    Задача построение слобосвязанной архитектуры встает автоматически когда нужно написать что-то большее чем "Привет мир!".
    Просто по умолчанию.
    Нет никакого поджимания/расширения.
    Упорядочивание и уменьшение связанности системы это одна из основных задач иначе долгоживущею систему не сделать.
    Вернее ее создание и развитие будет требовать просто огромных ресурсов.
    Ибо если систему не упорядочить сразу и не пресекать все попытки этот порядок нарушить то энтропия в системе будет расти просто с чудовищьной скоростью.
    А навести порядок там где изначально полный бардк не реально.

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

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

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

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

    ГВ>Здесь, вон, других задач хватет: те же сериалайзеры/дизайнеры. ИМХО, их как раз можно за более или менее разумное время описать.

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

    ГВ>А абстрактные сериалайзеры — они как, совсем абстрактные, или имеют некий собственный интерфейс и/или требования к интерфейсу сериализуемых объектов?

    Им нужны только метаданные.
    Те на вход поступает IDomain и корневой объект.
    Дальше
    IType type = domain.GetType(obj.GetType());

    Теперь мы знаем про объект все что нам нужно.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[50]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 26.06.07 08:50
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>>>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать.

    AVK>>Это долго расписывать.

    ГВ>А ты попробуй.


    Не буду. Во-первых лень, во-вторых это коммерческая тайна.

    ГВ>Ясно. Я пока склоняюсь к тому, что те интерфейсы, который показал WolfHound — это очень низкий уровень в иерархии абстракций. Ergo, надо копать остальные абстракции тоже.


    Зачем?

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


    Это никто читать все равноне будет.

    ГВ>, а другие утверждают, что её долго и муторно расписывать. Странно это как-то.


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

    ГВ>>>А куда передаётся owner?

    AVK>>В специальный объект, аналог PropertyDescriptor.

    ГВ>А назначение этого объекта?


    То же, что и у PropertyDescriptor.

    ГВ>То есть, фактически, это такой сфероконь?


    Пример.

    ГВ> А мы-то здесь копья ломаем... Великолепно, брависсимо!


    Я вобще не знаю что ты тут хочкшь добиться.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[46]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 26.06.07 09:27
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>На любом приличном языке это будет выглядить так (с точностью до синтаксиса):

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

    WH>Остальное детали реализации не имеющие никакого значения на данном уровне абстракции.

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

    КЛ>>Сложность устраняется формальными моделями, которые позволяют решать задачи определенного класса, которые до этого времени решались абы как. Соответственно, для этого эти модели надо сначала разработать.

    WH>С этим ни кто не спорит.
    Вы спорите.

    WH>Только нужно понимать что сложность не устраняется, а скрывается.

    WH>Ее просто выносят на уровень собственно модели.
    Сложность никуда не выносят. Ее устраняют при помощи модели.

    WH>А как ты думаешь почему римская система появилась раньше позиционной?

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

    WH>Да все просто.

    WH>У нее абстракция нулевая.
    Что такое "нулевая абстракция"?

    WH>Каждая цифра обозначает конкретное число.

    WH>Не больше и не меньше.
    Мягко говоря, это не так. В римской системе зарезервированы знаки для чисел: 1 (I), 5 (V), 10 (X), 50 (L), 100 (C), 1000 (M — что ли?). Остальные числа получаются путем добавления цифр слева или справа. В некотором роде, римскую систему счисления тоже можно назвать позиционной.

    WH>Модель проста как палка.

    Снова неправда. Она гораздо удобнее греческой, в которой для обозначения чисел использовались буквы всего греческого алфавита.

    WH>А в случае с позиционной нужно понимать что цифры не сами по себе, а зависят от позиции.

    WH>Те сложность умножения ни куда не делась.
    Вы бы все-таки перемножили приведенные числа и в римской системе счисления, и в десятичной системе счисления, а потом бы сравнили.

    WH>А если посмотреть на тот код что я привел выше то абстракция поднята еще выше.

    Это не абстракция, а прикол.

    WH>Там просто введено обозначение умножения чисел и все.

    WH>Ни какого конкретного алгоритма там нет.
    WH>Он спрятан внутри класса RomanNumber.
    Его все равно придется реализовывать либо одним (через позиционную систему с фиксированным основанием), либо другим (через написание алгоритмов для умножения римских чисел) способом.

    WH>А как уж он реализован это другой вопрос.

    Тем не менее, он возникает.

    WH>Переводим ли мы в позиционныю систему исчисления или перемножаем напримую римские чиселки совершенно не важно.

    WH>Болие того мы можем заменить одно на другое так что прикладной код использующий умножение этого не заметит.
    Все что Вы сделали — это перераспределили сложность между слоями. Но сложность от этого никуда не делась. Да, на прикладном уровне все стало просто. Но реализовывать умножение все равно кому-то придется. И тут этому кому-то придется либо заморачиваться с римскими цифрами, либо изобретать позиционную систему счисления с фиксированным основанием и упрощать алгоритм.

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

    WH>Конвеер хорошо решает только массовое штампование совершенно одинаковых чайников по один раз нарисованному чертежу.

    WH>Однако в случае с программой нет никакого массового штампования. (Вернее оно есть но оно давно и полность автоматизировано. Компилятор + утилита copy == сколько угодно копий какой угодно программы. Чайникам такое и не снилось.)
    Конвеер позволяет унифицировать создание разных изделий за счет выявления одинаковых операций, которые стандартизируются.

    WH>В случае с программой каждый раз нужно рисовать новый чайник.

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

    WH>Нарпмер есть модели: колесо, винт + гайка, блок,...

    WH>Создание таких моделей автоматизировать невозможно.
    Тем не менее, на предприятиях задача автоматизации создания таких объектов решена.

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

    WH>Те если в случае с техникой машина на квадратных колесах никуда не поедет то в случае с программой еще не такое ездит... взять к примеру С++... урод уродом, а ездит.
    Это Вы к чему?

    WH>Те по твоему каждую кнопку должны делать такое колличество народу?

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

    Хотя, зачем я все это объясняю. Вы же тут писали, что для Вас это все очевидно и Вы делаете все на автопилоте.

    WH>А вот задействовать на разроботке кнопки больше одного человека просто не имеет смысла ибо объем работ там практически никакой. Они дольше объяснять друго другу будут что нужно сделать.

    WH>Да обсудить и утвердить общею концепцию системы нужно. Но проектировать толпой народа кнопку... это мягко говоря перебор.
    Тут Вы лукавите — как-то вдруг забыли про сложные контролы.

    КЛ>>Клиенту нужна работающая программа за минимальные деньги, а не особый контрол.

    WH>1)Чистые абстракции позволяют поднимать качество конечного решения, уменьшать время и себистоимость разработки.
    "Чистые" абстракции еще надо реализовать. Если Вы так любите "чистые" абстракции, то почему бы Вам не написать интерфейс Программа и не сделать его несколько реализаций:
    Программа 1 — первая версия программы (пишем все с нуля)
    Программа 2 — вторая версия программы (опять пишем все с нуля)
    Программа 3 — третья версия программы (и еще раз пишем все с нуля)
    и т.д.?

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

    WH>3)Если клиент за небольшую дополнительную плату получит еще и фенечку которая ему нравится то он будет счеслив.

    Да, но если он впоследствии узнает, что из-за этой фенечки код полиморфен, и что тултипы к форме добавляются кнопочкой "Cancel", а обработчик кнопки "OK" зависит от узорного бордюра, который выставляется при вводе "Программер акбар!" в третьем снизу редакторе, который в основном имеет флаг hidden, который сбрасывается при пятом нажатии на "Cancel", но еще перед этим должна быть трижды нажата клавиша Esc с интервалом между нажатиями не меньше 1-ой секунды, то он, мягко говоря, пошлет эту фенечку ко всем чертям.

    КЛ>>Заметьте, что Вы опять пытаетесь перевести конструктивный разговор в русло разборок торговцев на базаре. Я же не называю Ваш код "мутантским" или что-то типа этого.

    WH>Я просто называю вещи своими именами. Может быть временами это не политкорректно но за то никакого лицемерия.
    Вы просто грубо разговариваете.

    WH>Как видишь в моем случае нет никаких лишних связей.

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

    WH>Каждый контрол делает то что от него требуется. Не больше и не меньше.

    И в жестком виде дублирует код большинства других контролов.

    WH>Я сразу мотивировал появление присоедененных элементов (контролам не нужно знать кто и как их размещает) и необходимость метаинформации (сериалайзеры не должны знать что они сериализуют).

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

    КЛ>>Предлагаю заменить этот термин на "контрол, который проявляет свойства дерева и грида".

    WH>Хоть горшком назови.
    Вы опять грубите. К тому же демонстрируете свое неумение абстрагироваться от конкретных названий и выделять главное.

    WH>>>Virtual означает то что он не требует чтобы были подняты все данные. Ибо данных может быть очень много.

    КЛ>>"...способный подгружать данные определенными порциями по мере необходимости".
    WH>Нет. Данные могут быть в массиве, в базе, генериться на лету,...
    У меня где-то сказано про базу?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[47]: О сопровождении
    От: WolfHound  
    Дата: 26.06.07 14:25
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Сложность никуда не выносят. Ее устраняют при помощи модели.

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

    КЛ>Мягко говоря, это не так. В римской системе зарезервированы знаки для чисел: 1 (I), 5 (V), 10 (X), 50 (L), 100 (C), 1000 (M — что ли?). Остальные числа получаются путем добавления цифр слева или справа. В некотором роде, римскую систему счисления тоже можно назвать позиционной.

    Это не существенные детали.
    Совершенно не важно записано число одной закорючкой или несколькими.
    Сущьность системы от это не меняется вобще.

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

    КЛ>Его все равно придется реализовывать либо одним (через позиционную систему с фиксированным основанием), либо другим (через написание алгоритмов для умножения римских чисел) способом.

    Это не важно.
    Относительная стоимость реализации тем ниже чем чаще она используется.

    WH>>А как уж он реализован это другой вопрос.

    КЛ>Тем не менее, он возникает.
    Если оно написано один раз, имеет простой, четкий, понятный интерфейс и работает то нет.

    КЛ>Все что Вы сделали — это перераспределили сложность между слоями. Но сложность от этого никуда не делась. Да, на прикладном уровне все стало просто. Но реализовывать умножение все равно кому-то придется. И тут этому кому-то придется либо заморачиваться с римскими цифрами, либо изобретать позиционную систему счисления с фиксированным основанием и упрощать алгоритм.

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

    КЛ>Конвеер позволяет унифицировать создание разных изделий за счет выявления одинаковых операций, которые стандартизируются.

    Конвеер (без перенастройки) может выпускать только совершенно идентичные изделия.
    То что некоторые конвееры штампуют полуфабрикаты которые сами по себе нафиг не упали но используются другими конвеерами не отменяет того факта что конкретный конвеер может штамповать только идентичные изделия.

    КЛ>Это не так. Большинство программ в определенной области (и даже в разных предметных областях) похожи.

    Похожи но не идентичны.
    Это значит что можно взять чертеж одого чайника и подрехтовать под другой.

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

    А может это просто из-за того что некоторые люди не умеют писать полиморфный код?

    WH>>Нарпмер есть модели: колесо, винт + гайка, блок,...

    WH>>Создание таких моделей автоматизировать невозможно.
    КЛ>Тем не менее, на предприятиях задача автоматизации создания таких объектов решена.
    Ты не понял.
    Я говорил о принципе.
    Те принцип колеса это фундамент, а создание конкретного колеса это уже детали.

    WH>>Те если в случае с техникой машина на квадратных колесах никуда не поедет то в случае с программой еще не такое ездит... взять к примеру С++... урод уродом, а ездит.

    КЛ>Это Вы к чему?
    К тому что при создании программы нет столь очевидной разници как при создании предметов материального мира.

    WH>>Да обсудить и утвердить общею концепцию системы нужно. Но проектировать толпой народа кнопку... это мягко говоря перебор.

    КЛ>Тут Вы лукавите — как-то вдруг забыли про сложные контролы.
    А именно? Самый сложный контрол это VirtualTreeGrid ничего сложеней нет.
    Все остальное очень просто.
    Если ты конечно не собрался MSWord написать.

    Составные контролы совсем тривиальны ибо их создание полностью декларативно.

    КЛ>"Чистые" абстракции еще надо реализовать. Если Вы так любите "чистые" абстракции, то почему бы Вам не написать интерфейс Программа и не сделать его несколько реализаций:

    КЛ>Программа 1 — первая версия программы (пишем все с нуля)
    КЛ>Программа 2 — вторая версия программы (опять пишем все с нуля)
    КЛ>Программа 3 — третья версия программы (и еще раз пишем все с нуля)
    КЛ>и т.д.?
    Именно так я и делаю.
    Вот интерфейс:
    int main(int argc, char** argv)



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

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

    Короче получилось две базовых абстракции:

    1)Поток. Причем поток чего угодно. В том числе поток потоков.
    2)Фильтр. Преобразует один поток в другой. В том числе поток в поток потоков и обратно.


    Решение получилось таким:

    1)Превращаем файлик в поток байт.
    2)Превращаем (тот поток что получился на предыдущем шаге) в поток строк.

    3)При помощи регулярного выражения превращаем в поток кортежей. (time, ip)
    4)Группируем соседние кортежи у которых поле time одинаковое в потоки. Получаем поток потоков.
    5..)Превращаем поток потоков в поток потоков. (вобще этой ФВП пофигу что во что превращать)
    5.1)Считаем колличество одинаковых элементов в потоке. Получаем поток кортежей (count, (time, ip))
    5.2)Оставляем кортежи у которых count > 100
    5.3)Сортируем по полю count
    5.4)Превращаем кортежи в строки (time count ip)
    6)Превращаем поток потоков в поток. Просто переливаем содержимое вложенных потоков в выходной поток.

    7)Превращаем в поток байт.
    8)Записываем поток байт в файлик.


    Этот алгоритм был переведен в код строка в строку.
    Вернее он прямо там и был написан. Но не на русском, а на немерле

    Фильтры ессно параметризуются анонимными функциями.

    Причем стадии 1, 2, 7 и 8 спрятаны внутри функций высшего порядка. (1 и 8 в одной. 2 и 7 в другой) Болие того стадии 1 и 8 происходят в отдельных потоках таким образом мы распаралеливаем винт и обработку.

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

    Имея эту библиотечку я могу играючи делать обработку практически любых потоков (логов в частности).

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

    Вот сила абстракций.

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

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

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

    Скажем я формализовал метаданные.
    Тем самым упростил и их и то что их использует.

    Ибо при всем жилании через абстрактные интерфейсы детали реализации не пробъются.
    А значит не будет паразитных связий.

    КЛ>Да, но если он впоследствии узнает, что из-за этой фенечки код полиморфен, и что тултипы к форме добавляются кнопочкой "Cancel", а обработчик кнопки "OK" зависит от узорного бордюра, который выставляется при вводе "Программер акбар!" в третьем снизу редакторе, который в основном имеет флаг hidden, который сбрасывается при пятом нажатии на "Cancel", но еще перед этим должна быть трижды нажата клавиша Esc с интервалом между нажатиями не меньше 1-ой секунды, то он, мягко говоря, пошлет эту фенечку ко всем чертям.

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

    КЛ>А возможность написания контрола, который добавляет тултипы ко всем другим контролам на форме — это не лишняя связь?

    Нет. Лишняя связь это добавление тултипов непосредственно в контролы.

    КЛ>Которая, кстати, нигде явно не задекларирована.

    Как нигде?
    1)В описании объектной модели.
    2)В описании конкретных контролов.

    КЛ>И в жестком виде дублирует код большинства других контролов.

    Нет дублирования.
    Ни буквы.
    Те вобще.
    На то код и полиморфный.

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

    Эти свойства сами по себе смысла не имеют.

    Они имеют смысл только когда они привязаны к конктретному контролу.
    Те в случае с GridLayout свойства Col и Row без привязки к конкретному контролу не имеют смысла.
    Но контролу о них знать не нужно ибо в разных ситуациях к нему могут быть привязыны разные свойства.
    Ибо если мы этот контрол перетащим скажем на PositionLayout то свойства Col и Row потеряют смысл но понадобятся свойства Top, Left, Bottom, Right.

    Тоже самое касается любых других присоедененных свойств и событий.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[51]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 26.06.07 14:38
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    ГВ>>>>Значит, надо смотреть и на эти алгоритмы. Я пока не понимаю, как минимум, почему эти числа надо именно перемножать.

    AVK>>>Это долго расписывать.

    ГВ>>А ты попробуй.

    AVK>Не буду. Во-первых лень, во-вторых это коммерческая тайна.

    Складно. Просто. Легко запомнить. (c)

    ГВ>>Ясно. Я пока склоняюсь к тому, что те интерфейсы, который показал WolfHound — это очень низкий уровень в иерархии абстракций. Ergo, надо копать остальные абстракции тоже.

    AVK>Зачем?

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

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

    AVK>Это никто читать все равноне будет.

    Я буду. Ибо я этот вопрос и задал.

    ГВ>>, а другие утверждают, что её долго и муторно расписывать. Странно это как-то.

    AVK>А не надо воспринимать это как реальный код, надо воспринимать как пример.



    AVK>Пример размером в мегабайт исходников это нонсенс.


    Весь мегабайт не нужен. Достаточно нескольких простых описаний.

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


    Ясно. Одна беда: о действительной постановке задачи для WPF мы можем только догадываться. И как ты понимаешь, доказательства по аналогии... Далее по тексту.

    ГВ>>>>А куда передаётся owner?

    AVK>>>В специальный объект, аналог PropertyDescriptor.
    ГВ>>А назначение этого объекта?
    AVK>То же, что и у PropertyDescriptor.

    Понятно.

    ГВ>>То есть, фактически, это такой сфероконь?

    AVK>Пример.

    Это сфероконический пример, пока не выяснится контекст, к которому он реально относится.

    ГВ>> А мы-то здесь копья ломаем... Великолепно, брависсимо!

    AVK>Я вобще не знаю что ты тут хочкшь добиться.

    Для начала — внятных и полных ответов на поставленные вопросы вместо рассуждений об автоматизации всего, коммерческих тайнах и профессиональных качествах оппонентов.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[52]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 26.06.07 14:51
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>>>Ясно. Я пока склоняюсь к тому, что те интерфейсы, который показал WolfHound — это очень низкий уровень в иерархии абстракций. Ergo, надо копать остальные абстракции тоже.

    AVK>>Зачем?

    ГВ>Объясню ещё раз, другими словами. Потому что без указаний на конкретные решаемые задачи и конкретные API контрпример WolfHound-а выглядит не лучше, чем высосанный из пальца. Ничем не лучше.


    Это голословное заявление.

    ГВ> А в сумме с ворохом ругательств — вообще как чёрт-те что. Я это буду повторять ровно столько, сколько потребуется.


    А толку то.

    AVK>>Пример размером в мегабайт исходников это нонсенс.


    ГВ>Весь мегабайт не нужен. Достаточно нескольких простых описаний.


    Описаний чего? Ты сам точно не знаешь, чего ты хочешь, но чего то требуешь.

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


    ГВ>Ясно. Одна беда: о действительной постановке задачи для WPF мы можем только догадываться.


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

    ГВ> И как ты понимаешь, доказательства по аналогии... Далее по тексту.


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

    ГВ>>>То есть, фактически, это такой сфероконь?

    AVK>>Пример.

    ГВ>Это сфероконический пример, пока не выяснится контекст, к которому он реально относится.


    Контекст? Что такое в твоем понимании контекст в данном случае?

    ГВ>Для начала — внятных и полных ответов на поставленные вопросы


    Для этого тебе придется задать внятные и понятные конкретные вопросы.

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


    Увы, с коммерческой тайной я ничего поделать не могу.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[53]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 26.06.07 15:44
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    ГВ>>Трудно сказать. Я так понял, что есть ещё некий промежуточный объект, который, собственно, и скрывает от пользователя различия в интерфейсах Attached и не-Attached.

    WH>Вся работа с этими интерфейсам ведется в сериалайзерах и дизайнерах.

    Как я понимаю — иначе эти интерфейсы не используются. Правильно?

    WH>Те там где нельзя знать контролы в лицо.

    WH>Исключение составляет только PropertyGrid ибо он хочет дескрипторы в своем формате. Хочет. Получит. Жалко чтоли. Ибо переписать PropertyGrid гораздо дороже чем обернуть мои дескрипторы в его.

    Понятно. То есть в одном, как минимум, случае эти интерфейсы адаптируются неким PropertyDescriptorAnalog.

    WH>А при реализации конкретной формочки в которой к конкретным контролам биндятся конкретные данные эти интерфейсы не используются.


    Иными словами, назначение этих интерфейсов ограничивается задачами дизайнеров и сериализаторов формочек? Правильно?

    ГВ>>Если это самодостаточная модель, то откуда рассуждения о недопустимой дороговизне создания дополнительных объектов? Модель существует во вполне конкретном окружении и заточена под вполне определённые задачи и характер использования. Собственно именно это (описание использования и окружения) я и пытаюсь из тебя "вытрясти", поскольку без этого в принципе ничего нельзя сказать о проектировании и [не-]уместности принятых решений.

    WH>От туда что это модель метаданных.

    Может, хватит уже метаться от одной абстракции к другой? "Недопустимая дороговизна" может появиться только тогда, когда у нас есть некий оценочный критерий. Сам по себе оценочный критерий это не имманентная сущность вселенной, а следствие вполне конкретных use case. Я понятно выражаюсь? Ergo, если говоришь о [не]допустимости оценки, то проясни критерии, по которым эта оценка накладывается, а прояснив критерии — объясни и то, откуда они взялись.

    WH>Заводить на каждый объект еще несколько десятков только ради того чтобы один раз передать на один параметер меньше...

    WH>Ты сам то оценил все прелести этого подхода?

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

    ГВ>>Хотя бы в приблизительных набросках обычно можно. Так, что будут ясны основные ограничения, откуда они берутся и т.д, и т.п. Пока что задача вытряхивается по кусочкам.

    WH>В приблизительных я описывал не раз.

    Они оказались недостаточными, чтобы объяснить те самые основные основные ограничения. Пока ещё не выяснены вопросы относительно сущностей "экземпляр свойства" и "описание свойства". Собственно, вопросы такие: где они хранятся и как извлекаются. Чуть раньше этот вопрос был поднят, но там мы отвлеклись.

    ГВ>>Решение Кирилла иллюстрирует прежде всего подход. Соответственно, коль скоро дело доходит до сравнения результатов применения подходов, то нужно брать и сопоставимые задачи.

    WH>Знаем мы этот подход... Навоять на коленке абы как и свалить...
    WH>А потом пусть другие разбираеются нафига едиту картинка или картинке текст.
    WH>Кстати я на этот простейший вопрос так и не получил ответа.
    WH>А там еще масса подобных этому вопросов.

    Я что-то не понятно написал? Ну, повторюсь. Задачи должны быть сопоставимыми. Иначе обусждение выльется в обмен колкостями (что и имеем).

    ГВ>>"Бред", спору нет, это аргумент офигенной силы и сильного колдунства.

    WH>Все ясно.
    WH>По сути сказать нечего.

    Отвечаю по сути: это НЕ бред.

    ГВ>>Ещё одна абстракця? Что такое "чистота"?

    WH>Это когда в решении есть только то что нужно. Не больше и не меньше.
    WH>В решении Кирилла куча паразитных свойств и связей.
    WH>Нафига едиту картина? Ну нафига? Можешь сказать?
    WH>Зачем эта грязь на ровном месте?

    Я вот, могу у тебя спросить с аналогичной пиитикой: "нафига объекту не его свойства"? Пока что не буду. Так что, давай без риторических восклицаний.

    ГВ>>На самом деле, тут сталкиваются более узкая и более широкая постановки. Только и всего.

    WH>Нет.
    WH>Тут сталкиваются подходы:

    WH>1)Запихнем все в одну кучу и какимто чудом заставим работать.

    WH>Вполне себе подход если нужно по быстрому срубить бабла и свалить.

    WH>2)Разложем все по полочкам и все само заработает.

    WH>А при этом подходе можно долго развивать сложную систему.
    WH>Причем проблем с реализацией того о чем и не подозревали не будет.

    С тем, о чём не подозревали обычно возникают те проблемы, о которых и не подозревали.

    ГВ>>Вопрос о правомерности сужения задачи Кириллом [...] Во всяком случае, я был бы рад посмотреть на удобное воплощение сплайн-организованного интерфейса пользователя (я не считаю это невозможным).

    WH>Это лейаут исключительно как пример того что в модель Кирилла не впишется.
    WH>В прочем в нее вобще ничего не впишется.

    Ты уж уточни: это очередной сфероконоь или имеется хоть один реальный случай использования splain-based layout? Пока что я склоняюсь к тому, что это некий гипотетический случай.

    WH>А вот в мою модель впишется.

    WH>Даже с учетом искривления контролов если оно конечно комуто будет нужно. (Хотя вероятность существует http://fotki.yandex.ru/users/romashka-smile88/view/5066/ )

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

    WH>Да стандартный рендер Win32 придется послать и использовать что-то типа http://antigrain.com/ или что-то другое. Тут нужны исследования.


    Так, ясно. Опять слышу тяжёлые перекаты копыт сфероконя.

    WH>Но мне будет нужно переписать только рендер и реализацию основных контролов, а их в моем случае не много. Все составные автоматически заработают.

    WH>Вся написанная логика будет рабоать как работала.

    Если упомянутая логика не использует специфику реализации контролов, то это очевидно.

    WH>Кириллу придется переписать все.


    Пока что это спорный вопрос. Как ты понимаешь, от многократного повторения этого тезиса истинность его не растёт.

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

    ГВ>>Хотя на самом деле обе постановки имеют примерно одинаковое право на существование.
    WH>Не имеют.
    WH>Задача построение слобосвязанной архитектуры встает автоматически когда нужно написать что-то большее чем "Привет мир!".

    Автоматически только машины работают.

    WH>Просто по умолчанию.

    WH>Нет никакого поджимания/расширения.

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

    Но! Имеется разница в самом наборе свойств. Если Кирилл явно его ограничивает, то ты такое ограничение не вводишь. Правда, при этом Кирилл сразу же определяет и конкретные способы использования этих свойств, а ты — нет. Вернее, у тебя ограничения другого характера, например, Event отличается от Property. Отсюда и мои рассуждения о "поджимании/расширении" задачи.

    WH>Упорядочивание и уменьшение связанности системы это одна из основных задач иначе долгоживущею систему не сделать.

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

    Очень хорошо. Я это слышал ещё до того, как компонентные архитектуры стали общим местом. Бардака с тех пор меньше не стало. Вот же, зараза!

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

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

    Знаешь, в чём парадокс? В том, что для того, чтобы сериалайзеры и дизйнеры заработали с тем, что они и "в глаза не знают", нужно только, чтобы это самое незнакомое чудище содержало соответствующий API, с которым прекрасно знакомы сериалайзеры и дизайнеры.

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

    WH>А я и так знаю что будет в подходе Кирилла при поддержке и добавлении не предусмотренных изначально функций.
    WH>Ибо я видил много таких "минимальных решений" со всеми одна и таже фигня.
    WH>Пока находишься в рамках решения все работает но шаг в сторону и все посыпалось со словами "давайте все перепишем..."
    WH>Вот только после переписывания получается тоже самое.

    Такое происходит с любым дизайном. Абсолютно. Исключений нет. Если изменились требования, предъявляемые к конкретной программе, эта программа модифицируется. Если изменятся требоваия к самой компонентной инфраструктуре, ты тоже будешь её [до|пере]писывать, никуда не денешься.

    ГВ>>Здесь, вон, других задач хватет: те же сериалайзеры/дизайнеры. ИМХО, их как раз можно за более или менее разумное время описать.

    WH>Сериалайзеры при наличии полной метаинформации штука тривиальная. Тупой рекурсивный обход дерева. Можно расширить до графа но мне это не требовалось.
    WH>А у дизайнеров основные заморочки не с метаданными, а с самим дизайнером.

    О! Уже теплее.

    ГВ>>А абстрактные сериалайзеры — они как, совсем абстрактные, или имеют некий собственный интерфейс и/или требования к интерфейсу сериализуемых объектов?

    WH>Им нужны только метаданные.
    WH>Те на вход поступает IDomain и корневой объект.
    WH>Дальше
    WH>
    WH>IType type = domain.GetType(obj.GetType());
    WH>

    WH>Теперь мы знаем про объект все что нам нужно.

    О! Ещё теплее. А дальше что происходит?
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[53]: О сопровождении
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 26.06.07 16:05
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    ГВ>>Для начала — внятных и полных ответов на поставленные вопросы

    AVK>Для этого тебе придется задать внятные и понятные конкретные вопросы.

    Я хочу увидеть sequence diagram а) сериализации, б) загрузки контрола редактором.

    Подойдут и словесные аналоги.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[53]: О сопровождении (рассуждения)
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 26.06.07 16:18
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>>>Пример размером в мегабайт исходников это нонсенс.

    ГВ>>Весь мегабайт не нужен. Достаточно нескольких простых описаний.
    AVK>Описаний чего? Ты сам точно не знаешь, чего ты хочешь, но чего то требуешь.

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

    ГВ>> И как ты понимаешь, доказательства по аналогии... Далее по тексту.

    AVK>Это не доказательства. Это пример такой архитектуры в железе.

    WPF — это Windows Presentation Foundation?

    ГВ>>Это сфероконический пример, пока не выяснится контекст, к которому он реально относится.

    AVK>Контекст? Что такое в твоем понимании контекст в данном случае?

    Это всё, что непосредственно взаимодействует с показанными интерфейсами. Плюс требования, плюс... Не знаю, что ещё может потребоваться, а выдумывать не буду.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[54]: О сопровождении
    От: WolfHound  
    Дата: 26.06.07 17:27
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>Как я понимаю — иначе эти интерфейсы не используются. Правильно?

    Эти интерфейсы нужны там где нужны метаданные.
    Если метаданные не нужны не нужны и эти интерфейсы.

    ГВ>Понятно. То есть в одном, как минимум, случае эти интерфейсы адаптируются неким PropertyDescriptorAnalog.

    Нет. Просто создаются наследники PropertyDescriptor ибо PropertyGrid'у нужны именно они.

    ГВ>Иными словами, назначение этих интерфейсов ограничивается задачами дизайнеров и сериализаторов формочек? Правильно?

    В общем случае нет.

    ГВ>Может, хватит уже метаться от одной абстракции к другой? "Недопустимая дороговизна" может появиться только тогда, когда у нас есть некий оценочный критерий. Сам по себе оценочный критерий это не имманентная сущность вселенной, а следствие вполне конкретных use case. Я понятно выражаюсь? Ergo, если говоришь о [не]допустимости оценки, то проясни критерии, по которым эта оценка накладывается, а прояснив критерии — объясни и то, откуда они взялись.

    А может хватит дурочку включать?
    Что и так не ясно что создание тысячь объектов на пустом месте в операциях скорость которых критична глупо?

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

    Ты про что именно?
    Если про экземпляры классов реализующие IProperty и IAttachedProperty то создаются они при старте приложения и хранятся внутри экземпляра класса реализующего IType

    ГВ>Я что-то не понятно написал? Ну, повторюсь. Задачи должны быть сопоставимыми. Иначе обусждение выльется в обмен колкостями (что и имеем).

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

    ГВ> Отвечаю по сути: это НЕ бред.

    Те минимизация кода ценой введения массы паразитных связей не бред?

    ГВ>Я вот, могу у тебя спросить с аналогичной пиитикой: "нафига объекту не его свойства"? Пока что не буду. Так что, давай без риторических восклицаний.

    Я в отличии от тебя могу ответить на этот вопрос.

    ГВ>С тем, о чём не подозревали обычно возникают те проблемы, о которых и не подозревали.

    У меня их возникает ровно столькоже как если бы я все делал с нуля.
    А когда все завязано на все...

    ГВ>Ты уж уточни: это очередной сфероконоь или имеется хоть один реальный случай использования splain-based layout? Пока что я склоняюсь к тому, что это некий гипотетический случай.

    А оно имеет значение?
    На его месте может оказаться любой другой лейаут.
    Которому нужны данные отличные от того на что заложился Кирилл.

    WH>>Да стандартный рендер Win32 придется послать и использовать что-то типа http://antigrain.com/ или что-то другое. Тут нужны исследования.

    ГВ>Так, ясно. Опять слышу тяжёлые перекаты копыт сфероконя.
    Чего простите?
    Просили искривление контролов. Получите новый рендер ибо тот что в винде так не умеет.

    ГВ>Автоматически только машины работают.

    Какое мудрое обобщение о великий гуру.

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

    На самом деле любую программу написанную на полном по Тьюригу языке можно переписать на любом другом полном по Тьюренгу языке.
    Намек ясен?

    ГВ>Очень хорошо. Я это слышал ещё до того, как компонентные архитектуры стали общим местом. Бардака с тех пор меньше не стало. Вот же, зараза!

    Бардак он в голове...

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

    Прикол в том что это API можно приклеить сбоку.
    Ибо IDomain.GetType
    А IDomain можно реализовать как угодно.

    ГВ>Такое происходит с любым дизайном. Абсолютно. Исключений нет. Если изменились требования, предъявляемые к конкретной программе, эта программа модифицируется. Если изменятся требоваия к самой компонентной инфраструктуре, ты тоже будешь её [до|пере]писывать, никуда не денешься.


    Если решение достаточно полиморфно то нужно только дописать новую функциональность.
    Но переписывать не нужно.

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

    ГВ>О! Ещё теплее. А дальше что происходит?

    Тупой рекурсивный обход дерева.

    (С)Я
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[48]: О сопровождении
    От: EvilChild Ниоткуда  
    Дата: 26.06.07 17:27
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Например нужно мне было распарсить логи не тривиальным образом.

    WH>Тк время было вечером и делать было нечего...

    Можешь рассказать какие из фич Nemerle помогли решить задачу эффективнее (если это имело место быть), чем если бы это был C#?
    По описанию задачи не могу пока представить где могла пригодиться вся его мощь.

    И навскидку во сколько компактнее получилось решение?
    now playing: Corrupt Souls — Seppuku
    Re[49]: О сопровождении
    От: WolfHound  
    Дата: 26.06.07 18:23
    Оценка:
    Здравствуйте, EvilChild, Вы писали:

    EC>Можешь рассказать какие из фич Nemerle помогли решить задачу эффективнее (если это имело место быть), чем если бы это был C#?

    EC>По описанию задачи не могу пока представить где могла пригодиться вся его мощь.
    А вся и близко не пригодилась. Пока... я хочу сделать болие простой синтаксис чем получился сейчас, а тут уже нужна тяжелая артилерия... макросы!
    [миниакальный смех] Му-ха-ха-ха!... [/миниакальный смех]

    EC>И навскидку во сколько компактнее получилось решение?

    По сравнению с C#1 раз в натцать. По сравнению с C#3 чуть меньше.
    Тут главное ФВП которые по совместительству функции расширения чтобы можно было их через точку писать, замыкания и итераторы (yield). Все это есть в C#3. Хотя в C#3 сильно хуже с выводом типов. Этот факт может все опошлить.
    Но проверять мне лень.

    Основное чего точно нет это макроса regexp match.

    Хотя локальные функции в некоторых местах сильно упростили логику фильтров по сравнению с циклами.
    Вот этого монстрика я написал скорее по приколу чем для дела.
    С локальными функциями и хвостовой рекурсией получилось довольно просто.
    Но как его написать на циклах с сохранением читабельности можно конечно подумать но мне лень.
            public MapReduceLazy[T, Acc, R]
                ( this seq : SCG.IEnumerable.[T]
                , eq : T * T -> bool
                , startSeq : T -> Acc
                , fn : T * Acc -> Acc
                , endSeq : Acc -> R
                ) : SCG.IEnumerable.[R]
            {
                using (seq = seq.GetEnumerator())
                {
                    def processSubSeq(cur)
                    {
                        def process(cur, acc)
                        {
                            def acc = fn(cur, acc);
                            if (seq.MoveNext())
                            {
                                def cur2 = seq.Current;
                                if (eq(cur, cur2))
                                {
                                    process(cur2, acc);
                                }
                                else
                                {
                                    (cur2, acc, true)
                                }
                            }
                            else
                            {
                                (cur, acc, false)
                            }
                        }
                        def (cur, acc, next) = process(cur, startSeq(cur));
                        yield endSeq(acc);
                        when (next)
                            processSubSeq(cur);
                    }
                    when (seq.MoveNext())
                    {
                        processSubSeq(seq.Current)
                    }
                }
            }

    С другой стороны:
            public FlattenLazy[T](this seq : SCG.IEnumerable.[SCG.IEnumerable.[T]]) : SCG.IEnumerable.[T]
            {
                foreach (seq in seq)
                    foreach (val in seq)
                        yield val;
            }


    Так что фичи разные нужны. Фичи разные важны.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[50]: О сопровождении
    От: EvilChild Ниоткуда  
    Дата: 26.06.07 18:34
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

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

    WH>[миниакальный смех] Му-ха-ха-ха!... [/миниакальный смех]
    Пример того, что хочется упростить можно?

    WH>Тут главное ФВП которые по совместительству функции расширения чтобы можно было их через точку писать, замыкания и итераторы (yield).

    Естественно.
    WH>Все это есть в C#3.
    Ага.

    WH>Основное чего точно нет это макроса regexp match.

    Что за зверь?
    now playing: Corrupt Souls — 1138
    Re[54]: О сопровождении (рассуждения)
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 27.06.07 08:52
    Оценка:
    Здравствуйте, Геннадий Васильев, Вы писали:

    ГВ>>> И как ты понимаешь, доказательства по аналогии... Далее по тексту.

    AVK>>Это не доказательства. Это пример такой архитектуры в железе.

    ГВ>WPF — это Windows Presentation Foundation?


    Да.

    ГВ>>>Это сфероконический пример, пока не выяснится контекст, к которому он реально относится.

    AVK>>Контекст? Что такое в твоем понимании контекст в данном случае?

    ГВ>Это всё, что непосредственно взаимодействует с показанными интерфейсами.


    Ну то естьопять ничего конкретного. Ты вобще отдаешь себе отчет в том, что "всё, что непосредственно взаимодействует с показанными интерфейсами" это гора кода? Но это даже не самое страшное. Самое страшное то, что завтра появится еще куча кода, которая взаимодействует с этими самыми интерфейсами. Так что ответить на твой вопрос н6евозможно в принципе.

    ГВ> Плюс требования, плюс... Не знаю, что ещё может потребоваться, а выдумывать не буду.


    Круто. Сам не знаешь что ты хочешь.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[53]: О сопровождении
    От: prVovik Россия  
    Дата: 27.06.07 12:18
    Оценка:
    Здравствуйте, Трурль, Вы писали:

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


    ГВ>>Это сфероконический пример, пока не выяснится контекст, к которому он реально относится.

    Т>Красивый термин "сфероконический". Вызывает ассоциации то ли с древнерускими шлемами, то ли с кониками в сферическом пространстве.

    Еще неплохо звучит: "сфероканонический"
    лэт ми спик фром май харт
    Re[55]: Благодарности
    От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
    Дата: 27.06.07 19:51
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>[...] а на словах попробую описать (опустив подробности реализации).


    Андрей, отдельное спасибо за конструктив. Сейчас обдумываю, быстро ответить не смогу.
    Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
    P.S.: Винодельческие провинции — это есть рулез!
    Re[48]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 28.06.07 09:15
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    КЛ>>Сложность никуда не выносят. Ее устраняют при помощи модели.

    WH>Нет. Сложность устранить нельзя.
    Вы это не доказали.

    WH>Ее можно перенести на другой уровень но не устранить.

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

    WH>Модель римских чисел примитивна.

    Вы ошибаетесь. Например, вавилонская шестидесятиричная система счисления была хуже римской из-за того, что для обозначения, например, числа 5 нужно было рисовать пять колышков. Греческая система была хуже из-за обилия цифр (все символы греческого алфавита). А римские цифры хороши своей экономичностью. Смотрите сами: IV — это четыре, а VI — это шесть. Идея, когда от положения цифры (до или после), зависит число (т.е. цифра либо вычитается либо прибавляется) была нетривиальной.

    Так что римская система была очень продвинутой для своего времени.

    WH>Там есть только конкретные числа.

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

    КЛ>>Мягко говоря, это не так. В римской системе зарезервированы знаки для чисел: 1 (I), 5 (V), 10 (X), 50 (L), 100 (C), 1000 (M — что ли?). Остальные числа получаются путем добавления цифр слева или справа. В некотором роде, римскую систему счисления тоже можно назвать позиционной.

    WH>Это не существенные детали.
    WH>Совершенно не важно записано число одной закорючкой или несколькими.
    WH>Сущьность системы от это не меняется вобще.
    Мягко говоря, такие фразы свидетельствуют о том, что Вы не в теме. Т.е. пытаетесь рассуждать о сложности модели, не зная фактуры.

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

    Так вид числа как раз-таки и зависит от модели.

    КЛ>>Его все равно придется реализовывать либо одним (через позиционную систему с фиксированным основанием), либо другим (через написание алгоритмов для умножения римских чисел) способом.

    WH>Это не важно.
    WH>Относительная стоимость реализации тем ниже чем чаще она используется.
    Без изобретения позиционной системы с фиксированным основанием не было бы и компьютера. Так что реализацию все равно придется писать. Вот напишите, и мы сравним сложность.

    WH>Если оно написано один раз, имеет простой, четкий, понятный интерфейс и работает то нет.

    Не играет роли — реализация все равно нужна. Так что — реализацию в студию.

    WH>Так я о том и говорю. Сложность ни куда и ни когда не девается.

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

    WH>Конвеер (без перенастройки) может выпускать только совершенно идентичные изделия.

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

    WH>Я говорил о принципе.

    WH>Те принцип колеса это фундамент, а создание конкретного колеса это уже детали.
    Конвеер контролов тоже не изобретает никаких контролов. Он просто их воспроизводит в определенной последовательности.
    Такое возможно, потому что во множестве контролов заключено конечное (и весьма небольшое!) число принципов.

    WH>>>Да обсудить и утвердить общею концепцию системы нужно. Но проектировать толпой народа кнопку... это мягко говоря перебор.

    КЛ>>Тут Вы лукавите — как-то вдруг забыли про сложные контролы.
    WH>А именно? Самый сложный контрол это VirtualTreeGrid ничего сложеней нет.
    В таком случае, конвеер — это то, что доктор прописал. Раз нет ничего сложнее...

    WH>Если ты конечно не собрался MSWord написать.

    Не собирался. Об этом-то и говорил.

    WH>Только саму программу дроблю на болие мелкие абстракции.

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

    WH>А ты можешь также просто написать алгоритм который также хорошо паралелится?

    WH>Причем паралелится совершенно прозрачно для клиентского кода.
    Могу. Но пиписьками мериться не буду. Не в том возрасте.

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

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

    КЛ>>А возможность написания контрола, который добавляет тултипы ко всем другим контролам на форме — это не лишняя связь?

    WH>Нет. Лишняя связь это добавление тултипов непосредственно в контролы.
    Так у Вас связь осталась. Просто она не задекларирована. Соответственно, как выражаются Ваши коллеги, контракт раздут...

    КЛ>>И в жестком виде дублирует код большинства других контролов.

    WH>Нет дублирования.
    Как же нет? Когда для выполнения одинаковых задач Вы используете разные интерфейсы. Просто в одном интерфейсе меньше параметров, чем в другом.

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

    WH>Эти свойства сами по себе смысла не имеют.
    WH>Они имеют смысл только когда они привязаны к конктретному контролу.
    WH>Те в случае с GridLayout свойства Col и Row без привязки к конкретному контролу не имеют смысла.
    WH>Но контролу о них знать не нужно ибо в разных ситуациях к нему могут быть привязыны разные свойства.
    WH>Ибо если мы этот контрол перетащим скажем на PositionLayout то свойства Col и Row потеряют смысл но понадобятся свойства Top, Left, Bottom, Right.
    Тем не менее Вы все равно прикрепляете эти взаимосвязи к контролу (т.е. вставляете в него, пусть и в виде добавленных свойств). Гораздо выгоднее держать внешние взаимосвязи в отдельном объекте или хранилище, как, собственно говоря, я и предлагал. Прикреплять ничего не надо, а связи хранятся и редактируются.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[49]: О сопровождении
    От: WolfHound  
    Дата: 28.06.07 12:16
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Мягко говоря, такие фразы свидетельствуют о том, что Вы не в теме. Т.е. пытаетесь рассуждать о сложности модели, не зная фактуры.

    Нет. Это свидетельствует о том что ты не способен выделять абстракции.
    Ты в очередной раз зациклился на деталях реализации пропустив суть.
    По простому это называется: За деревьями не видишь леса.

    КЛ>Без изобретения позиционной системы с фиксированным основанием не было бы и компьютера.

    Это мягко говоря не доказуемо.

    КЛ>Так что реализацию все равно придется писать. Вот напишите, и мы сравним сложность.

    Один раз.
    Это главное.

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

    WH>>Если оно написано один раз, имеет простой, четкий, понятный интерфейс и работает то нет.

    КЛ>Не играет роли — реализация все равно нужна. Так что — реализацию в студию.
    Но ее нужно написать один раз.
    А использовать можно сколько угодно раз.

    КЛ>А кто сказал, что контролы не являются идентичными изделиями? Если между ними и есть различия, то их можно свести к параметрам — так, что конвеер не придется перенастраивать.

    Если ты про надпись на кнопке то да.
    Если ты про создание собственно кнопки, едита, итп то нет.

    КЛ>Конвеер контролов тоже не изобретает никаких контролов. Он просто их воспроизводит в определенной последовательности.

    КЛ>Такое возможно, потому что во множестве контролов заключено конечное (и весьма небольшое!) число принципов.
    Если ты каждую кнопку пишешь с нуля то да иначе нет.

    WH>>А именно? Самый сложный контрол это VirtualTreeGrid ничего сложеней нет.

    КЛ>В таком случае, конвеер — это то, что доктор прописал. Раз нет ничего сложнее...
    Зачем конвеер для того чтобы создать:
    1)Одну кнопку.
    2)Один едит.
    3)Один image.
    4)Один VirtualTreeGrid.

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

    Вернее так:
    Один раз создается и фиксируется интерфейс. Без каких либо завязок на платформу.
    И делается одна реализация на каждую платформу. Ибо сделать одну реализацию для win и web просто не возможно.
    Там даже маловероятно наличие общего кода ибо платформы фундаментально различны.
    Кроме сериалайзеров и тп ибо они полностью абстрагированны от контролов при помощи метаданных те работают с объектами вобще и контролами в частности исключительно через строгий интерфейс. В данном случае набор интерфейсов который ты никак не можешь/не хочешь понять.

    КЛ>Вот об этом-то и речь: чтобы сгруппировать нечто сложное, нужно его сначала раздробить.

    КЛ>Тот же принцип можно применить и к контролам.
    Нет. Нужно выделить основные абстракции.
    А выделение абстракций автоматически приводит к разделению кода.
    Причем к очень строгому разделению ибо строгие интерфейсы (контролируемые компилятором) не дают реализациям цеплятся друг за друга.
    Таким образом мы может менять (включая менять во время исполнения) реализации не трогая клиентский код.

    WH>>А ты можешь также просто написать алгоритм который также хорошо паралелится?

    WH>>Причем паралелится совершенно прозрачно для клиентского кода.
    КЛ>Могу. Но пиписьками мериться не буду. Не в том возрасте.
    Слив засчитан.
    Эта задача не решается без выделения абстракций потока и фильтра. (названия могут быть другие но суть от этого не изменится)

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

    КЛ>Как раз-таки очень хорошо понимаю. И описываю проблемы полиморфных программ со знанием дела.

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

    КЛ>Тем более, что Ваш добавляльщик тултипов — из той же серии...

    Из какой?

    КЛ>Так у Вас связь осталась. Просто она не задекларирована. Соответственно, как выражаются Ваши коллеги, контракт раздут...

    Никуда он не раздут.
    Контролы не знают о том что к ним цепляют тултипы.
    Болие того есть масса способов чтобы и не узнали даже на уровне реализации...

    КЛ>Как же нет? Когда для выполнения одинаковых задач Вы используете разные интерфейсы. Просто в одном интерфейсе меньше параметров, чем в другом.

    Где?
    Нет таких мест.
    Каждый интерфейс делает ровно то что должен.
    И ни один другой не повторяет функциональность.

    КЛ>Тем не менее Вы все равно прикрепляете эти взаимосвязи к контролу (т.е. вставляете в него, пусть и в виде добавленных свойств). Гораздо выгоднее держать внешние взаимосвязи в отдельном объекте или хранилище, как, собственно говоря, я и предлагал. Прикреплять ничего не надо, а связи хранятся и редактируются.

    Прикрипление исключительно логическое.
    Для прикрипления и работы с прикрепленными свойствами есть строгий интерфейс.
    Как это реализованно значения не имеет.
    Есть множество вариантов:
    1)Глобальное хранилище. (Как по мне бред полный. Куча проблем и никаких плюсов.)
    2)Каждый объект который цепляет свойства к другим объектам хранит у себя словарик (объект -> набор присоедененных свойств).
    3)Каждый объект хранит у себя словарик (ключ присоедененного свойства (у нас всеравно есть метаданные ) -> значение присоедененного свойства). Доступ к этому словарику происходит на уровне некого интерфейса специфичного для конкретной реализации.
    ...тут еще очень много вариантов...

    Когда я это делал был выбран второй вариант.
    Сейчас мне больше нравится третий ибо несколько проще реализовать.

    Но это все детали реализации.
    Они важны на уровне реализации и только на уровне реализации контролов.

    Пользователи контролов не знают (и должны даже не подозревать) об этих особенностях ибо они могут быть разными у разных реализаций или могут быть изменены при очередном рефакторинге одной из реализаций.
    Все что знают пользователи это строгие интерфейсы в которых нет ничего лишнего.
    Те все формочки, все составные контролы,... знают интерфейсы и только интерфейсы и не подозревают о каких бы то ни было деталях реализации.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[55]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 28.06.07 14:05
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>10) Если элемент — событие...

    AVK>11) Если сериализация требуется...
    AVK>13) Если в п.10 имеем не событие, а свойство...
    AVK>14) Если интерцептор есть и подтвердил то, что он хочет перехватить, то...
    AVK>15) Если нет, то...
    AVK>16) Если сериализация требуется, то...
    AVK>17) Если для свойства есть кастомный сериализатор, то...
    AVK>18) Если значение свойства является компонентом, то...
    AVK>19) Если нет — ...
    AVK>20) Если да — ...
    AVK>21) Если свойство является коллекцией (реализует IEnumerable), то...
    AVK>22) Для каждого элемента проверяем, является ли он компонентом
    AVK>23) Если да, то...
    AVK>24) Если нет, то...
    AVK>26) Если ни одна из проверок свойства не вернула true, то...

    Итого получается 14 проверок. Поэтому и sequence-диаграмма будет сложной. И код метода тоже сложный. Его, можно упростить, если:

    1) Сгруппировать однородные проверки в функции.

    Посмотрите, у Вас шаг 16 совпадает с шагом 11. И там, и там проверяется, нужна ли сериализация. Только в одном случае — для события, а в другом — для свойства.

    AVK>11) Если сериализация требуется...

    AVK>16) Если сериализация требуется, то...

    2) Устранить различия между разными объектами на верхнем уровне.

    Например, значение свойства может быть:

    1) Простым типом данных.
    2) Компонентом.
    3) Коллекцией.

    Почему бы эти различия не скрыть внутри функции Сериализовать Свойство?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[56]: О сопровождении
    От: WolfHound  
    Дата: 28.06.07 14:12
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Почему бы эти различия не скрыть внутри функции Сериализовать Свойство?

    Объясни пожалуйста как из того что написал Андрей следует что все это в одной функции?
    Я не понимаю ход мыслей.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[56]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 28.06.07 14:20
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>1) Сгруппировать однородные проверки в функции.


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

    КЛ>2) Устранить различия между разными объектами на верхнем уровне.


    IsSerializable и так принадлежит базовому интерфейсу и для свойства и для метода.

    КЛ>Например, значение свойства может быть:


    КЛ>1) Простым типом данных.

    КЛ>2) Компонентом.
    КЛ>3) Коллекцией.

    КЛ>Почему бы эти различия не скрыть внутри функции Сериализовать Свойство?


    Ты там прочел в начале, что подробности реализации опущены? Оно в реальном коде и есть одна функция SerializeProperty. Здесь я описал последовательность вызовов, а не структуру функций.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[50]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 28.06.07 15:06
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Нет. Это свидетельствует о том что ты не способен выделять абстракции.

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

    WH>Ты в очередной раз зациклился на деталях реализации пропустив суть.

    WH>По простому это называется: За деревьями не видишь леса.
    В реализации — в данном конкретном случае — и состоит суть. Потому что алгоритм писать надо. И сопровождать его тоже надо.

    В Вашей модели (с римскими цифрами) все хорошо. Одно отсутствует — реализация. И поэтому модель бесполезна.

    КЛ>>Без изобретения позиционной системы с фиксированным основанием не было бы и компьютера.

    WH>Это мягко говоря не доказуемо.
    Компьютер работает с двоичной системой счисления, а двоичная система счисления — это позиционная система с основанием 2.

    WH>Дело в том что дорогая реализация написанная один раз и используемая миллион раз через простой интрефейс гораздо дешевле чем дешовая реализация написанная миллион раз по месту.

    Это неважно. У Вас нет никакой.

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

    Ваши подсчеты будут бесполезны, т.к. у Вас нет реализации.

    WH>Но ее нужно написать один раз.

    WH>А использовать можно сколько угодно раз.
    Неважно — реализация-то у Вас отсутствует.

    WH>Зачем конвеер для того чтобы создать:

    WH>1)Одну кнопку.
    WH>2)Один едит.
    WH>3)Один image.
    WH>4)Один VirtualTreeGrid.
    Если у Вас всего 4 контрола, то Вам не нужен и компонентный подход.

    КЛ>>Тем более, что Ваш добавляльщик тултипов — из той же серии...

    WH>Из какой?
    Из серии запутанного кода...

    КЛ>>Так у Вас связь осталась. Просто она не задекларирована. Соответственно, как выражаются Ваши коллеги, контракт раздут...

    WH> Никуда он не раздут.
    WH>Контролы не знают о том что к ним цепляют тултипы.
    Да, и сопровождающий программист тоже не знает. Никто не знает, а тултипы добавляются. Вот и не задекларированная связь!

    КЛ>>Как же нет? Когда для выполнения одинаковых задач Вы используете разные интерфейсы. Просто в одном интерфейсе меньше параметров, чем в другом.

    WH>Где?
    WH>Нет таких мест.
    WH>Каждый интерфейс делает ровно то что должен.
    WH>И ни один другой не повторяет функциональность.
    Мне этот диалог напоминает хождение по кругу:
    — Сильно ли различается код, использующий интерфейсы IProperty и IAttachedProperty?
    — Нет, не сильно.
    — В чем заключается различие?
    — В случае IAttachedProperty добавляется еще один объект?
    — Нельзя ли унифицировать интерфейсы и вместо двух из них оставить один?
    — Нет, нельзя.
    — Почему?
    — Для attached нужно получить еще один объект.
    — Нельзя ли инкапсулировать получение этого объекта?
    — Нет, нельзя.
    — Почему?
    — Потому что это разные сущности.
    — Почему сущности разные?
    — Потому что разные
    — Разве код использования этих сущностей не одинаковый?
    — Нет разный.
    — В чем различие?
    — В дополнительном объекте.
    — Нельзя ли его инкапсулировать?
    — И т.д. по кругу.

    Вы уж определитесь все-таки — разные или не разные? И если разные, то в чем состоит различие?

    Совсем уж разжевываю: Нельзя ли добавить в методы IProperty еще один параметр, и сделать интерфейс полностью похожим на IAttachedProperty? Затем — убрать IAttachedProperty и использовать в обоих случаях IProperty. Только в случае, если свойство не прикрепленное, а свое, в качестве первого параметра передается null.

    Можно ли будет в этом случае унифицировать вызывающий код и использовать его для обоих (attached и не-attached) случаев? Если нельзя, то почему?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[57]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 28.06.07 15:11
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Объясни пожалуйста как из того что написал Андрей следует что все это в одной функции?

    WH>Я не понимаю ход мыслей.
    Потому что в противном случае запись выглядела бы так:

    Сериализовать Дерево
    1) ...
    2) ...
    3) Сериализовать Свойство

    Сериализовать Свойство
    1) ...
    2) ...
    3) ...

    ИМХО, проще для понимания.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[57]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 28.06.07 15:12
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Там всего одна проверка и ее так просто сгруппировать не получится, потому что последовательность проверок в случае свойств и событий разная. В свойстве есть интерцептор и его надо обязательно проверять до проверки сериализуемости.

    А что такое интерцептор? В чем заключается его функция?
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[51]: О сопровождении
    От: WolfHound  
    Дата: 28.06.07 15:54
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

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

    Из чего это следует?
    Уж не из того ли что я не бросил все и не побежал этим заниматься?

    КЛ>В Вашей модели (с римскими цифрами) все хорошо. Одно отсутствует — реализация. И поэтому модель бесполезна.

    Модель ничего не знает о том что там за числа.
    Она знает что есть числа и что их можно складывать, умножать и тп.
    А римские они или нет это не важно.

    WH>>Дело в том что дорогая реализация написанная один раз и используемая миллион раз через простой интрефейс гораздо дешевле чем дешовая реализация написанная миллион раз по месту.

    КЛ>Это неважно. У Вас нет никакой.
    Не важно.
    Понадобится будет.
    А так как это мне
    а)Не интересно
    б)Мне за это никто не заплатит
    Я это писать не буду.

    КЛ>Компьютер работает с двоичной системой счисления, а двоичная система счисления — это позиционная система с основанием 2.

    Те невозможно построить комп на римских чиселках?
    Сильно.
    Я подозревал что с пониманием предмета тяжело но что до такой степени...

    КЛ>Если у Вас всего 4 контрола, то Вам не нужен и компонентный подход.

    1)Откуда следует что у меня только 4 контрола?
    2)Почему мне не нужен компонентный подход если он облегчает жизнь даже в случае если контрол только один?
    Жизнь он облегчает тем что формализует контракты и не дает зацеписаться за детали реализации.
    Что значительно упрощает поддержку и развитие.

    КЛ>Да, и сопровождающий программист тоже не знает. Никто не знает, а тултипы добавляются. Вот и не задекларированная связь!

    Я уже говорил что это задокументированно:
    1)В описании объектной системы.
    2)В описании контрола.
    Но чукча похоже не читатель...

    КЛ>Можно ли будет в этом случае унифицировать вызывающий код и использовать его для обоих (attached и не-attached) случаев?

    Нельзя.

    КЛ>Если нельзя, то почему?

    Я уже много раз писал.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[52]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 28.06.07 19:46
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

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

    WH>Из чего это следует?
    Из того, что Вы приводите тезисы и не берете на себя труд доказательства.

    WH>Уж не из того ли что я не бросил все и не побежал этим заниматься?

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

    WH>Модель ничего не знает о том что там за числа.

    Это неважно — задача была про римские цифры.

    WH>Она знает что есть числа и что их можно складывать, умножать и тп.

    Нужно было рассмотреть только умножение.

    WH>А римские они или нет это не важно.

    У Вас нет реализации ни для римских, ни для вавилонских, ни для греческих цифр. В принципе, меня устроит только алгоритм для римских цифр (без преобразования в позиционную систему счисления с фиксированным основанием). Но если Вы приведете алгоритмы умножения и для вавилонских, и для греческих цифр, мне тоже будет интересно. Но пока что нет алгоритма даже для римских цифр.

    Да что там алгоритма! Я просил просто перемножить два конкретных числа! Вы и этого не сделали!

    Итак, что же мы имеем на выходе? Вы построили суперабстрактную, но не работающую модель. Почему не работающую? Потому что нет ни одной реализации, которая соответствовала бы требованиям!

    КЛ>>Компьютер работает с двоичной системой счисления, а двоичная система счисления — это позиционная система с основанием 2.

    WH>Те невозможно построить комп на римских чиселках?
    А попробуйте придумать такую микросхему. Похоже, Вы в запале опять взваливаете на себя задание, которое Вам не по зубам.

    КЛ>>Если у Вас всего 4 контрола, то Вам не нужен и компонентный подход.

    WH>1)Откуда следует что у меня только 4 контрола?
    Вы сами это написали.

    WH>2)Почему мне не нужен компонентный подход если он облегчает жизнь даже в случае если контрол только один?

    WH>Жизнь он облегчает тем что формализует контракты и не дает зацеписаться за детали реализации.
    У Вас контракты не формализованы. Взять, к примеру, тот же тултип...

    КЛ>>Да, и сопровождающий программист тоже не знает. Никто не знает, а тултипы добавляются. Вот и не задекларированная связь!

    WH>Я уже говорил что это задокументированно:
    WH>1)В описании объектной системы.
    WH>2)В описании контрола.
    Документирование — это хорошо. Но четко прописанный интерфейс — лучше. Это уже все тут, по момему, сказали.

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

    WH>Но чукча похоже не читатель...

    Вы опять грубите.

    КЛ>>Можно ли будет в этом случае унифицировать вызывающий код и использовать его для обоих (attached и не-attached) случаев?

    WH>Нельзя.
    Аргументов, как я понимаю, ждать бесполезно?

    КЛ>>Если нельзя, то почему?

    WH>Я уже много раз писал.
    Все, что Вы писали, я описал в диалоге. Конкретных деталей Вы так и не привели.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[53]: О сопровождении
    От: WolfHound  
    Дата: 28.06.07 21:38
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Я так понимаю, что если б получить решение было легко (как в случае с десятичными числами), то никакой проблемы бы не возникло.

    Его бы небыло в любом случае. Ибо мне а) не интересно. б) не платят.
    Или ты хочешь оплатить мою работу?

    КЛ>Итак, что же мы имеем на выходе? Вы построили суперабстрактную, но не работающую модель. Почему не работающую? Потому что нет ни одной реализации, которая соответствовала бы требованиям!

    Оплати работу. Будет.
    Это не проблема.

    WH>>1)Откуда следует что у меня только 4 контрола?

    КЛ>Вы сами это написали.
    Где там было написано что есть только эти контролы?
    Может не будешь выдумывать всякий бред?

    КЛ>У Вас контракты не формализованы. Взять, к примеру, тот же тултип...

    Как не формализованы?
    Очень даже формализованы.

    Объектная модель формализована.
    Контракт контролов вобще и провайдера тултипов тоже.

    КЛ>Документирование — это хорошо. Но четко прописанный интерфейс — лучше. Это уже все тут, по момему, сказали.

    А откуда следует что он не четко прописан?
    Опять придумываешь?

    КЛ>Ладно, тултип можно схавать, если он только один. Конечно, кривовато. Но — бог с ним.

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

    КЛ>А представьте, что среди таких контролов у Вас не один такой тултип, а несколько, которые что-то добавляют

    Я не только представил но и создал такую систему.
    И все прекрасно работает.

    Я больше скажу. Есть и другие системы работающие на подобных принципах.
    И тоже не испытывают проблем с предсказуемостью.

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

    КЛ>или, например, удаляют?

    Это ты откуда взял?
    Никто ничего не удаляет.
    Хватит придумывать всякую ерунду.

    КЛ>Как во всем этом нагромождении разбираться? По каждому контролу смотреть документацию? Ну, можно.

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

    КЛ>А есть ли документация по суперпозиции этих контролов? Ась? Ведь их — много. И каждый из них может что-то добавлять и что-то удалять.

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

    КЛ>Контрактом это не ограничено.

    Опять придумываешь. Или просто переносишь на меня свой опыт проектирования?
    Ведь это у тебя контракт не то что не ограничивает реализацию. У тебя вобще нет формальных контрактов.
    Ибо если бы они были то у едита бы не появилась картинка, а у картинки не появился бы текст. Просто формальный контракт не позволил бы этому случиться. Но так как ты не озаботился контрактом мы имеем то что имеем.
    Кстати я так и не получил ответ на вопрос: Зачем едиту картика?
    Да вобщем и не мог... ибо ты сам не понял зачем ты это сделал.

    WH>>Но чукча похоже не читатель...

    КЛ>Вы опять грубите.
    Я факты констатирую.

    КЛ>Аргументов, как я понимаю, ждать бесполезно?

    Они были. Но ты не слушаешь.
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[54]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 29.06.07 08:27
    Оценка:
    Здравствуйте, WolfHound, Вы писали:

    WH>Его бы небыло в любом случае. Ибо мне а) не интересно. б) не платят.

    WH>Или ты хочешь оплатить мою работу?
    Если Вы выдвигаете тезис, то бремя доказательства лежит на Вас. Это не моя проблема. Если не можете доказать, то честнее и порядочнее признать свою неправоту, а не придумывать отмазок в стиле:

    а) "Я же — программист, напишу пару классов — и готово!"
    б) "У меня есть умный интерфейс и абстрактная модель, а реализация может быть любой"
    в) "Не хочу и не буду!"
    г) "Мне за это денег не платят"

    За свои слова надо отвечать. Если можете отвечать, то так честно и признаете свою ошибку. Если не можете — придумаете еще какую-нибудь отмазку.

    WH>Где там было написано что есть только эти контролы?

    WH>Может не будешь выдумывать всякий бред?
    В Вашем сообщении.

    КЛ>>У Вас контракты не формализованы. Взять, к примеру, тот же тултип...

    WH>Как не формализованы?
    WH>Очень даже формализованы.
    Не формализованы — раз контрол, кинутый на форму, может добавлять тултипы ко всем другим контролам. Формализация бы была, если бы каждый из контролов, к которому добавляется тултип, имел бы метод Добавить тултип. Но и в этом случае решение было бы кривоватым.

    WH>А откуда следует что он не четко прописан?

    WH>Опять придумываешь?
    В чем четкость? У Вас контролы, к которым добавляется тултип, имеют метод Добавить тултип?

    WH>Что кривовато?

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

    У меня же в модели существует специальная обобщенная операция — Работа с подсказками. И данные для нее хранятся отдельно. Никуда не хардкодятся и свободно удаляются, если не нужны.

    КЛ>>А представьте, что среди таких контролов у Вас не один такой тултип, а несколько, которые что-то добавляют

    WH>Я не только представил но и создал такую систему.
    WH>И все прекрасно работает.
    Кошмар!

    WH>А что касается предсказуемости твоей системы... в которой контракты настолько дырявы что к едиту картинка прилипла...

    В моей модели нет едита, нет листбокса, нет комбобокса или какого-либо другого контрола, а есть:

    а) данные для Z-ordering'а,
    б) данные для layout'а,
    в) данные для визуализации,
    г) данные для подсказок,
    д) данные для обработки сообщений,
    е) и т.д.

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

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

    КЛ>>или, например, удаляют?

    WH>Это ты откуда взял?
    WH>Никто ничего не удаляет.
    WH>Хватит придумывать всякую ерунду.
    Я просто развиваю Вашу модель в соответствии с Вашей же логикой: раз может существовать контрол, который что-то добавляет другим контролам на форме, следовательно, может существовать контрол, который что-то у них отнимает.

    WH>А что касается суперпозиции то система изначально спроктирована так что контролы делают то и только то что есть в их контрактах.

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

    WH>Опять придумываешь. Или просто переносишь на меня свой опыт проектирования?

    WH>Ведь это у тебя контракт не то что не ограничивает реализацию. У тебя вобще нет формальных контрактов.
    WH>Ибо если бы они были то у едита бы не появилась картинка, а у картинки не появился бы текст. Просто формальный контракт не позволил бы этому случиться. Но так как ты не озаботился контрактом мы имеем то что имеем.
    WH>Кстати я так и не получил ответ на вопрос: Зачем едиту картика?
    WH>Да вобщем и не мог... ибо ты сам не понял зачем ты это сделал.
    Я уже ответил на этот вопрос несколько раз, например, здесь
    Автор: Кирилл Лебедев
    Дата: 03.06.07
    . Если Вы не понимаете, повторю еще раз. Во-первых, это стандартный аналитический прием, который позволяет упростить работу с моделью (сократить код). Во-вторых, у меня нет контролов, как таковых (об этом я уже писал и детально разъяснял выше).

    WH>>>Но чукча похоже не читатель...

    КЛ>>Вы опять грубите.
    WH>Я факты констатирую.
    Это не факты, а Ваше личное мнение, выраженное в грубой форме.

    КЛ>>Аргументов, как я понимаю, ждать бесполезно?

    WH>Они были. Но ты не слушаешь.
    Все что было — резюмировано в приведенном мною диалоге. Никакой конкретики — сплошной уход от вопросов.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[58]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 29.06.07 08:42
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    AVK>>Там всего одна проверка и ее так просто сгруппировать не получится, потому что последовательность проверок в случае свойств и событий разная. В свойстве есть интерцептор и его надо обязательно проверять до проверки сериализуемости.

    КЛ>А что такое интерцептор? В чем заключается его функция?

    Читай внимательнее.

    Интерцепторы нужны для работы со свойствами вроде Visible или Enabled в редакторе.

    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[58]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 29.06.07 08:42
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Потому что в противном случае запись выглядела бы так:


    КЛ>Сериализовать Дерево

    КЛ>1) ...
    КЛ>2) ...
    КЛ>3) Сериализовать Свойство

    КЛ>Сериализовать Свойство

    КЛ>1) ...
    КЛ>2) ...
    КЛ>3) ...

    Ты сиквенс диаграммы вобще видел?
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[59]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 29.06.07 09:03
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Читай внимательнее.

    AVK>

    Интерцепторы нужны для работы со свойствами вроде Visible или Enabled в редакторе.

    А дифференциал Бульдожа нужен для повышения креативности...

    Не могли бы Вы все-таки конкретизировать, что такое интерцептор и что он делает со свойствами Visible и Enabled.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[60]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 29.06.07 09:43
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Не могли бы Вы все-таки конкретизировать, что такое интерцептор и что он делает со свойствами Visible и Enabled.


    Интерцептор перехватывает чтение и запись значений свойств при сериализации/десериализации. Зачем это нужно можно легко догадаться, если подумать о том, почему свойство Visible не может быть изменено у самого контрола в дизайн-тайме.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
    Re[55]: О сопровождении
    От: WolfHound  
    Дата: 29.06.07 10:08
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    КЛ>Если Вы выдвигаете тезис, то бремя доказательства лежит на Вас. Это не моя проблема. Если не можете доказать, то честнее и порядочнее признать свою неправоту, а не придумывать отмазок в стиле:

    Какой еще тезис? Это ты придумал кикието римские чисилки. И что-то пытаешься ими доказать.

    WH>>Где там было написано что есть только эти контролы?

    WH>>Может не будешь выдумывать всякий бред?
    КЛ>В Вашем сообщении.
    Цитату можно? Или ты сделал этот вывод на основании того что я других не перечислил?
    Неужели человек работающий 11 лет в индустрии может всерьез считать что требования не меняются во времени? Или кто-то может просто о чемто забыть?

    КЛ>Не формализованы — раз контрол, кинутый на форму, может добавлять тултипы ко всем другим контролам. Формализация бы была, если бы каждый из контролов, к которому добавляется тултип, имел бы метод Добавить тултип. Но и в этом случае решение было бы кривоватым.

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

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

    КЛ>В Вашей компонентной модели ровно то и придется делать: либо хардкодить тултипы в контролы, либо добавлять их кривым способом, кидая на форму специальный контрол. И то, и другое — криво.

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

    КЛ>У меня же в модели существует специальная обобщенная операция — Работа с подсказками. И данные для нее хранятся отдельно. Никуда не хардкодятся и свободно удаляются, если не нужны.

    Тултипы в моделе ГУИ?

    КЛ>Кошмар!

    Исключительно в твоем воображении.

    КЛ>а) данные для Z-ordering'а,

    А почему отдельно от лейаута?
    КЛ>б) данные для layout'а,
    Какого из?...
    КЛ>в) данные для визуализации,
    Какой из?...
    КЛ>г) данные для подсказок,
    В модели ГУИ?!
    И эти люди запрещают мне ковыряться в носу...
    КЛ>д) данные для обработки сообщений,
    Они у всех контролов разные.
    Те событие OnStartRowEdit имеет смысл у грида и только у грида. Кнопке оно не нужно.
    КЛ>е) и т.д.

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

    Те сидим и выпиливаем каждую кнопочку по отдельности?
    Это по твоему упрощение разработки?

    А что ты будешь делать если у тебя некоторая комбинация контролов встречается многократно?
    Каждый раз выпиливать?

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

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

    В твоей "системе" нет моделей. Там одна каша.

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

    Никак одно из другого не следует.

    КЛ>Ок. Пожалуйста, приведите тут контракт контрола, который добавляет тултипы.

        /// <summary>
        /// Провайдер подсказок
        /// </summary>
        [ReflectedExtendedObject]
        public interface IToolTipProvider
        {
            /// <summary>
            /// Установить текст подсказки для контрола
            /// </summary>
            [Reflected]
            void SetToolTip(object instance, string value);
    
            /// <summary>
            /// Получить текст подсказки контрола
            /// </summary>
            [Reflected]
            string GetToolTip(object instance);
        }

    Легче стало?

    КЛ>Я уже ответил на этот вопрос несколько раз, например, здесь
    Автор: Кирилл Лебедев
    Дата: 03.06.07
    .

    Куча наездов и передергиваний.
    Их причина полное не понимание принципов создания полиморфных решений.

    КЛ>Если Вы не понимаете, повторю еще раз.

    КЛ>Во-первых, это стандартный аналитический прием, который позволяет упростить работу с моделью (сократить код).
    Для кого?
    Только не пытайся сюда приплести людей занимающихся созданием предметов материального мира.
    Их опыт не применим. Вернее его применение оооочень ограничено.
    У них полиморфизм не работает.
    А в программировании работает.
    А то что ты его не понимаешь... так это не проблемы полиморфизма.

    КЛ>Во-вторых, у меня нет контролов, как таковых (об этом я уже писал и детально разъяснял выше).

    Те полная деформализация системы.
    Это было ясно с самого начала.
    И именно по тому что у тебя все полностью деформализованно тебе и нужен конвеер.
    А мне он не нужен по тому что мне нечего штамповать пачками. У меня все в одном экземпляре. Но этот экземпляр полиморфен.
    Те там где ты штампуешь кнопки пачками я использую один раз написанную кнопку.

    Пойми одну простую вещь: На описании вида

    Создать форму и контролы.
    Правильно структурировать дочерние контролы (т.е. прикрепить дочерние элементы к родительским).
    Правильно расположить контролы на форме и внутри других контролов.
    Отобразить форму и контролы.
    Обрабатывать команды от контролов.
    И т.д. (список далеко не полон).

    Структурная модель.
    Визуальная модель.
    Топологическая модель.
    Динамическая модель.

    Формализация системы не заканчивается.
    Она только начинается.

    Те это ни разу не цель, а только начало процесса формализации системы.

    КЛ>Все что было — резюмировано в приведенном мною диалоге. Никакой конкретики — сплошной уход от вопросов.

    Ну что я могу поделать с тем что ты не понимаешь почему нельзя мух с катлетами мешать...
    ... << RSDN@Home 1.2.0 alpha rev. 673>>
    Пусть это будет просто:
    просто, как только можно,
    но не проще.
    (C) А. Эйнштейн
    Re[57]: О сопровождении
    От: Кирилл Лебедев Россия http://askofen.blogspot.com/
    Дата: 29.06.07 12:31
    Оценка:
    Здравствуйте, AndrewVK, Вы писали:

    AVK>Там всего одна проверка и ее так просто сгруппировать не получится, потому что последовательность проверок в случае свойств и событий разная. В свойстве есть интерцептор и его надо обязательно проверять до проверки сериализуемости.

    Соответственно, можно подумать и об унификации последовательностей.

    AVK>Да и смысла нет экономить на спичках — эта проверка просто вызов одного метода.

    В этом есть смысл, т.к. унификация последовательности позволит:

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

    Смотрите сами. В настоящий момент у Вас такие последовательности действий:

    Для события:

    1) Проверить событие на сериализуемость.
    2) Получить значение события.
    3) Записать значение в МСП.

    Для свойства:

    1) Получить интерцептор.
    2) Проверить интерцептор на предмет желания перехватить свойство.
    3) Получить значение свойства у интерцептора.
    2а) Проверить свойство на сериализуемость.
    3а) Получить значение свойства (у кого, если интерцептора нет — ?).
    4) Сериализовать свойство в МСП.
    4а) Свойство — компонент, владелец — несет ответственность за создание -> Сериализовать компонент.
    4б) Свойство — компонент, владелец — не несет ответственности за создание -> Сериализовать ссылку на компонент.
    4в) Свойство — коллекция, тогда — Сериализовать коллекцию.

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

    Если абстрагироваться от деталей, то обе последовательности похожи. Поэтому их можно унифицировать и свести к такой последовательности:

    1) Проверить элемент на сериализуемость.
    2) Получить значение элемента для сериализации.
    3) Записать значение в МСП.

    Операция Проверить элемент на сериализуемость раскрывается так:

    1) Элемент — событие: проверить на сериализуемость.
    2) Элемент — свойство, и есть интерцептор: интерцептор проверить на сериализуемость.
    3) Элемент — свойство, и нет интерцептора: свойство проверить на сериализуемость.

    Операция Получить значение элемента для сериализации раскрывается так:

    1) Событие: получить значение события.
    2) Свойство и интерцептор: интерцептор получить значение свойства.
    3) Свойство и нет интерцептора: свойство получить значение свойства.

    Операция Записать значение в МСП раскрывается так:

    1) Событие: записать значение события.
    2) Свойство, компонент, владелец — несет ответственность, сериализовать компонент.
    3) Свойство, компонент, владелец не несет ответственности, сериализовать ссылку на компонент.
    4) Свойство, коллекция, Сериализовать коллекцию.

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

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

    1) Проверить элемент на сериализуемость.
    2) Получить значение элемента для сериализации.
    3) Преобразовать полученное значение в значение для сериализации.
    4) Записать значение в МСП.
    С уважением,
    Кирилл Лебедев
    Software Design blog — http://askofen.blogspot.ru/
    Re[58]: О сопровождении
    От: AndrewVK Россия http://blogs.rsdn.org/avk
    Дата: 29.06.07 13:04
    Оценка:
    Здравствуйте, Кирилл Лебедев, Вы писали:

    AVK>>Там всего одна проверка и ее так просто сгруппировать не получится, потому что последовательность проверок в случае свойств и событий разная. В свойстве есть интерцептор и его надо обязательно проверять до проверки сериализуемости.

    КЛ>Соответственно, можно подумать и об унификации последовательностей.

    Что там унифицировать? И зачем?

    КЛ>а) унифицировать интерфейсы (отказаться от лишних);


    Я тебе еще раз повторяю — IsSerializable и так уже унифицирован.

    КЛ>б) унифицировать их реализации;


    Реализации принципиально отличаются. В текущем варианте для события IsSerializable всегда возвращает true, а для свойства там весьма непростая логика.

    КЛ>в) сократит и упростит код самой последовательности, что благоприятно скажется на сопровождении.


    Нечего там сокращать, там и так 3 строчки кода.

    КЛ>Если абстрагироваться от деталей, то обе последовательности похожи. Поэтому их можно унифицировать и свести к такой последовательности:


    КЛ>1) Проверить элемент на сериализуемость.

    КЛ>2) Получить значение элемента для сериализации.
    КЛ>3) Записать значение в МСП.

    КЛ>Операция Проверить элемент на сериализуемость раскрывается так:


    КЛ>1) Элемент — событие: проверить на сериализуемость.

    КЛ>2) Элемент — свойство, и есть интерцептор: интерцептор проверить на сериализуемость.

    Ничего то ты не понял. Не надо проверять интерцептор на сериализуемость. Надо проверить:
    а) Интерцептор вобще есть
    б) Если интерцептор есть, то спросить у интерцептора, готов ли он перехватить свойство для конкретного контекста.
    И только если пункт а или б вернул false, нужно проверять элемент свойства на сериализуемость.

    КЛ>3) Элемент — свойство, и нет интерцептора: свойство проверить на сериализуемость.


    Те же яйца, вид сбоку. Что поменялось то?

    КЛ>Операция Получить значение элемента для сериализации раскрывается так:


    КЛ>1) Событие: получить значение события.

    КЛ>2) Свойство и интерцептор: интерцептор получить значение свойства.
    КЛ>3) Свойство и нет интерцептора: свойство получить значение свойства.

    Мы уже на этот момент проверили наличие интерцептора. Ты предлагаешь сдублировать проверку?

    КЛ>Операция Записать значение в МСП раскрывается так:


    КЛ>1) Событие: записать значение события.

    КЛ>2) Свойство, компонент, владелец — несет ответственность, сериализовать компонент.
    КЛ>3) Свойство, компонент, владелец не несет ответственности, сериализовать ссылку на компонент.
    КЛ>4) Свойство, коллекция, Сериализовать коллекцию.

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

    КЛ>А можно сделать и немного по-другому, например, передать обязанности по проверке значения свойства операции Получить значение элемента для сериализации


    Так и есть. Еще раз — я описал последовательность действий, а не код программы.

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


    Так нельзя, потому что в МСП ссылка и значение представлены разными типами узлов.
    ... << RSDN@Home 1.2.0 alpha rev. 688>>
    AVK Blog
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.