大家都在写负面问题,那我们来强调一些积极的问题。唔,唯一的积极问题就是——输入量减少了(在某些情况下大大减少)。
我写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));
然而,我更喜欢流畅的版本。[我从不使用代码格式化程序。]
TMyClass.Create.Random(SomeGlobalVar).Double(SomeGlobalVar).Free;
今天和将来是否等同于m := TMyClass.Create; m.Random(SomeGlobalVar); m.Double(SomeGlobalVar); m.Free;
?(愚蠢的例子 - 我知道) - Jørn E. Angeltveit