Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2014, 01:57   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Модульность кода и интерфейсы.

Всем здравия желаю!


Такая задача:
Написать менеджер баз данных, стало быть это некий интерфейс IDatabaseManager в неком Interf.Core.DB.Manager.pas

Управляет некой сущностью интерфейса IDatabase в Interf.Core.DB.Database.pas

А дилемма такая:
IDatabaseManger хранит в себе IDatabase, а IDatabase должен иметь ссылку на своёго владельца.

Как избежать цикличности?
Хочу по человечески, каждому большому классу свой файл.

Очень хочется избежать приведения типов.

Описывать это все одним pas модулем - вообще не рассматривается.

Последний раз редактировалось Человек_Борща; 19.10.2014 в 02:11.
Человек_Борща вне форума Ответить с цитированием
Старый 19.10.2014, 02:37   #2
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
...
А дилемма такая:
IDatabaseManger хранит в себе IDatabase, а IDatabase должен иметь ссылку на своёго владельца.

Как избежать цикличности?
Хочу по человечески, каждому большому классу свой файл.
...
Если обрисовать это желание на бумаге, то выглядит как "не хочу сеть, хочу дерево". Отсюда и сходу ответ: невозможно решить задачу в текущей постановке - разные ветви не могут быть информированы друг о друге.
Отсюда и решение: надстроить родителя над обоими сущностями и вынести его наверх. Иными словами, думайте не о горизонтальных связях, думайте о вертикальных =-)

Последний раз редактировалось StriderX; 19.10.2014 в 02:39.
StriderX вне форума Ответить с цитированием
Старый 19.10.2014, 02:47   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

мм немного не понятно.. можете привести пример что вы имеете ввиду?
Человек_Борща вне форума Ответить с цитированием
Старый 19.10.2014, 02:59   #4
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
мм немного не понятно.. можете привести пример что вы имеете ввиду?
Только если сменить предметную область: пусть будет танковая платформа и башня с орудием. Обе хотят ссылки друг на друга. А для каких конкретных задач? Рисоваться (родитель рисует башенку)? Физический коллайдер (башенка хотела бы следовать за родителем)? Игровая логика (точность орудия зависит от скоростей движения и поворота платформы)? Вот если на эти вопросы для себя ответить, то и построится развязка в виде:
Башня знает про: TGameObject(parent), TPhysicalBody(parent) и т.п.
Платформа знает про: TGameObject(child), TRenderable(child), TMouseControlled(child) и т.п.
В частном случае всё это может вырождаться и к одному супер-родителю "всё в одном". Не забывайте, что интерфейсы поддерживают "множественное наследование". Проектирование таких элементов допускает и полное отсутствие наследования - в этом случае используются клиент-сервер связи.
StriderX вне форума Ответить с цитированием
Старый 19.10.2014, 03:02   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
мм немного не понятно.. можете привести пример что вы имеете ввиду?
Скорее всего лучше бы тебе привести пример того, что ты имеешь в виду.
northener вне форума Ответить с цитированием
Старый 19.10.2014, 09:20   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я что-то совсем не понял задачу...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.10.2014, 10:59   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Хочу по человечески, каждому большому классу свой файл.
В файлах вы описываете классы реализующие
интерфейсы заданные в одном Или нескольких ДРУГИХ файлах.
ДЛЯ ОПИСАНИЯ интерфейсов ВЫДЕЛИТЬ отдельный файл (или неколько).
Все файлы реализаций (классов) будут иметь ссылки на файл(-ы) на описания (объявления) интерфейсов и ничего не знать про классы их реализающие.

Код:
unit intf;
type
  IDataManager =interface
  end;

  IDataBase =interface
  end;

end;
Код:
unit Manager;

uses intf;  //Uses DBS;

  dbs: IDataBase;
end;
Код:
unit DBS;

uses Intf; //uses manager;

  mng: IDataManager;  
end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.10.2014 в 11:06.
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерфейсы. Tison1251 Общие вопросы по Java, Java SE, Kotlin 3 07.12.2013 04:52
Интерфейсы Amgsys HQ Общие вопросы Delphi 2 14.08.2013 23:45
Модульность в Delphi kuzjma Общие вопросы Delphi 1 28.09.2010 01:25
Интерфейсы Maks1978 Общие вопросы C/C++ 0 29.06.2009 22:11
Интерфейсы MaZaHaKa Общие вопросы Delphi 1 30.11.2008 19:17