Форум: "Основная";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
ВнизИспользовать или нет объекты спецификаций? Найти похожие ветки
← →
Kolan © (2007-09-18 08:50) [0]Здравствуйте,
Если вы читали лармана, то наерно знаете про объекты спицификаций(specifications).
Допустим у меня есть объект А где должен быть список других объектов Б. По сути те «другие» объекты Б являются спецификациями.
Вопрос как организовать связь?
Я сделал так, что в объект А входит список Б, то есть не использовал спецификации. Сделал я это потому, что решил что с таким объектом удобнее работать. Например я передал его во вью и его отобразили. А если бы я использовал спецификации и связал бы его с помощью каккого-либо ID, например, то вью пришлось бы запрашивать спецификации для вывода объекта.
Плохо ли я поступил?
Что в этом полохого?
Как поступили бы вы?
← →
Anatoly Podgoretsky © (2007-09-18 08:57) [1]> Kolan (18.09.2007 08:50:00) [0]
О чем ведешь речь.
← →
Kolan © (2007-09-18 09:02) [2]О спецификациях. Про это Ларман писал в книге:
Craig_Larman_Applying_UML_and_patterns_SE
Смысл.
Допустим есть объект «товар»в супер маркете) у него должно быть описание, типа: «Морковь крупная заморская».
Дык вот, это описание можно поместить в «товар», но тогда если нет ни одного экземпляра, то потеряется и описание(спецификация), поэтому он советует сделать два объекта «товар» и «Спецификация товара» и связать их по ID(Integer).
Вот я НЕ поступил ка он советует — теперь волнуюсь…
← →
Anatoly Podgoretsky © (2007-09-18 09:07) [3]> Kolan (18.09.2007 09:02:02) [2]
Ты про базы что ли?
Так это вопрос нормализации и проектирования.
← →
Anatoly Podgoretsky © (2007-09-18 09:07) [4]Удалено модератором
← →
evvcom © (2007-09-18 09:14) [5]
> Как поступили бы вы?
Не бы, а поступаю, как учат классики.
← →
clickmaker © (2007-09-18 09:27) [6]«Морковь крупная заморская» - это класс. Т.е. по сути и есть спецификация.
А пакет моркови - экземпляр.
Поэтому, правильно Ларман советует.
← →
Kolan © (2007-09-18 09:35) [7]> Ты про базы что ли?
Да нет я о Domain.
Поэтому, правильно Ларман советует.
Знаю что правильно, но как тогда рисовать это все во вью?
У меня активная модель, которая уведомляет вью сама. Вот произошло изменение, вью получил конкретный «пакет моркови» и ему надо отобразить данные из этого экземпляра и + описание. Значит получив объект он полезет спрашивать (кого?) контроллер что-ли? Типа дай описания продукта с ID 124. Так?
← →
clickmaker © (2007-09-18 09:41) [8]
> активная модель, которая уведомляет вью сама
это как?
← →
Kolan © (2007-09-18 09:43) [9]> это как?
Каждый объект домена реализует обозревателя и субъекта из паттерна observer. И вью тоже. При изменении модель рассылает уведомления…
← →
Kolan © (2007-09-18 15:44) [10]А что вы на [7] не отвечаете?
← →
evvcom © (2007-09-19 09:10) [11]
> Вот произошло изменение, вью получил конкретный «пакет моркови»
> и ему надо отобразить данные
Ой, сколько неправильных слов. Я не знаю как в твоей загадочной СУБД, о которой ты молчишь как партизан, но во всех, с которыми я когда-либо сталкивался, view ничего не получает и тем более не отображает! View - это представление, запрос. Как запрос может что-то отобразить? Запрос выбирает из таблиц данные. А уведомления, имхо, в твоем случае должно получить клиентское приложение, после этого выполнить запрос из View, ну и отобразить результат. И что сложного в запросе с получением так называемой тобой спецификации? Ты про join слышал?
← →
Kolan © (2007-09-19 09:56) [12]> Я не знаю как в твоей загадочной СУБД
Причем тут СУБД. У меня её нет. У меня есть Domain(Объекты уровня предметной области.)
> View — это представление, запрос.
Не о том говорим, я говорю о View из архитектурного паттерна Model-View-Controller, а вы о чем?
← →
Игорь Шевченко © (2007-09-19 10:48) [13]
> Дык вот, это описание можно поместить в «товар», но тогда
> если нет ни одного экземпляра, то потеряется и описание(спецификация),
> поэтому он советует сделать два объекта «товар» и «Спецификация
> товара» и связать их по ID(Integer).
Сделай, раз советует. Ни к чему людей обижать.
← →
evvcom © (2007-09-19 11:18) [14]
> а вы о чем?
Ну явно не об этом :)
← →
Суслик © (2007-09-19 11:26) [15]
> [10] Kolan © (18.09.07 15:44)
> А что вы на [7] не отвечаете?
ты проста такие умные вопросы ставишь, что и не понять.
я три года болел этими доменами, моделями предметной области, паттернами, ларманами, фаулерами и пр. баловство все это.
современная СУБД + правильная БД. вот где правда, брат.
и вообще - не видел ни одного удачного применения MVC в ЧИСТОМ виде. все равно V и C объединяют с большинстве случаев.
> Типа дай описания продукта с ID 124. Так?
справшиваей модель. при чем здесь controller.
← →
Суслик © (2007-09-19 11:34) [16]
> я три года болел этими доменами, моделями предметной области,
> паттернами, ларманами, фаулерами и пр. баловство все это.
> современная СУБД + правильная БД. вот где правда, брат.
(себя же процитирую :))
несмотря на то, что я считаю, что это баловство - пройденный путь все равно очень полезен. знать это очень неплохо.
← →
Kolan © (2007-09-19 12:11) [17]> справшиваей модель.
Да вроде логично. Надо бы нарисовать д. Взаимодействия,… еще вопросы задам…
← →
Игорь Шевченко © (2007-09-19 16:22) [18]
> я три года болел этими доменами, моделями предметной области,
> паттернами, ларманами, фаулерами и пр. баловство все это.
>
> современная СУБД + правильная БД. вот где правда, брат
Баловство, конечно. Русский программист будет писать так, чтобы не было мучительно больно за бесцельно прожитые годы. А что будет после него - а комуэто нафиг надо, пусть теперь там поворочаются.
← →
Суслик © (2007-09-20 13:16) [19]
> [18] Игорь Шевченко © (19.09.07 16:22)
> Баловство, конечно. Русский программист будет писать так,
> чтобы не было мучительно больно за бесцельно прожитые годы.
> А что будет после него - а комуэто нафиг надо, пусть теперь
> там поворочаются.
вот, видишь, и ты так думаешь.
← →
Бакук © (2007-09-21 07:33) [20]Объясните мне, каким образом вы применяте MVC в Делфи?
Недавно стал читать про «паттерны, фаулеры и MVC в частности» и понял, что на PHP я так и пишу. Разделяю вывод и обращение к БД. Каким образом это делать в Delphi?
Datamodule (Dataset + Datasource) — получение данных
Form (Grid с ссылкой на Datasource или DB Controls) — отображение информации
Это неверно? Зачем нагромождать проект? Ради того, чтобы было?
← →
Игорь Шевченко © (2007-09-21 12:40) [21]Бакук © (21.09.07 07:33) [20]
Никаким образом не применяем. В Delphi есть механизм db-aware controls, яд которого проникает в мозг каждого разработчика и заставляет его игнорировать MVC.
Но, например, в ряде случаев, я предпочитаю материализовать объект по ключу из выбранной записи в том же гриде, и работать уже с объектом, отображая его данные безотносительно db-aware контролов или выполняя прочие действия. А иногда и грид отображает ClientDataSet, в котором записи формируются из списка объектов.
← →
Суслик © (2007-09-22 00:27) [22]Проще надо быть.
У меня приятель сейчас работает в конторе, где проекты содержат модули от Unit1 до Unit99 (может больше). Контролы называются соответственно - Label1 и пр. Смотрел я этот код. Я может и ламо полное, но он меня не ввел в ужас - код, который делает дело, делает (насколько я знаю) неплохо. А то, что писан он, не то чтобы без MVC и прочих красот, так вообще без элементарной аккуратности, так это ничего - работает же. У кого есть лишнее время (я, например, страшно люблю красоты объектно-ориентированные) тот тратит это время. У кого нет, делает дело и не задумывается о красотах.
← →
Бакук © (2007-09-22 08:32) [23]
> А иногда и грид отображает ClientDataSet, в котором записи
> формируются из списка объектов.
Зачем делать лишнее действие? Сфетчить данные, заполнить ClientDataset и вывести в грид?
> Но, например, в ряде случаев, я предпочитаю материализовать
> объект по ключу из выбранной записи в том же гриде, и работать
> уже с объектом, отображая его данные безотносительно db-
> aware контролов или выполняя прочие действия. А иногда и
> грид отображает ClientDataSet, в котором записи формируются
> из списка объектов.
Не все же материализуете? Выборочно? Каким критерием вы пользуетесь при выборке? Какой плюс?
> отображая его данные безотносительно db-aware контролов
> или выполняя прочие действия
По сути в обычные контролы можно вывести так же поля Датасета без создания объекта
← →
Kolan © (2007-09-22 08:44) [24]> У кого есть лишнее время (я, например, страшно люблю красоты
> объектно-ориентированные) тот тратит это время.
От вас не ожидал… Все красоты ООП для экономии времени.
> Объясните мне, каким образом вы применяте MVC в Делфи?
Имхо проблемма Delphi + MVC в части View. Если для отображения не нужны таблицы, то я ввобще обхожусь без DBAware контролов. Делаю DAL Domain View слои и контроллеры.
Если без DB Aware не обойтись, то все компоненты в DataModule скрываю за фасадом. Но опыта у меня мало всего 3 программы, так сделал.
> По сути в обычные контролы можно вывести так же поля Датасета
> без создания объекта
Можно мног чего делать. Domain нуже, имхо, в первую очередь для «сближения» программы с предметной областью.
Согласиь понятнее когда перед тобой класс:TCar = class
FWheel: array[0Ե] of TWheel;
FSteeringWheel: TSteeringWheel;
end;
Чем когда ты видишь такое:Query.FieldByName("SteeringWheel").
← →
Kolan © (2007-09-22 08:47) [25]> Не все же материализуете? Выборочно?
Да
> Каким критерием вы пользуетесь при выборке?
НеобходимостьюКакой плюс?
Удобство, понятность для других программистов и для себя через месяц в первую очередь.
← →
Бакук © (2007-09-22 10:17) [26]
> Можно мног чего делать. Domain нуже, имхо, в первую очередь
> для «сближения» программы с предметной областью. Согласиь
> понятнее когда перед тобой класс:TCar = class FWheel: array[0Ե]
> of TWheel; FSteeringWheel: TSteeringWheel;end;Чем когда
> ты видишь такое:Query.FieldByName("SteeringWheel").
Ну удобство заключается в том, что я могу обратиться как [b]Car.Wheel.Id[/b]? Однако сомневаюсь, что [b]Query.FieldByName()[/b] это непонятно
> Имхо проблемма Delphi + MVC в части View. Если для отображения
> не нужны таблицы, то я ввобще обхожусь без DBAware контролов.
> Делаю DAL Domain View слои и контроллеры.Если без DB Aware
> не обойтись, то все компоненты в DataModule скрываю за фасадом.
> Но опыта у меня мало всего 3 программы, так сделал.
Сильно будет нагло, если попрошу дать посмотреть какие-то обрыки, наброски? Для самообучения?
> Необходимостью
И все-таки, необходимостью чего?
← →
Суслик © (2007-09-22 10:31) [27]
> Kolan © (22.09.07 08:44) [24]
> От вас не ожидал… Все красоты ООП для экономии времени.
молодо-зелено :)
работать нужно в рамках той библиотеки, которую используешь.
если библиотека использует mvc, то это должно быть mvc, если как в vcl, то нужно использовать как в vcl.
и вообще, автор, не забывай, что немаловажным вопросом является производительность. материализация объектов весьма дорогая операция. на потерю производительности идет сознательно в серверах приложений. но там это компенсируется инфраструктурой, предоставляемой сервером приложений. например, параллельные вычисления, несколько источников данных, пулы соединений, лекогость масштабирования и пр.
в дельфи же это баловство - материализовать объекты. подозреваю, что фича ради фичи.
кстати, заметь, я не отрицаю возможность иметь полноценный Object Persistant Framework. у меня именно такой. но это есть полная противоположность стандартным компонентам дельфи для общения с БД. у меня не используется ни один - ни dbgrid ни datasource (так вроде называется, не помню ибо никогда не использовал). так вот моя ситуация имеет право на жизнь, ибо в ней присутвует полноценная своя парадигма без наслаивания на чужеродную парадигму.
← →
Суслик © (2007-09-22 10:46) [28]
> Kolan © (22.09.07 08:44) [24]
> От вас не ожидал… Все красоты ООП для экономии времени.
и вообще - предлагаю подумать хорошо над этим тезисом.
я с ним сильно не согласен, особенно в вашем озвучании.
по молодости лет ООП качетца действительно панацеей.
дальше приходит понимание, что ООП нужно учиться пользоваться, а не просто считать необходимость ООП неоспоримой истиной.
я сейчас переписываю старый проект. сколько же там красот ООП, которые ни разу не пригодились за 9 лет. а вы говорите экономия - я же на эти красоты потратил то самое время.
← →
Kolan © (2007-09-22 11:02) [29]> в дельфи же это баловство — материализовать объекты. подозреваю,
> что фича ради фичи.
Нетпросто я так привых делать. Я раньше с БД никогда не сталкивался, поэтому тучи запросов в DataModule все в кучу(логика в формах) для меня диковато смотриться.
← →
Суслик © (2007-09-22 23:56) [30]Може потому, что не сталкивался никогда? :)
Может логику можно на сервере держать?
← →
Бакук © (2007-09-24 02:21) [31]И все же, покажите делфийский пример использования например MVC? Для ломки мировоззрения. Ибо я читаю Суслика и абсолютно с ним соглашаюсь.
← →
Kolan © (2007-09-24 08:43) [32]> И все же, покажите делфийский пример использования например
> MVC?
Завтра покажу части из реального проекта.
← →
Суслик © (2007-09-24 09:53) [33]
> [32] Kolan © (24.09.07 08:43)
> > И все же, покажите делфийский пример использования например
>
> > MVC?
>
> Завтра покажу части из реального проекта.
Во-во, мне тоже очень интересно. Только пожалуйста, подготовься. Ну там выдели, где model, где view, а где controller. Тема действительно интересная, ибо MVC лучше всего подходит имхо в вебе. Там все как-то более ясно, что есть что. А вот в дельфи? Model, Controller - поди отдели их друг от друга.
← →
Kolan © (2007-09-24 09:55) [34]> Тема действительно интересная
Выделю. Там и так выделено дальше некуда. Заодно по ушам получу :) и комментарии что это изврат :)… Жаль нет с собой проекта…
← →
Суслик © (2007-09-24 10:04) [35]
> Заодно по ушам получу :)
этого бояться не надо.
← →
Kolan © (2007-09-24 10:09) [36]Лучьше растянуть получения по ушам, чтобы не так больнобыло, поэтому скажу что все объекты предментной области наследники вот такого класса(мож я его уже чуть доработал, но это неважно):
TCustomDomainObject = class
private
FObservers: TCustomDomainObjectList;
FAllowChangeNotification: Boolean;
FChanged: Boolean;
FUpdateObserverOnAttach: Boolean;
procedure SetAllowChangeNotification(const Value: Boolean);
protected
procedure NotifyObservers;
public
constructor Create;
destructor Destroy; override;
procedure Attach(AObserver: TCustomDomainObject);
procedure Detach(AObserver: TCustomDomainObject);
procedure Update(ASubject: TCustomDomainObject); virtual; abstract;
property AllowChangeNotification: Boolean read FAllowChangeNotification
write SetAllowChangeNotification;
published
property UpdateObserverOnAttach: Boolean read FUpdateObserverOnAttach
write FUpdateObserverOnAttach default True;
end;
← →
Anatoly Podgoretsky © (2007-09-24 10:10) [37]> Суслик (24.09.2007 10:04:35) [35]
этого бояться не надо, если умеешь быстро и далеко бегать.
← →
Kolan © (2007-09-24 10:23) [38]Тю, так у меня есть тестовый проектик. Как раз подходит для демонстрации.
Модель:
TStringKeeper = class(TCustomDomainObject)
private
FB: Boolean;
procedure SetB(const Value: Boolean);
public
property B: Boolean read FB write SetB;
end;
View:TLabelView = class(TCustomDomainObject)
strict private
FLabel: TLabel;
public
constructor Create(ALabel: TLabel);
procedure Update(ASubject: TCustomDomainObject); override;
end;
Единственное тут нет контроллера(маленький пример):procedure TForm1.OffButtonClick(Sender: TObject);
begin
FStringKeeper.B := False;
end;
Обычно контролле — это синглетон в данном случае c контроллером было бы так:procedure TForm1.OffButtonClick(Sender: TObject);
begin
TController.GetInstance.SetFalseToMode;TController.GetInstance.SetFalseToMode;
end;
← →
Kolan © (2007-09-24 10:27) [39]Кто что инстанцирует:
Для объектов модели я завожу менеджера, который их создает, удаляет и отдает по требованию.
Работает так:
Событие в форме говорит контроллеру SetFalseToMode.
Контроллер лезет в Менеджер предм. области и получает там объект.
Изменяет полученый объект.
Все подключеные к объекту вью получают сообщение и перерисовываются.
Кто подключает вью к объектам?
Обычно это делается на старте приложения. Для этого служит спец. StartUpController…
← →
Kolan © (2007-09-24 10:28) [40]> Работает так:
Тут http://www.rsdn.ru/article/patterns/generic-mvc.xml есть риуночег.
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.046 c