Re[12]: GetValue, SetValue и EditableObject
От: BorisKV  
Дата: 25.08.11 22:24
Оценка:
SI>Здорово, что ответили. Упредили наши вопросы

SI>Возвращаясь к содержанию того
Автор: BorisKV
Дата: 28.05.10
топика. Почему AndrewVK и MozgC так противятся тому, что ref-параметр и возврат очень плохо? Мы же не на флэшке данные переносим между методами? Или чего-то мы конкретно не понимаем в этой теме?


Ну это лучше всего спросить у самого AndrewVK и MozgC почему конкретно они противятся ref.

Я понимаю почему Игорь так сделал в те далекие времена. Насчет возврата nullable типов — их тогда не было, к тому же это таже структура. Насчет структур...
Да, можно сделать было нечто вида
struct IsDirtyReturnValue
{
    bool processed;
    bool isDirty;
}


Теперь соответственно предположим, как будет выглядеть сгенерированный IsDirtyMember, из того поста, для объекта с двумя полями int и string:
[BLToolkitGenerated]
IsDirtyReturnValue IMemberwiseEditable.IsDirtyMember(PropertyInfo propertyInfo, string memberName)
{
  IsDirtyReturnValue returnValue = this._number.IsDirtyMember(_number_$propertyInfo, memberName);
  if (!returnValue.processed)
  {
    returnValue = this._str.IsDirtyMember(_str_$propertyInfo, memberName);
    if (!returnValue.processed)
    {
    }
  }
  return returnValue;
}


соответственно меняем EditableValue<T>
public IsDirtyReturnValue IsDirtyMember(PropertyInfo propertyInfo, string memberName)
{
  if (memberName != propertyInfo.Name)
      return new IsDirtyReturnValue {processed=false};

    return new IsDirtyReturnValue {processed=true,isDirty=IsDirty};
}


и меняем EditableObject
public virtual bool IsDirtyMember(string memberName)
{
    bool isDirty = false;

    if (this is IMemberwiseEditable)
    {
        IsDirtyReturnValue returnValue = ((IMemberwiseEditable)this).IsDirtyMember(null, memberName);
        if (returnValue.processed)
            isDirty = returnValue.processed;
    }

    return isDirty;
}


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

А вообще такую тему лучше обсуждать где-нибудь в философии или священных войнах...
... << RSDN@Home 1.2.0 alpha 4 rev. 1238>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.