Функции и процедуры в Delphi (значения по умолчанию и дополнительные параметры)

Обновлено:

Есть ли лучший способ сделать это?

TPendingBets = class(TDataModule)
  private
  public
    function    GetBdy(out IdEvent : Integer                           )                                                           : Boolean; overload;
    function    GetBdy(out IdEvent : Integer; out idBetType : TBetTypes)                                                           : Boolean; overload;
    function    GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean; overload;
  end;

implementation

////////////////////

function    TPendingBets.GetBdy(out IdEvent : Integer ): Boolean;
var idBetType : TBetTypes;
    TotalOrgStake,Price : Double;
    PriceError :Boolean;
begin
   result :=  GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;

////////////////////

function    TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes): Boolean;
var TotalOrgStake,Price : Double;
    PriceError :Boolean;
begin
   result :=  GetBdy(IdEvent,idBetType,TotalOrgStake,Price,PriceError);
end;

////////////////////

function    TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes; Out TotalOrgStake,Price : Double; out PriceError :Boolean): Boolean;
begin
    result :=  false;
    if cdBdy.Eof = False then
    begin
       IdEvent   :=   cdBdy.FieldByName(IdEvent ).AsInteger);
       idBetType :=   TBetTypes(cdBdy.FieldByName(idBetType ).AsInteger);
       //.
       //.
       result := True;
    end;  
end;

ПРИМЕЧАНИЕ:

Поскольку мой первоначальный вопрос был не очень ясным, я удалил его часть.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
8 829
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Я думаю, что решение с перегрузкой - неплохое решение, по крайней мере, таковое. Другие языки программирования требуют, чтобы вы объявляли функции с другими именами.

Другой подход может быть параметром динамического массива, например:

type
  TExtendedDynArray = array of Extended;  // if not already declared elsewhere

function Fn1(out arr: TExtendedDynArray): Boolean;

В дополнение к тому, что написал Уве (и я согласен, что перегрузка - лучшее решение здесь; проголосовали за), вы никогда не должны предполагать, что параметр out вообще имеет какое-либо значение в начале функции. Вот что значит "вне".

Вы можете использовать перегруженную функцию примерно так

функция Fn1 (Out A: строка; B: целое число = 5): логическое; перегрузка;

функция Fn1 (Out A: строка): логическое; перегрузка;

вы должны определить обе функции.

Я думаю, что это не сработает, поскольку вызов типа Fn1 (stringvar) неоднозначен. Компилятор не должен принимать это.

Uwe Raabe 16.01.2009 21:25

Да, это не сработает, потому что, если вы укажете только строку, она не сможет сказать, что вызывать.

Jim McKeeth 16.01.2009 23:27

Перегрузка не означает наличие 5 копий код в функции. У вас может быть 5 функций, но 4 из них просто позвони основная функция с правильными параметрами.

Мне вообще не нравятся параметры вне. Вы думали о возврате записи, содержащей все результаты?

Fn1Result = record
  A: Extended;
  B: Integer;
  C, D, E, F: Extended
  S: String;
end;

Затем объявите свою функцию как:

function Fn1: Fn1Result;
begin
  Fn1.A := C_ConstA;
  // etc. . . .
end;

Естественно, я предполагаю, что вы не используете выходные параметры в качестве входных. В справке Delphi:

An out parameter, like a variable parameter, is passed by reference. With an out parameter, however, the initial value of the referenced variable is discarded by the routine it is passed to. The out parameter is for output only; that is, it tells the function or procedure where to store output, but doesn't provide any input.

У меня странное ощущение, что вы используете выходные параметры в качестве входных. Не надо. Передайте их как вар, если хотите, чтобы они шли в обе стороны.

Значения по умолчанию можно использовать только для входных параметров (то есть по значению и константе). Для параметров var и out значения по умолчанию невозможны.

Как уже отмечал Джим: вы можете избежать дублирования кода, если большинство перегруженных функций вызовут ту, которая принимает все параметры, так что они будут просто тонкими слоями по сравнению с исходной функцией. Начиная с Delphi 2005, вы можете объявлять их встроенными, чтобы компилятор действительно мог генерировать более эффективный код.

Как показал Джим, вам не нужно копировать код при перегрузке.

Мне не очень нравится смешивать параметры со значениями по умолчанию, перегрузка а также, потому что (делая это без осторожности) вы можете создать беспорядок.

Обычно, если мне нужно поддерживать много синтаксисов:

1) Я определяю полную подпись с помощью ВСЕ ПАРАМЕТРЫ. Назовем это «мастер» один.

2) Все перегрузки вызывают это. Или звоните друг другу, но в конце концов каждый Цепочка перегрузки должна вызывать «главную» для выполнения задачи.

Для меня перегрузки - это «обработчики параметров» или «переводчики». Позже, если мне понадобится что-то, чтобы изменить основное поведение, я создаю новые параметры на «мастере» (которые могут иметь значения по умолчанию - на самом деле, в большинстве своем имеют).

Если мне нужна перегрузка с новым параметром, я создаю новый, и он просто передаю его в «мастерская» процедура. Побочным эффектом является то, что старые продолжают вести себя так же.

Другие вопросы по теме