Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.11.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
11-1176476126
D[u]fa
2007-04-13 18:55
2007.11.11
Str2Extended


1-1187850968
elserpiente
2007-08-23 10:36
2007.11.11
как прочитать version information


3-1183366710
Игорь Шевченко
2007-07-02 12:58
2007.11.11
Кто и как передает сообщения об ошибках при работе в оракле ?


11-1177182170
Rusya
2007-04-21 23:02
2007.11.11
Сделать CenterOnParent


4-1178464604
sinus
2007-05-06 19:16
2007.11.11
Запустить программу от имени другого пользователя