Здравствуйте, Кирилл Лебедев, Вы писали:
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>>