Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
1 / 1 / 0
Регистрация: 20.07.2012
Сообщений: 9

Как построить связи между объектами

23.01.2013, 12:10. Показов 2454. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!

Для меня до сих пор загадка как правильно построить связи между объектами, т.е. логику приложения.

Например, имеется архитектура MVC или подобная, понятно как строить модель/представление, их надо сделать максимально инкапсулированными, и тут нам приходят на помощь паттены построения объектов: фабрика, DI и т.д. .
И так у нас построена вся инфраструктура приложения, запускается стартовый контроллер, когда нажали кнопку старт (win app) или зашли по URL - создаются объекты, вызываются методы и все ок.

Дальше мы расширяем задачу: надо (допустим у нас игра и есть 4 юнита и консоль), когда третий юнит остановится вывести сообщение "третий юнит не может стоять". Понятно, что к моменту остановки в программе имеется 4 объекта юнитов и 1 консоль, и можно внести следующие изменения:

1. Напрямую из класса юнита, метода остановки, обратится к классу консоли.
2. Напрямую из класса юнита, метода остановки, обратится к классу контроллера и в нем проверить условия, и вызвать консоль.
3. В классе юнита, в методе остановки, вызвать событие, допустим unit:stop, делегировать его на контроллер, а из контроллера так же как и в п.2
4. Использовать паттены типа цепочка, наблюдатель и т.д.

Пункт 4 не учитываю, так как это, по сути, повторение п.1-3. П. 1-2 захламляют код, и устанавливают сильные связи, и вообще прямые сообщения типа модель-модель, это, мне кажется, что то не то. Остается событийное программирование, но тут нужен глобальный диспетчер объектов .. все же мне кажется это неплохой вариант: модели дают всю бизнес-логику, view - отображение, а контроллеры - связи между объектами, логично что контроллеры вызываются в ответ на события, внутренние, либо внешние.
Т.е. получается только один приемлемый вариант установки связей между моделями?

Извиняюсь, что получилось много текста и воды, но по другому не смог.
Если кто что может посоветовать - буду очень благодарен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2013, 12:10
Ответы с готовыми решениями:

Как правильно создать связи между равноправными объектами?
Добрый день всем. Что-то я умудрился придумать себе проблему на ровном месте)... Задачка такая. Допустим, есть таблица с полями Код и...

Описание предметной области не дает возможности выявить связи между объектами БД
Что у меня не так. Подскажите пожалуйста

Как создать связь между объектами?
Здравствуйте, столкнулся с такой проблемой. Нужно создать связь между объектами. В общем сейчас есть 4 класса и эти 4 класса производны от...

5
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,897
Записей в блоге: 2
25.01.2013, 13:23
Необязательно событием, можно и через интерфейсный класс. С точки зрения юнита это примерно так
C++
1
2
3
4
5
6
void unit::Stop( void )
{
 ...
 mInterface->UnitStop(..);
 ...
}
Базовый класс Interface имеет только то что нужно Unit'у который не знает консоль это или что другое. А сама консоль может напр наследовать Interface и реализовывать печать и др
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
25.01.2013, 17:34
Вот тут есть простое описание MVC и MVP с примером. Может поможет.
0
1 / 1 / 0
Регистрация: 20.07.2012
Сообщений: 9
25.01.2013, 21:26  [ТС]
А вам не кажется, что это не очень практично писать внешнюю логику по отношению к объекту в его методе, т.е. можно сделать так:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Unit
{
...
  public void Stop()
  {
    ... (тело метода)
    
    вызываем проверку, допустим, объекта консоли
    вызываем методы обработки события стоп в консоле
    вызываем методы обработки события стоп в диспечере
    и т.д. ...
  }
...
}
Т.е. получается теперь метод unit::stop выполняет помимо своих основных функций еще и связывающие (внешние) функции, мне кажется это быстро приведет к запутыванию логики программы, нет?
0
1969 / 825 / 115
Регистрация: 01.10.2012
Сообщений: 4,897
Записей в блоге: 2
26.01.2013, 08:34
Цитата Сообщение от andrey_rtv Посмотреть сообщение
Т.е. получается теперь метод unit::stop выполняет помимо своих основных функций еще и связывающие (внешние) функции, мне кажется это быстро приведет к запутыванию логики программы, нет?
Здесь можно отталкиваться от того "кто решает". Напр если "остановиться или нет" решается в методе unit::stop, то оттуда и надо уведомлять остальных. И какой-то способ аккуратно уведомить должен быть (сигнал, событие, интерфейс).

Можно навесить контроллер, тогда unit::stop возвращает bool, а контроллер уже решает. Ну это определяется резонами полезности контроллера, просто так его заводить нет оснований.
1
1 / 1 / 0
Регистрация: 20.07.2012
Сообщений: 9
26.01.2013, 16:54  [ТС]
Теперь проясняется: в любом случаи надо из метода уведомлять систему о том что метод совершен. Это можно делать по-разному: событиями, через интерфейс ..
Я так понимаю, лучше делать, чтобы метод напрямую никаких команд не отдавал: либо события, либо интерфейс через DI, либо еще что то
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.01.2013, 16:54
Помогаю со студенческими работами здесь

Как организовать взаимодействие между объектами
В панели динамически создаю textBox (для примера) private void button1_Click(object sender, EventArgs e) { ...

Как убрать промежуток между объектами?
Добрый вечер! Создаю сайт в Блокноте. На картинке Вы можете увидеть большой промежуток между картинкой и меню. Как его уменьшить? Начало...

Как уменьшить расстояние между несколькими объектами?
Как уменьшить расстояние между несколькими объектами?)

Как нарисовать провисающую линию между объектами
Всем привет. Подскажите пожалуйста как сделать провисающую линию в WPF от одного объекта до другого (пусть это будут, например, два...

Как проверить дистанцию между игроком и объектами?
Как проверить дистанцию между игроком и объектами с определенным тегом, то есть у меня есть объекты с тегом AI, и мне надо проверить какой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru