Как стать автором
Обновить

Комментарии 20

Сделайте подсветку синтаксиса, пожалуйста. А так, спасибо за информацию.
готово
Последнее время так интересно видеть переводы статей, которые написанные нашими на не нашем :)
Ну если учесть что на СР раз в 100 больше посетителей чем на Хабре, это в принципе понятно.
НЛО прилетело и опубликовало эту надпись здесь
Внешне выглядит действительно похоже. Хочется даже попробовать сделать сравнение.
Но если честно .Net Generic c его
private readonly UndoRedo name = new UndoRedo<string />("");
public string string Name
{ get { return name.Value; } set { name.Value = value; }}
Выглядит несколько проще чем требование реализации списка этих интерфейсов в EditableObject ( Business Logic Toolkit )
Вот список пространств имен и интерфейсов требуемых для работы с эти проектом (у коллекций чуть другие интерфейсы bltoolkit.net/doc/EditableObjects/index.htm)
System.ComponentModel IEditableObject
System.ComponentModel INotifyPropertyChanged
System.ComponentModel ICustomTypeDescriptor
System ICloneable
BLToolkit.ComponentModel INotifyObjectEdit
BLToolkit.EditableObjects IEditable
BLToolkit.Validation IValidatable
Так в BLToolkit вроде же надо просто сделать абстрактный класс и унаследоваться от EditableObject<имя этого класса>, а свойства тоже определить как абстрактные.
Дальше все нужные обертки будут сделаны автоматически:

using System;
using NUnit.Framework;
using BLToolkit.EditableObjects;

namespace HowTo.EditableObjects
{
  [TestFixture]
  public class EditableObjectTest
  {
    public abstract class TestObject : EditableObject<TestObject>
    {
      // Any abstract property becomes editable.
      //
      public abstract string FirstName { get; set; }
      public abstract string LastName { get; set; }

      // This field is not editable.
      //
      public string FullName
      {
        get { return string.Format("{0} {1}", FirstName, LastName); }
      }
    }

    [Test]
    public void Test()
    {
      TestObject obj = TestObject.CreateInstance();

      obj.FirstName = "Tester";
      obj.LastName = "Testerson";

      Assert.IsTrue(obj.IsDirty);

      obj.AcceptChanges();

      Assert.IsFalse(obj.IsDirty);
    }
  }
}


Действительно наверное все проще чем мне показалось в начале, но все же сделать обертку как то проще помоему чем наследоваться от абстрактоно класса и определять еще и свойства как абстрактные. Это может не по архитектуре Феншую аказаться
а вот такая реалзиация простая в виде обертки меня очень прильщает.
UndoRedo name = new UndoRedo<string />("");
Если действительно есть какие то подводные камни, то напишите их. Тема то очень интересная.
>System.ComponentModel
Использовать стандартные средства фреймворка лучше чем изобретать свои.
Комментарий автора:
Это все таки намного более упрощенное решение. Насколько я помню можно откатить только последнюю операцию. Redo отсутсвует. Поддержка стека изменений отсутствует. Всегда надо наследоваться от определенного класса. Что делать со списками вообще не понятно. И как объеденить изменения в одну транзакцию, если они сделанны в 50 различных объектах, которые возможно даже не связанны друг с другом? Вообщем, это не Undo-Redo решение — это решение для OK-Cancel в простых формах редактирования.
Напишите «Автоматизация» вместо «автоматизирование», и будет совсем все хорошо.
UML-диаграмму хочу.
Ну так в чём проблема скормите проект интерпрайх архитекту и делов то ;)
Проблема во времени, которое ценно.

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

Хорошее представление — это когда другим людям не надо тратить своё время на «кормления» и прочее.

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

BTW, в России это одна из ключевых проблем — у нас «придумывалка» длинней всех в мире, а «продвигалка» ампутирована ещё на стадии зачатия.
Комментарий автора:
Ну можно было конечно нарисовать два класса… UndoRedo<> и UndoRedoManager. Они даже не связаны между собой...
Как же?

Один из слоя данных (генерик), а второй — логика, которая всё умеет и знает.

Но не в этом суть.

А в том, что истинно-православная диаграмма придумывается долго и способна передать всю суть в пару миллисекунд instead of long-long-code-listings.

Так что это целое отдельное направление и необязательно автор им должен заниматься, а те товарищи, которые в этом секут.
НЛО прилетело и опубликовало эту надпись здесь
Выглядело бы гораздо лучше, если взять обычные autoproperties и применить к ним PostSharp.
В итоге

private readonly UndoRedo name = new UndoRedo<string />("");

public string string Name
{
get { return name.Value; }
set { name.Value = value; }
}



было бы заменено на
[UndoRedoProperty]
public string name {get; set;}

Комментарий автора:
Про PostSharp предложение возможно жизнеспособное. Спасибо.
Следует понимать что статья писалась несколько лет назад, когда таких библиотек не было. Был голый фреймворк 2.0
Можно было бы добавить примочку в DejaVu проект, если руки дойдут… Если бы кто помог было бы совсем замечательно… А то многие хвалят, качают, но улучшения никто не присылает. Ну да ладно, я не обижаюсь :)).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории