Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите подобрать паттерн  (Прочитано 13678 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« : 11-06-2010 12:56 » 

День добрый. Все чаще и чаще встречаюсь с такой проблемой:
 в системе есть какой-то объект класса BOX, у него куча внутренних член-данных классов ITEM1, ITEM2,ITEM-n. Как внутреннему объекту ITEM1 объекта ВОХ получить информацию о внутреннем объекте ITEM2? И наоборот.
Самый простой вариант - хранить в каждом внутреннем объекте указатель на класс-коробку, и по этому указателю добираться до существующего поля. Но это глупо, я уверен, что подобное уже решалось, и не раз. Знакомство с паттернами ограничивается лишь Наблюдателем.
Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-06-2010 13:42 » 

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

Есть шаблон Посредник (Mediator) - его задачей является управление взаимодействием множества элементов (как правило состав элементов часто меняется, и логика их взаимного влияния слишком сложна, чтобы "размазывать" её по разным классам).

Есть шаблон Доска объявлений (Billboard) - множество объектов имеют возможность помещать в контейнер какую-то информацию так, чтобы все её прочитали.


Так что лучше начни с прикладной задачи и предметной области. Описание уровня item1, item2 не позволяет сказать, какое решение лучше всего тебе подходит.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 11-06-2010 13:45 » 

Спасибо, на выходных почитаю про эти шаблоны. Рабочий день окончен, задачу изложу в пнд.
Записан
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 14-06-2010 06:26 » 

И снова я. Постараюсь вкратце описать кусок предметной области.
Есть документ с кучей электронных карт (участки, дороги, светлофоры, проч). Документ - это просто набор этих карт (слоев), соотв., может быть великое множество различных документов. Необходимо, чтобы пользователь мог сгенерировать паспорт придомовой территории по клику на выбранный участок (территорию эту ж). Для разных отделов разные документы.
Класс LayoutPasport представляет собой т.н. "паспорт придомовой территории". Туда входят 2 плана (карты - объекты LayoutMap) с легендами, проч. херней, собсно инфа о территории (сущность Yard). Инфа тянется в зависимости от настроек - LayerSettings (разные документы - разные настройки. Ввиду моей неопытности (студент) и отсутствия коллег как таковых (я сам представляю отдел автоматизации, который зарожился в январе Улыбаюсь ) была предложенна следующая схема (кусок диаграммы классов, наклепаный на скорую руку).  На ней я отобразил только элементы, необходимые для понятия проблемы. Проблема в следующем:
Где-то инициализируются объекты LayoutPasport, LayerSettings и Yard. Затем по клику на участок объект класса Yard "собирает" инфу об участке по его ID. Для этого ему нужно знать ID участка (передается) и LayerSettings, чтобы знать, какие слои учавствуют в данном проекте. Но объект класса Yard ничего не знает об LayerSettings, зато обо всем этом знает класс LayoutPasport. Это логично - настройки паспорта хранятся в нем. Так вот, вопрос. Как объекту класса Yard получить доступ к объекту-соседу класса LayerSettings?

* uml.jpeg (24.97 Кб - загружено 1005 раз.)
Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-06-2010 09:13 » new

Интересно: это всё тобой написано (поэтому ты можешь менять как угодно), или это части какой-то сторонней библиотеки (поэтому ты не можешь менять их, однако можешь делать собственные надстройки)?


Уточнения предметной области. Объяснение твоё не замкнуто на само себя и потому не полно.

Цитата: yudjin
Есть документ с кучей электронных карт (участки, дороги, светлофоры, проч). Документ - это просто набор этих карт (слоев),
Цитата: yudjin
чтобы пользователь мог сгенерировать паспорт придомовой территории по клику на выбранный участок (территорию эту ж).
Цитата: yudjin
Затем по клику на участок объект класса Yard "собирает" инфу об участке по его ID.
Нигде нет определения, что такое "участок" или "территория". Известно лишь, что эта сущность имеет ID. Также сказано, что "участки, дороги, светофоры" - это карты, что, скорее всего, является некорректным утверждением. Например, может быть "карта светофоров" (одна сущность) и "светофор" (другая сущность) на (отношение между сущностями) "карте светофоров"

Имеется карта (может это отдельная сущность, здесь не упомянутая, или это документ?) из слоёв LayoutMap. Пользователь на неё тыкает в какую-то точку, и, допустим, карта возвращает ему набор объектов-областей (тех самых участков/территорий?) в этой точке из всех слоёв. Как на самом деле?

Если на самом деле так, по каким правилам между собой увязываются объекты-области в случае несовпадения координат? Например, пользователь указывает на улицу (как область одного слоя), а на этой улице по всей её площади разбросано множество светофоров. В случае выбора улицы светофоры тоже выбираются как привязанные к улице или нет? Или, например, на придомовой территории находится автостоянка или трансформаторная будка - они тоже должны выбраны вместе с территорией или нет?

Цитата: yudjin
собсно инфа о территории (сущность Yard).
Я правильно понимаю, что эта информация о территории - не географическая информация? Т.е. Yard и "участок" между собой не увязаны по каким-то идентификаторам, и являются атрибутами какой-то третьей сущности (LayoutPassport?), которая их в себе объединяет для описания придомовой территории.

Если это так, то непонятно отношение композиции между LayoutPassport (как предполагаемого мною паспорта придомовой территории) и LayoutMap (как предполагаемого мною слоя карты), причём так, что слой карты является частью паспорта придомовой территории. Насколько я понимаю, в таком случае один слой карты будет входить во множество паспортов придомовых территорий.

По логике предметной области между этими сущностями может быть либо ассоциативная связь, либо вместо LayoutMap внутри LayoutPassport должны находится "участки" на разных LayoutMap, относящиеся к данной придомовой территории (более сложная конструкция).

Цитата: yudjin
LayerSettings (разные документы - разные настройки
Роль LayerSettings во всём этом деле для меня осталась загадкой. Это подмножество LayoutMap, с которым работают в данный момент? При этом
Цитата: yudjin
Есть документ с кучей электронных карт (участки, дороги, светлофоры, проч).
на каждый вид объектов, размещаемых на карте, существует отдельный LayoutMap?


Собственно о проблеме.

Цитата: yudjin
Затем по клику на участок объект класса Yard "собирает" инфу об участке по его ID. Для этого ему нужно знать ID участка (передается) и LayerSettings, чтобы знать, какие слои учавствуют в данном проекте.
"Клик" - это событие. Какой объект обрабатывает это событие? Как разворачивается обработка этого события до посылки сообщения к Yard об участке (ID участка) и настройках (LayerSettings)?

Варианты решения:

1) Тот объект, который посылает сообщение к Yard, вместе с ID участка может передать и требуемый объект LayerSettings.

Код:
class Yard
{
  public procedure CollectInfo(AreaID, LayerSettings)
}

2) В данной схеме LayoutPassport выглядит как Mediator, поэтому можно в нём разместить метод GetLayerSettings, тем самым перепоручая ему заботу о поиске LayerSettings и организации доступа к этому объекту. Но в этом случае Yard должен иметь ссылку на LayoutPassport.

Код:
class LayoutPassport
{
  public function GetLayerSettings: LayerSettings
}

class Yard
{
  public procedure CollectInfo(AreaID)
  {
    LayerSettings = LayoutPassport.GetLayerSettings
  }
}

P.S. Код чисто условный - не язык программирования, просто схема решения.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines