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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.011 c
3-49442
Skif
2003-12-18 13:44
2004.01.16
MyDac+delphi


3-49387
jack128
2003-12-20 15:25
2004.01.16
Проблема с запросом


3-49399
Евгений
2003-12-19 14:33
2004.01.16
Причина сообщения Could not find language drive.


7-49774
John Kayfolom
2003-11-04 10:11
2004.01.16
Пример написания сервиса (TService)


14-49767
SPeller
2003-12-23 23:06
2004.01.16
Вопрос по HTML





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский