Что такое элегантный способ отследить размер набора объектов без единой авторитетной коллекции для ссылки? - PullRequest
1 голос
/ 21 ноября 2008

Обновление: пожалуйста, прочитайте этот вопрос в контексте принципов проектирования, элегантности, выражения намерений и особенно "сигналов", посылаемых другим программистам при выборе дизайна.

У меня есть два "вида" набора объектов. Одним из них является словарь / карта, индексирующая объекты по строковому значению. Другой - это словарь / карта, индексирующий объекты по порядковому номеру (порядковое целое число). Не существует «основной» коллекции самих объектов, которая может служить авторитетным источником для количества объектов, но оба словаря всегда должны содержать ссылки на все объекты.

Когда новый элемент добавляется в набор, ссылка добавляется в оба словаря, а затем необходимо выполнить некоторую обработку, на которую влияет новое общее количество объектов.

Что я должен использовать в качестве авторитетного источника для ссылки на текущий размер набора объектов? Кажется, что все мои варианты несовершенны в том или ином измерении. Я могу просто последовательно ссылаться на один из словарей, но это будет означать, что этот словарь превосходит другой. Я мог бы добавить третью коллекцию, простой список объектов, которые будут служить авторитетным списком, но это увеличивает избыточность. Хранение счетчика выполненных операций кажется самым простым, но также увеличивает избыточность и является более хрупким, чем ссылка на счет самопроверки коллекции на лету.

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

Ответы [ 4 ]

3 голосов
/ 21 ноября 2008

Я бы создал класс, который имеет (как минимум) две коллекции.

  • Версия коллекции, которая отсортировано по строке
  • версия коллекция, отсортированная по порядковому номеру
  • (Необязательно) Мастер-коллекция

Класс будет заниматься управлением мелким песком:

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

Таким образом, вы можете использовать одну и ту же коллекцию там, где вам нужно любое поведение, но все же абстрагироваться от поведения «индексации», к которому вы стремитесь.

Отдельный класс дает вам единый интерфейс для объяснения ваших намерений относительно использования этого класса.

3 голосов
/ 21 ноября 2008

Я бы предложил инкапсуляцию: создайте класс, который скрывает детали «управления» (например, текущий счетчик), и используйте его для предоставления неизменных «представлений» двух коллекций.

Клиенты будут запрашивать у объекта "manglement" соответствующую ссылку на одну из коллекций.

Клиенты, добавляющие «термин» (из-за отсутствия лучшего слова) в коллекции, будут делать это через объект «manglement».

Таким образом, ваши предположения и варианты реализации «скрыты» от клиентов службы, и вы можете задокументировать, что выбор коллекции по размеру / количеству был произвольным. Будущие сопровождающие могут изменить способ подсчета, не нарушая клиентов.

Кстати, да, я имел в виду «manglement» - мой любимый малапропизм для менеджмента (в любом контексте!)

0 голосов
/ 21 ноября 2008

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

Если вы действительно обеспокоены этим, вы можете инкапсулировать коллекции с помощью обертки, предоставляющей открытые интерфейсы, например

  • Добавить (пункт)
  • Count ()

Таким образом, он всегда будет последовательным и атомарным - или, по крайней мере, вы могли бы реализовать его таким образом.

Но я не думаю, что это большое дело.

0 голосов
/ 21 ноября 2008

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

...