Здравствуйте, Кирилл Лебедев, Вы писали:
КЛ>Не смотря на модераторский статус, Вы опять пытаетесь грубить. Это выглядит странно, потому что я стараюсь избегать реплик, задевающих Ваше самолюбие. Хотя мог бы, например, написать, что сказали знакомые .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>>