我应该使用类或方法来包装动态远程过程调用吗?

时间:2012-02-10 12:53:59

标签: delphi oop wrapper rpc

情况

我想使RPC界面更易于使用。这是一个自定义界面,因此没有现成的包装器。

我必须围绕通常有很多参数的函数编写几个包装器。

可能的解决方案

解决方案1 ​​ - 为每个函数使用一个类:

TDoSomethingFunction = class
public
  property Arg1: Integer;
  property Arg2: string;
  property Arg3: Boolean;
  procedure Run;
end;

调用者必须创建一个对象来调用该函数:

var
  DoSomething: TDoSomethingFunction;
begin
  DoSomething := TDoSomethingFunction.Create;
  try
    DoSomething.Arg1 := 0;
    ...
    DoSomething.Run;
  finally
  free;
end;

方法2 - 为每个函数使用包装器方法:

procedure TRPCInterface.DoSomething(AArg1: Integer; AArg2: string; AArg3: Boolean);

来电者可以简单地称之为:

TRPCInterface.DoSomething(0, ...);

Pro和contra

方法1 - 每个函数的类

魂斗罗

  • 需要更多代码。
  • 必须创建一个占用内存的对象。

  • 阅读代码更容易,您不必查看声明以查看参数是什么。

方法2 - 包装方法

魂斗罗

  • 您只需查看代码就无法判断使用了哪些参数。

  • 写的代码要少得多。
  • 包装器更薄(不需要创建任何对象)。

我应该使用哪种方法?

2 个答案:

答案 0 :(得分:2)

您尚未指定Delphi版本,但如果您支持泛型,我会选择:

type
  TArgList = class( TDictionary< String, Variant > );

type
  TBaseFunc = class
  private
    FArgs: TArgList;
  public
    function Run: Boolean; virtual; abstract;
  public
    property Args: TVarList read FArgs write FArgs;
  end;

type
  TSpecialFunc = class( TBaseFunc )
  public
    function Run: Boolean; override;
  end;

实施

function TSpecialFunc.Run: Boolean;
begin
  // here's where you can access args as variants
end;

你可以使用:

ASpecialFunc.Args.AddOrSetValue('ArgumentName', 2012);

通过这种方式,您将不得不编写更多代码,但它的可读性更高,并且将来很容易被其他开发人员选中。

注意:我没有测试过这段代码,因此很可能无法编译。

这是我的两分钱,我对其他人想出的东西非常好奇(:

答案 1 :(得分:2)

有一个中间解决方案正在调用传递对象参数的包装器方法。

TDoSomethingArgs = class
public
  property Arg1: Integer;
  property Arg2: string;
  property Arg3: Boolean;
end;

procedure TRPCInterface.DoSomething(Args: TDoSomethingArgs);

这种方法的一个优点是你仍然使用方法,但它仍然更具可读性。 在参数中使用类(也可以使用记录)的一个优点是,您可以稍后更改参数(添加更多,更改行为),如果您选择它,它不会破坏向后兼容性 - 总之,您可以更改方法签名没有破坏代码。