Главная страница
    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.016 c
8-49652
Fatkulin
2003-09-15 07:49
2004.01.16
Звук


1-49604
Dz
2004-01-01 19:53
2004.01.16
Как засунуть картинку (Image) в StatusBar?


1-49623
Layner
2004-01-03 14:56
2004.01.16
Запоминание, какие дочерние формы были открыты в MDI прил.


1-49537
Magician
2004-01-02 15:44
2004.01.16
Где ошибка(drawicon)!


3-49389
uu
2003-12-21 11:03
2004.01.16
Paradox





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