Управление присутствием в коллекциях
От: CronAcronis  
Дата: 19.04.12 14:19
Оценка:
Доброго вам времени суток,

Я столкнулся с некоторой проблемой в рамках проектирования приложения.
У меня есть некоторая совокупность объектов и некоторые ключи, по которым я хочу находить эти объекты.

Для этого я использую коллекции (.NET 4) с различными ключами, в зависимости от того, как хочу искать.

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

На данный момент я вижу вариант работы через get, set конкретных свойств.

Как вы считаете, как лучше организовать управление этим присутствием в колекциях?
collections
Re: Управление присутствием в коллекциях
От: Хвост  
Дата: 19.04.12 17:38
Оценка:
Здравствуйте, CronAcronis, Вы писали:

CA>Как вы считаете, как лучше организовать управление этим присутствием в колекциях?


очевидное решение это сторонняя сущность которая знает о коллекциях и обладает методом а-ля updateProperty(object, property, propertyValue) либо onPropertyChanged(object, property);
People write code, programming languages don't.
Re: Управление присутствием в коллекциях
От: igor-booch Россия  
Дата: 19.04.12 17:46
Оценка:
У меня что-то похожее в моём ORM,
пишу на С#
Есть коллекции это экземпляры класса Domain или его наследников,
Domain реализует IList, INotifyCollectionChanged.
У Domain есть делегат определяющий является ли объект его членом

Func<IDomainMember, bool> membershipPredicate;


Сам Domain не знает своих членов,
Членов доменов знает другой класс, у меня Cache.
То есть у Cache есть метод

IList<IDomainMember> GetDomainMembers(Domain domain)

Чтобы Cache следил за членами домена домены регистрируются в нем

void RegisterDomain(Domain domain)

Потенциальные члены доменом тоже регистрируются в Cache

void RegisterDomainMember(IDomainMember domainMember)

В IDomainMember есть событие, которое член домена файрит когда изменилось его членство в доменах (в аргументах события указывается экземпляры доменов, или типы наследников Domain)

Cache на эти события подписывается и изменяет членство IDomainMember в доменах.

Примерно так
http://rsdn.ru/Info/rules.xml
Re: Управление присутствием в коллекциях
От: Aikin Беларусь kavaleu.ru
Дата: 20.04.12 08:55
Оценка:
CA>Доброго вам времени суток,
Доброго

CA>Присутствие объектов в той или иной коллекции фактически должно зависеть от свойств данного объекта. Таким образом, когда происходит изменение свойств мне нужно удалить или добавить этот объект в коллекцию.

Есть много факторов которые влияют на конечное решение:
Как часто меняются объекты в коллекциях?
Как часто происходит доступ к этим объектам?
Сколько этих коллекций (с уникальным критерием отбора)?
Как много объектов в коллекциях?
Может ли объект принадлежать нескольким коллекциям одновременно?
Это коллекции в памяти или в БД или на другом компе в сети?

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

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


Я бы, лично, рассмотрел такой вариант:
Одна физическая коллекция храняцая ВСЕ объекты. Конкретные коллекции получаются из общей с помощью linq-фильтра (виртуальные коллекции). Релализация варианта на твой выбор. Это могут быть как методы/свойства get_ObjectsOfKindQ() у самой коллекции, так и отдельные объекты-коллекции, которые фильруют объекты из общей коллекции при обращении.

Если чтений прилично больше чем записей и окажется, что фильтрация съедает все время, то можно рассмотреть вариант Хвост и Re: Управление присутствием в коллекциях
Автор: igor-booch
Дата: 19.04.12
с DependencyProperty выше по ветке: подписаться на события изменения из общей коллекции и из внутреннего кэша и принимать решение о добавлении / удалении объекта из внутреннего кэша.


А еще бы я подумал вот о чем:
Зачем городить велосипед если описанная тобою функциональность уже отлично реализована в Базах Данных.
Недостаточно скорости доступа? Можно взять in-memory базу (например SQLite).
Не хочешь сериализовать объекты в представление БД? Используй объектные in-memory базы (тут я не подскажу).


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


СУВ, Aikin
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.