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

Вниз

Взаимодействие классов   Найти похожие ветки 

 
AlexHermit ©   (2003-12-24 12:29) [0]

Есть два класса A и B. Класс A имеет атрибут (назовем его BID), который может принимать значения ID из класса B. Каким образом наиболее красиво организовать проверку корректности ВID в конструкторе класса A при создании нового экземпляра этого класса? Т.е. по сути, необходимо организовать некий аналог Foreign Key из области БД.
Правильно ли будет передавать в конструктор класса A экземпляр B для осуществления такой проверки или же может быть есть более правильное решение?


 
Skier ©   (2003-12-24 12:38) [1]


> организовать проверку корректности ВID

Что подразумевается под словом "корректность" ?


 
Sandman25 ©   (2003-12-24 12:40) [2]

Должен быть "общий" тип
type TMyType = ...

A = class...
BID: TMyType;
end;

B = class
ID: TMyType
end


 
Digitman ©   (2003-12-24 12:42) [3]


> Правильно ли будет


смотря в чем у тебя сомнения
потому что никаких строго определенных критериев "правильности" нет и быть не может


 
Sandman25 ©   (2003-12-24 12:45) [4]

Попробуйте передавать в конструктор класса A экземпляр класса B.


 
Anatoly Podgoretsky ©   (2003-12-24 12:52) [5]

Sandman25 © (24.12.03 12:45) [4]
Попробуйте передавать в конструктор класса A корректный экземпляр класса B.


 
Sandman25 ©   (2003-12-24 12:54) [6]

[5] Anatoly Podgoretsky © (24.12.03 12:52)

Точнее, нужный. Аналогично AOwner в большинстве Create. Заодно можно будет еще что-нибудь с этим экземплярам сделать.


 
Anatoly Podgoretsky ©   (2003-12-24 12:56) [7]

А раз аналог Foreign Key то надо обслуживать еще и уничножение экземпляра. Метод Notification и рядом.


 
AlexHermit ©   (2003-12-24 12:58) [8]

To Sandman25
>type TMyType = ...

>A = class...
> BID: TMyType;
>end;

>B = class
> ID: TMyType
>end

Эта схема выглядит примерно вот так:

A = class...
...
BID: Integer; - значения должны быть только те, которые есть у B.ID
...
end;

B = class
ID: Integer;
AttributeA
AttributeB
.....
end

Skier
>Что подразумевается под словом "корректность" ?
Аттрибут BID класса A должен содержать только те значения, которые содержаться в ID класса B

Digitman
>потому что никаких строго определенных критериев "правильности" нет и быть не может
Речь шла о наиболее точном решении в соответствии с "правилами хорошего тона" в ООП.


 
Digitman ©   (2003-12-24 13:04) [9]


> AlexHermit


тогда думаю, что передача объекта-справочника параметром конструктора объекта-документа - не самое плохое решение

особенно, если классы справочника и документа реализованы в разных модулях


 
Sandman25 ©   (2003-12-24 13:04) [10]

[8] AlexHermit © (24.12.03 12:58)

Кстати, рассмотрите вариант сохранения ссылки на B вместо номера ID. Чтобы потом легче было находить соответствующий B.


 
AlexHermit ©   (2003-12-24 13:26) [11]

>Кстати, рассмотрите вариант сохранения ссылки на B вместо номера ID. Чтобы потом легче было находить соответствующий B.
Да, это не плохой вариант. Спасибо.


 
Юрий Зотов ©   (2003-12-24 13:49) [12]

> AlexHermit © (24.12.03 12:29)

> Каким образом наиболее красиво организовать проверку
> корректности ВID в конструкторе класса A при создании нового
> экземпляра этого класса?

Нет проблем. Например:

type
TID = type integer;
TClassB = class;

TClassA = class(...)
...
procedure CheckID(B: TClassB);
constructor Create(B: TClassB);
end;

TClassB = class(...)
...
property ID: TID...;
end;

procedure TClassA.CheckID(B: TClassB);
begin
if < B.ID имеет некорректное значение> then
raise Exception.Create("Некорректный ID")
end;

constructor TClassA.Create(B: TClassB);
begin
inherited Create(...);
...
CheckID(B);
...
end;


Как видите, все очень просто. Но вот условие в CheckID:
< B.ID имеет некорректное значение>
Вы должны написать сами. Потому что только Вы один знаете, что такое "корректный" или "некорректный" ID.

> Правильно ли будет передавать в конструктор класса A экземпляр
> B для осуществления такой проверки

Правильно (именно так и сделано выше). А можно передавать в конструктор не весь B, а только его ID - и это тоже будет правильно. А можно передавать и еще что угодно - и это тоже будет правильно.

Главное в том, что конструктор A должен получить ВСЕ данные, необходимые для проверки корректности ID, а потом передать эти данные в CheckID. Значит, какие именно данные надо передавать в конструктор ЦЕЛИКОМ И ПОЛНОСТЬЮ определяется тем, что Вы понимаете под "корректностью" ID.


 
DiamondShark ©   (2003-12-24 16:08) [13]

А зачем там вообще ID?



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

Текущий архив: 2004.01.16;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.032 c
14-49694
НовичокНаФоруме
2003-12-26 10:35
2004.01.16
Win XP with SP1


4-49806
Johnson
2003-11-10 18:45
2004.01.16
Как наити нужную программу???


11-49474
Denis Myasnichenko
2003-04-30 10:49
2004.01.16
KOL && инициализация


7-49779
Boutenko_Ivan
2003-11-03 20:36
2004.01.16
запуск файлов из программы


14-49731
Романов Р.В.
2003-12-25 09:24
2004.01.16
Happy New Year