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

Вниз

Переменные процедурного типа   Найти похожие ветки 

 
Сергей М. ©   (2008-10-14 16:51) [40]


> Slym ©   (14.10.08 16:42) [39]


А как результат возвращать, если это функция ?


 
oxffff ©   (2008-10-14 17:18) [41]


> А я ничего не зная об этом по-прежнему запрашиваю с 2-мя
> параметрами.


Ну дык, а что мешет наследовать TCallContextOther  от TCallContextIntegerAndString?
Где я ошибаюсь?


 
oxffff ©   (2008-10-14 17:20) [42]


> Пусть этим занимается вызываемый код при вызове !


Он у меня как раз этим и занимается.


 
Сергей М. ©   (2008-10-14 17:22) [43]


> Где я ошибаюсь?


Этот "наследник" д.б. известен как вызывающей, так и вызываемой стороне.


 
Сергей М. ©   (2008-10-14 17:32) [44]


> oxffff


Ключевое здесь это:

> параметры процедур в библиотеке храняться в БД


Следует понимать, что инф-ция в БД может быть изменена в любой момент времени уже после разработки вызывающего кода, поэтому ни о каком компайл-тайм речи идти не может.
А твой подход с TCallContext и его наследниках требует именно компайл-тайм на обеих сторонах взаимодействия.


 
oxffff ©   (2008-10-14 19:55) [45]


> Сергей М. ©   (14.10.08 17:22) [43]
>
> > Где я ошибаюсь?
>
>
> Этот "наследник" д.б. известен как вызывающей, так и вызываемой
> стороне.


Почему должен быть?

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

Вариант первый использование наследника базового функционала.

То есть TCallContextBase(базовый набор) и TCallContextExtended(расширенный набор), где TCallContextExtended=class(TCallContextBase) в
вызываемом коде стоит первая проверка

TCallContextBase=class
a:integer;
b:string;
end;

TCallContextExtended=class(TCallContextBase)
с:variant;
constructor create(a..,b..,c..)
end;

Вызываемая функция
function Workfunc(context:TCallContextBase):...
begin
if context is TCallContextExtended then
           else
          if context is TCallContextBase then
          begin
          //если появились какие либо обязательные параметры для старых  
          вызовов инициализируем их по умолчанию
          end
          else exit;
end;

Вызывающая функция
Workfunc(TCallContextBase.create(1,"2"))

Ничего менять не нужно для вызывающей стороны.


 
oxffff ©   (2008-10-14 19:59) [46]


> Сергей М. ©   (14.10.08 16:16) [37]
>
> > oxffff ©   (14.10.08 15:56) [36]
>
>
> Да нафига мне в вызывающем коде что-то проверять перед вызовом
> ?)
> Пусть этим занимается вызываемый код при вызове !
>
> Ты же, вводя в адр.строку браузера URL, не проверяешь ведь
> ее актуальность и корректность с т.з., например, наличия
> и кол-ва параметров ?
>
> Не проверяешь.
>
> И браузер тоже не проверяет - ему это тоже нафих не надо,
>  пусть проверкой занимается сам сервер.
>
> Было:
>
> someproto://somedomain/someresource?param1=A?param2=B
>
> запрос успешно выполнялся, сервер возвращал рез-т, браузер
> исправно его представлял юзеру.
>
> После того как "отцы" ресурса с какого-то бодуна взяли да
> добавили обязательный 3-й параметр при запросах к ресурсу,
>  стало:
>
> someproto://somedomain/someresource?param1=A?param2=B?param3=C
>
> А я ничего не зная об этом по-прежнему запрашиваю с 2-мя
> параметрами.
>
> Кто ответственен за возможную коррекцию моей ошибки или
> корректный отлуп запроса ?
> Разумеется, сервер (вызываемый код) ! Не браузер же (вызывающий
> код) !
> Иначе на каждый чих "отцов" придется переписывать каждый
> браузер)


Дык у меня вызывающий код ничего не проверяет. Проверяет контекст вызова сервер. Могу еще предложить вариант, где менять ничего не нужно. :)


 
Сергей М. ©   (2008-10-14 20:01) [47]


> у меня вызывающий код ничего не проверяет


Дык о чем тогда базар ?)

Читай еще раз и внимательно:


> Как до вызова f определить корректность параметров?


 
oxffff ©   (2008-10-14 20:15) [48]


> Дык о чем тогда базар ?)



> После того как "отцы" ресурса с какого-то бодуна взяли да
> добавили обязательный 3-й параметр при запросах к ресурсу,
>  стало:
> someproto://somedomain/someresource?param1=A?param2=B?param3=C
> А я ничего не зная об этом по-прежнему запрашиваю с 2-мя
>
> параметрами.
>  
> Кто ответственен за возможную коррекцию моей ошибки или
>
> корректный отлуп запроса ?
> Разумеется, сервер (вызываемый код) ! Не браузер же (вызывающий
>
> код) !
> Иначе на каждый чих "отцов" придется переписывать каждый
>
> браузер)


Да почему базар?  

А у меня встречный вопрос. Вы [37] спрашивали про третий обязательный параметр. В моем способе я показал как выкрутиться для старого кода.

А в предложенном вами способе разве не придется менять код вызывающего
для дополнительного обязательного параметра. А то вы тут намекаете на негибкость предложенного мною метода, а про свой, что скажете, повторяю обязательного. В вашем же случае тоже придется менять код вызывающего.
Может он все таки не такой уж и обязательный, чтобы старый Idispatch код работал?
;)


 
oxffff ©   (2008-10-14 20:19) [49]


> Читай еще раз и внимательно:
>
>
> > Как до вызова f определить корректность параметров?


В run time только TypeInfo поможет до вызова стороне клиента.


 
oxffff ©   (2008-10-14 23:44) [50]

Я тут слегка усовершенствовал свою версию
отцепив привязку от провайдера контекста.

TContex=record
a,b:integer;
c:string;
end;

IContextProvider=interface
["{C98B6149-BCCA-432D-B9B8-9066ACDAA253}"]
function AssignContext(var Contex:TContex):boolean;
end;

TContextProvider=class(TInterfacedObject,IContextProvider)
protected
function AssignContext(var Contex:TContex):boolean;virtual;abstract;
end;

TContextProvider1=class(TContextProvider)
protected
DataA,DataB:integer;
function AssignContext(var Contex:TContex):boolean;override;
public
constructor create(DataA,DataB:integer);
end;

TContextProvider2=class(TContextProvider)
protected
DataA:integer;
DataC:string;
function AssignContext(var Contex:TContex):boolean;override;
public
constructor create(DataA:integer;DataC:string);
end;

function WorkFunc(Unknown:IUnknown):boolean;
var Contex:TContex;
   ContextProvider:IContextProvider;
begin
try
ContextProvider:=Unknown as IContextProvider;
//Устанавливаем значение по умолчанию
Contex.a:=0;
Contex.b:=0;
Contex.c:="Значение по умолчанию";
//Получаем данные контекста вызова
if ContextProvider.AssignContext(Contex) then
     begin
     showmessage("a="+inttostr(Contex.a)+" b="+inttostr(Contex.b)+" c="+Contex.c);
     result:=true;
     exit;
     end;
except
end;
result:=False;
end;

{ TContextProvider1 }

function TContextProvider1.AssignContext(var Contex: TContex): boolean;
begin
Contex.a:=DataA;
Contex.b:=DataB;
end;

constructor TContextProvider1.create(DataA, DataB: integer);
begin
self.DataA:=DataA;
self.DataB:=DataB;
end;

{ TContextProvider2 }

function TContextProvider2.AssignContext(var Contex: TContex): boolean;
begin
Contex.a:=DataA;
Contex.c:=DataC;
end;

constructor TContextProvider2.create(DataA:integer;DataC:string);
begin
self.DataA:=DataA;
self.DataC:=DataC;
end;

{ TContextProvider }

procedure TForm1.Button1Click(Sender: TObject);
begin
WorkFunc(TContextProvider1.create(1,2));
WorkFunc(TContextProvider2.create(1,"Параметр задан"));
end;


 
Сергей М. ©   (2008-10-15 13:10) [51]


> oxffff


Автор уже забыл свою изначальную затею как страшный сон , а ты все мысли плодишь на эту тему)

Обрати внимание - вопрос вырос из указателя.

А в [28] автор ортогонально развернул оглобли, так что от первоначальная идеи не осталось и следа.

Пилите, Шура, пилите !)


 
oxffff ©   (2008-10-15 14:14) [52]


> Сергей М. ©   (15.10.08 13:10) [51]


Мысли рождаются сами собой.
Например [50] пришла в голову в ванной, когда я мылся после тяжелой физической работы(ремонт дома делаю). Неоднократно замечено, что физический труд очень полезно. Столько мыслей сразу.

:)



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

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

Наверх





Память: 0.55 MB
Время: 0.006 c
2-1223816195
aslanbek
2008-10-12 16:56
2008.11.23
Как сделать главную форму невидимой.


2-1224048798
ekto
2008-10-15 09:33
2008.11.23
курсор не возвращает записи


15-1222403541
Slider007
2008-09-26 08:32
2008.11.23
С днем рождения ! 26 сентября 2008 пятница


2-1223646143
dmitry_12_08_73
2008-10-10 17:42
2008.11.23
Извлечение ресурсов из формы *.fdm


6-1195631001
novill
2007-11-21 10:43
2008.11.23
Как получить показания времени на удаленной машине по сети?





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