gpt4 book ai didi

delphi - Delphi 流畅的界面

转载 作者:行者123 更新时间:2023-12-03 14:33:05 25 4
gpt4 key购买 nike

使用fluent interfaces有什么优点和缺点?在德尔福?

流畅的界面应该可以提高可读性,但我对包含大量链接方法的一个长LOC持怀疑态度。

是否存在编译器问题?
是否存在任何调试问题?
是否存在任何运行时/错误处理问题?

流畅的界面用于例如TStringBuilder , THTMLWriterTGpFluentXMLBuilder

<小时/>

更新:
大卫·赫弗南 (David Heffernan) 问我关心哪些问题。我已经对此进行了一些思考,总体问题是“显式指定它是如何完成的”与“让编译器决定它是如何完成的”之间的区别。

AFAICS,没有关于编译器实际如何处理链式方法的文档,也没有关于编译器应如何处理链式方法的任何规范。

this article我们可以了解编译器如何向声明为函数的方法添加两个额外的 var 参数,以及标准调用约定将三个参数放入寄存器中,并将下一个参数放入堆栈中。因此,具有 2 个参数的“流畅函数方法”将使用堆栈,而具有 2 个参数的“普通过程方法”仅使用寄存器。

我们还知道编译器会执行一些魔法来优化二进制文件(例如 string as function resultevaluation orderref to local proc ),但有时会给程序员带来令人惊讶的副作用。

因此,内存/堆栈/寄存器管理更加复杂,而且编译器可能会产生一些意想不到的副作用,这一事实对我来说非常令人讨厌。因此就有了这个问题。

读完答案(非常好的答案)后,我的担忧大大减少,但我的偏好仍然相同:)

最佳答案

每个人都在写负面问题,所以让我们强调一些正面问题。呃,唯一积极的问题 - 减少(在某些情况下大大更少)打字。

我编写 GpFluentXMLBuilder 只是因为我讨厌在创建 XML 文档时键入大量代码。不多不少。

流畅界面的好处是,如果您讨厌这种习惯用法,则不必以流畅的方式使用它们。它们完全可以以传统方式使用。

编辑:“简短和可读性”观点的一个观点。

我正在调试一些旧代码并偶然发现了这一点:

fdsUnreportedMessages.Add(CreateFluentXml
.UTF8
.AddChild('LogEntry')
.AddChild('Time', Now)
.AddSibling('Severity', msg.MsgID)
.AddSibling('Message', msg.MsgData.AsString)
.AsString);

我立即知道代码的作用。但是,如果代码看起来像这样(我并不是说这甚至可以编译,我只是将它放在一起进行演示):

var
xmlData: IXMLNode;
xmlDoc : IXMLDocument;
xmlKey : IXMLNode;
xmlRoot: IXMLNode;

xmlDoc := CreateXMLDoc;
xmlDoc.AppendChild(xmlDoc.CreateProcessingInstruction('xml',
'version="1.0" encoding="UTF-8"'));
xmlRoot := xmlDoc.CreateElement('LogEntry');
xmlDoc.AppendChild(xmlRoot);
xmlKey := xmlDoc.CreateElement('Time');
xmlDoc.AppendChild(xmlKey);
xmlData := xmlDoc.CreateTextNode(FormatDateTime(
'yyyy-mm-dd"T"hh":"mm":"ss.zzz', Now));
xmlKey.AppendChild(xmlData);
xmlKey := xmlDoc.CreateElement('Severity');
xmlDoc.AppendChild(xmlKey);
xmlData := xmlDoc.CreateTextNode(IntToStr(msg.MsgID));
xmlKey.AppendChild(xmlData);
xmlKey := xmlDoc.CreateElement('Message');
xmlDoc.AppendChild(xmlKey);
xmlData := xmlDoc.CreateTextNode(msg.MsgData.AsString);
xmlKey.AppendChild(xmlData);
fdsUnreportedMessages.Add(xmlKey.XML);

我需要相当长的时间(和一杯咖啡)才能理解它的作用。

编辑2:

埃里克·格兰奇(Eric Grange)在评论中提出了完全正确的观点。实际上,我们会使用一些 XML 包装器,而不是直接使用 DOM。例如,使用 OmniXML 中的 OmniXMLUtils包,代码如下所示:

var
xmlDoc: IXMLDocument;
xmlLog: IXMLNode;

xmlDoc := CreateXMLDoc;
xmlDoc.AppendChild(xmlDoc.CreateProcessingInstruction(
'xml', 'version="1.0" encoding="UTF-8"'));
xmlLog := EnsureNode(xmlDoc, 'LogEntry');
SetNodeTextDateTime(xmlLog, 'Time', Now);
SetNodeTextInt(xmlLog, 'Severity', msg.MsgID);
SetNodeText(xmlLog, 'Message', msg.MsgData.AsString);
fdsUnreportedMessages.Add(XMLSaveToString(xmlDoc));

不过,我更喜欢流畅的版本。 [而且我从不使用代码格式化程序。]

关于delphi - Delphi 流畅的界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5103877/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com