在编写API或可重用对象时,是否有任何技术原因,为什么所有返回“void”的方法调用都不应仅返回“this”(在C++中为this)?
例如,使用字符串类,我们可以做这种事情:
string input= ...;
string.Join(input.TrimStart().TrimEnd().Split("|"), "-");
但是我们不能这样做:
string.Join(input.TrimStart().TrimEnd().Split("|").Reverse(), "-");
..因为Array.Reverse()返回void。
还有许多其他示例,其中API具有许多返回无效值的操作,因此代码最终看起来像:
api.Method1();
api.Method2();
api.Method3();
..但是完全有可能写:
api.Method1().Method2().Method3()
..如果API设计者允许这样做。
遵循此路线是否有技术原因?还是只是样式,以表示可变性/新对象?
(x-ref Stylistic question concerning returning void)
EPILOGUE
我已经接受了Luvieere的回答,因为我认为这最好地表示了意图/设计,但是似乎有一些流行的API示例与此有所不同:
在C++中,cout << setprecision(..) << number << setwidth(..) << othernumber;
似乎会更改cout对象,以修改下一个插入的数据。
在.NET中,Stack.Pop()
和Queue.Dequeue()
都返回一个项目,但也更改了集合。
向ChrisW和其他人提供有关实际性能成本的详细信息的道具。
参考方案
返回无效状态的方法更清楚地表明它们具有副作用。返回修改结果的结果应该没有副作用,包括修改原始输入。使方法返回void意味着它更改了其输入或API的某些其他内部状态。
改造正在返回一个空的响应主体 - java我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…
当我运行python代码时,它说“ <<目前是意外情况” - python基本上,这是我们合作者的python代码,用于生成网格,该网格是在Linux环境下开发的。我使用Cygwin在Windows上运行此代码。麻烦部分如下。 BiV_temp.geo也是一个python脚本。因此,命令是用预定义的数字和文件名替换脚本BiV_temp.geo中的字符串。os.system('cp BiV_fiber.geo BiV_te…
Google Analytics API - php我正在实施Google Analytics(分析)Api。授权完成没有问题。成功授权后,我得到403 return code并得到消息:User does not have sufficient permissions for this profile。我的帐户具有Google Analytics(分析)数据,可以跟踪多个网站,并且我可以从网络浏览器访问它而…
Java中的“ <<”运算符 - java最喜欢的语句来自Java的Character类:(1 << Character.PARAGRAPH_SEPARATOR)) >> type PARAGRAPH_SEPARATOR是字节,type是整数。这句话中的操作员,他们做什么?如何以及在哪里可以使用这些运算符?这是oracles java.lang.Character文档。该类中…
我需要帮助将此REST API Curl命令转换为Python请求 - python我在这里是新手,老实说对所有编码都是新手。我正在尝试创建一个Pyton脚本,以使用REST API从Request Tracker资产数据库中搜索项目。到目前为止,我得到了以下Curl命令:curl -X POST \ -H "Content-Type: application/json" \ -d '[{ "fiel…