Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Вниз

MVC — спрашивали? :)   Найти похожие ветки 

 
Kolan ©   (2007-09-26 21:31) [0]

Описываю задачу, она большая, поэтому опишу только часть.

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

Карточки, которые он заполняю «находятся» в пакетах. Карточка – сложная штука состоит из блоков блоки из групп.

Итак в Domain есть объекты:
Пакет, Карта, Блок, Группа.

Рассмотрим 1(одну) системную операцию – «Загрузка списка пакетов» (напоминаю, в пакетах лежат карточки).

Список пакетов – это такой объект:

TPackageList = class(TCustomIndexedDomainListObject)
 private
   function GetItem(Index: Integer): TPackage;
   procedure SetItem(Index: Integer; const Value: TPackage);
   function GetCurrentObject: TPackage;
   procedure SetCurrentObject(const Value: TPackage);
 public
   function Add(Package: TPackage): Integer;
   property Items[Index: Integer]: TPackage read GetItem
     write SetItem; default;
   property CurrentObject: TPackage read GetCurrentObject
     write SetCurrentObject;
 end;


По сути это список, к которому могут подключаться обозреватели. См.
http://delphimaster.net/view/1-1190091044/

Работает так:
Пользователь командует(Например стреляет Action) контроллеру.

GetControllerManager.GetController.Load;

Контроллер получает экземпляр списка пакетов и отправляет его на загрузку из базы:
procedure TPackageController.Load;
begin
 inherited;
 GetDataAccessFacade.LoadPackages(GetDomainManager.Packages);
end;


Загрузка выглядит так:
procedure TDataAccessFacade.LoadPackages(PackageList: TPackageList);
var
 Query: TADOQuery;
 TempPackage: TPackage;
begin
 if Assigned(PackageList) then
 begin
   Query := TADOQuery.Create(nil);
   try
     Query.Connection := FDBConnection;
     Query.SQL.Add("SELECT * FROM ExpertAppraisalPackage");
     Query.Open;
     if not Query.Eof then
     begin
       PackageList.AllowChangeNotification := False;
       PackageList.Clear;
       while not Query.Eof do
       begin
         with Query do
         begin
           TempPackage := TPackage.Create(FieldByName("PackageName").AsString,
             FieldByName("CreationDate").AsDateTime);
           TempPackage.ID := FieldByName("cdpackage").AsInteger;
           PackageList.Add(TempPackage);
         end;
         Query.Next;
       end;
       PackageList.AllowChangeNotification := True;
     end;
   finally
     Query.Free;
   end;
 end;
end;


Строка:
PackageList.AllowChangeNotification := False;
Запрещают списку пакетов рассылать уведомления при изменении.

Как только выполняется:
PackageList.AllowChangeNotification := True;

Список сам уведомляет своих обозревателей.

Получив уведомление обозреватель «рисует» список пакетов на TListView
procedure TPackagesView.Update(ASubject: TCustomDomainObject);
begin
 inherited;
 if ASubject is TPackageList then
   ViewPackageList(FListView, (ASubject as TPackageList));
end;


В принципе все.

В итоге.
Domain вообще ничего не знает ни о ком.
View знает о Domain и все, он также ничего не знает о форме все контролы передаются в конструкторе.  
DAL уровень тоже знает только о Domain.
Контроллеры знают о Domain и DAL.

Кроме контроллеров можно все пользовать заново.  Так как база(большущая) одна для почти десятка программ, то думаю reuse получится.

Тут много недочетов вот основные:
1. В DAL слое куча лишнего кода. Надо бы разделить его на низко уровневый и высоко уровневый.
2. Получается что объекты Domain уведомляют только о изменении, а что конкретно поменялось не говорят. Исправил уже, теперь можно создавать разные типы обозревателей.

ЗЫ
 Сразу скажу что за последние два дня я много что по изменял и этот пример прилично устарел… Но идея такая&#133


 
Kolan ©   (2007-09-28 15:10) [1]

Бакук спрашивал, спрашивал и забыл&#133


 
имя   (2007-10-07 22:12) [2]

Удалено модератором


 
имя   (2007-10-07 22:24) [3]

Удалено модератором


 
имя   (2007-10-07 22:27) [4]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.044 c
6-1165172528
Yegorchic
2006-12-03 22:02
2007.11.11
Перехват запуска соединение по dial-up


15-1191796932
Альберт Мобайл
2007-10-08 02:42
2007.11.11
посоветуйте


4-1177781077
delete_file
2007-04-28 21:24
2007.11.11
Удаление файла занятого другим процессом


2-1192473439
тим
2007-10-15 22:37
2007.11.11
кол-во видемых строк в гриде


3-1183366594
GL00m
2007-07-02 12:56
2007.11.11
Delete в SQLQuery не работает





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский