小编Bas*_*scy的帖子

使用 IF() 或 CASE 是否有性能差异

在具有多个子选择的大型 UPDATE 语句中,我们使用了大量嵌套的 IF() 语句。我想将这些更复杂的 IF() 语句重构为 CASE 语句,主要是为了提高可读性并减少编码错误的变化。

所以像这样的声明部分:

SET cr.Price=IF(cmr.dirty AND rtg.connectRateToMasterRate=0, cr.Price,
                (cmr.price + IF(rtg.RateDeviationType='FIXED_AMOUNT', 
                                rtg.masterRateRateDeviation, cmr.Price * 
                                rtg.masterRateRateDeviation / 100)  
               )) * IF(masterSettings.masterCurrencyConvertActive='TRUE', 
                       cuMaster.AValue / cu.AValue, 1),
Run Code Online (Sandbox Code Playgroud)

会变成这样:

SET
 cr.Price = CASE WHEN cmr.dirty AND rtg.connectRateToMasterRate
                 THEN
                   (cmr.Price +  
                    IF(rtg.RateDeviationType='FIXED_AMOUNT',  
                        rtg.masterRateRateDeviation,  
                        cmr.Price * rtg.masterRateRateDeviation / 100  
                      )  
                   ) * IF(masterSettings.masterCurrencyConvertActive='TRUE',  
                          cuMaster.AValue / cu.AValue,  
                          1  
                         )  
                 ELSE cr.Price  
            END
Run Code Online (Sandbox Code Playgroud)

我的问题是这样的重构是否会对查询的性能产生影响。请记住,此更新查询将更新数千条记录,因此即使很小的增加也可能会产生重大影响。

顺便说一下,我们使用的是 MySQL 5.6.19。

mysql sql

5
推荐指数
1
解决办法
5327
查看次数

如果一个物体知道很多它的拥有者,这是一种代码味吗?

在我们的Delphi 2007应用程序中,我们使用了很多以下结构

FdmBasic:=TdmBasicData(FindOwnerClass(AOwner,TdmBasicData));
Run Code Online (Sandbox Code Playgroud)

FindOwnerClass向上移动当前组件的Owner层次结构以查找特定类(在示例中为TdmBasicData).生成的对象存储在Field变量FdmBasic中.我们主要使用它来传递数据模块.

示例:生成报告时,生成的数据将被压缩并存储在通过数据模块TdmReportBaseData访问的表的Blob字段中.在我们的应用程序的单独模块中,有一些功能可以使用ReportBuilder以分页形式显示报表中的数据.这个模块(TdmRBReport)的主代码,使用一个类TRBTempdatabase到压缩blob数据转换为当前正在使用的ReportBuilder运行时reportdesigner可用不同的表.TdmRBReport可以访问TdmReportBaseData以获取各种与报告相关的数据(报告类型,报告计算设置等).TRBTempDatabase在TdmRBReport中构建,但必须能够访问TdmReportBasedata.所以现在使用上面的结构完成:

constructor TRBTempDatabase.Create(aOwner: TComponent);
begin
  inherited Create(aOwner);

  FdmReportBaseData := TdmRBReport(FindOwnerClass(Owner, TdmRBReport)).dmReportBaseData;
end;{- .Create }
Run Code Online (Sandbox Code Playgroud)

我的感觉是,这意味着TRBTempDatabase知道很多它的所有者,我想知道这是某种代码气味还是反模式.

你对此有何看法?这是代码味吗?如果是这样,有什么更好的方法?

delphi design-patterns

3
推荐指数
1
解决办法
372
查看次数

如何在构造中创建枚举器销毁?

我有一个从TCollection派生的集合,实现了GetEnumerator,所以我可以在类似的结构中使用它

for lElem in lCollection do
Run Code Online (Sandbox Code Playgroud)

枚举器派生自TObject,与Delphi提供的标准枚举器完全相同,因此没有所有者.

Delphi帮助提到,如果枚举器支持IDisposable,它将被处理掉,但这只适用于.NET.

我想知道的是,枚举器实例如何以及何时以及由谁被释放?

delphi enumerator delphi-2007

2
推荐指数
1
解决办法
454
查看次数

使用派生接口时,接口委派不起作用

在Delphi Seattle 10中,我试图使用implements关键字委托接口的实现,但是当从第一个接口派生的接口也包含在类声明中时,不接受委托.

以下代码的编译失败,并显示"缺少接口方法IInterface1.DoSomethingFor1的实现"消息.如果我从类声明中删除IInterface2,代码将编译.如果我从其他东西中导出IInterface2,那么它也会编译.

我究竟做错了什么?或者我怎样才能做到这一点?

type
  IInterface1 = interface(IInterface)
    ['{03FB3E2E-C0DD-4E17-B6CD-D333E1E7255E}']
    procedure DoSomethingFor1;
  end;

  Iinterface2 = interface(IInterface1)
    ['{89C266E2-2816-46AD-96AA-DD74E78A4D1E}']
  end;

  T1 = class(TInterfacedObject, IInterface1, IInterface2)
  private
    Fi1: IInterface1;
  public
    property I1_Delegate: IInterface1 read Fi1 implements IInterface1;
  end;
Run Code Online (Sandbox Code Playgroud)

delphi

2
推荐指数
1
解决办法
123
查看次数

加入具有相同表的先前记录的表

我有一张包含历史记录的表,在主表中通过几个触发器发布.我想在历史表上创建一个select语句,其中每条记录都按其先前记录JOINed(由相同的LineID和最高的ActionDate标识),因此我可以提取这两者之间的差异.

我试过这个,但是(我的)SQL不允许引用JOINED子选择中的第一个"FROM"表:where子句中的未知列h1.LineID

select 
  h1.*, 
  prev.* 
from history h1
LEFT OUTER JOIN 
  (Select * 
     From history h2 
     where  h1.LineID=h2.LineID and h2.ActionDate < h1.ActionDate 
     order by Actiondate desc limit 1
  ) prev on h1.LineID=prev.LineID
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

mysql sql

2
推荐指数
1
解决办法
779
查看次数

使用enable_if对类方法进行部分模板专门化

我有一个模板类,我想为其专门化整数类型的方法之一。我看到很多使用enable_if特征对模板化函数执行此操作的示例,但我似乎无法获得在类方法上执行此操作的正确语法。

\n

我究竟做错了什么?

\n
#include <iostream>\n\nusing namespace std;\n\ntemplate<typename T>\nclass Base {\n    public:\n    virtual ~Base() {};\n    \n    void f() {\n        cout << "base\\n";\n    };\n};\n\ntemplate<typename Q>\nvoid Base<std::enable_if<std::is_integral<Q>::value>::type>::f() {\n    cout << "integral\\n";\n}\n\ntemplate<typename Q>\nvoid Base<!std::enable_if<!std::is_integral<Q>::value>::type>::f() {\n    cout << "non-integral\\n";\n}\n\n\nint main()\n{\n    Base<int> i;\n    i.f();\n    \n    Base<std::string> s;\n    s.f();\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

上面的代码无法编译:

\n
main.cpp:16:60: error: type/value mismatch at argument 1 in template parameter list for \xe2\x80\x98template class Base\xe2\x80\x99\n   16 | void Base<std::enable_if<!std::is_integral<Q>::value>::type>::f() {\n      |                                                            ^\nmain.cpp:16:60: note:   expected a type, got \xe2\x80\x98std::enable_if<(! std::is_integral<_Tp>::value)>::type\xe2\x80\x99\nmain.cpp:21:61: error: …
Run Code Online (Sandbox Code Playgroud)

c++ templates

2
推荐指数
1
解决办法
296
查看次数

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
Run Code Online (Sandbox Code Playgroud)

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

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

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

function    TPendingBets.GetBdy(out IdEvent : Integer; out idBetType : TBetTypes): …
Run Code Online (Sandbox Code Playgroud)

delphi

0
推荐指数
2
解决办法
8629
查看次数

标签 统计

delphi ×4

mysql ×2

sql ×2

c++ ×1

delphi-2007 ×1

design-patterns ×1

enumerator ×1

templates ×1