首页 / 知识
关于语言不可知论:DoSomethingToThing(Thing n) vs Thing.DoSomething()
2023-04-16 04:53:00

DoSomethingToThing(Thing n) vs Thing.DoSomething()哪些因素决定了哪种方法更合适? 我认为两者都有自己的位置。 你不应该仅仅因为你认为"函数式编程很好"就使用 我认为这取决于您要传达的内容。停止将您的代码视为一系列指令,并开始将其视为故事的段落或句子。从手头任务的angular考虑哪些部分是最重要的。 例如,如果你想强调的\\'sentence\\'部分是宾语,你应该使用OO风格。 示例:
大多数时候,当您传递文件句柄时,您考虑的主要事情是跟踪它所代表的文件。 反例:
在这种情况下,提交 HTTP 请求远比作为正文的字符串重要,所以 不用说,这些并不是相互排斥的。你可能实际上有
你将它们混合在一起。重要的是您要考虑要强调哪些部分,以及您将向代码的未来读者传达什么。 要面向对象,告诉,不要问:http://www.pragmaticprogrammer.com/articles/tell-dont-ask。 所以,Thing.DoSomething() 而不是 DoSomethingToThing(Thing n)。
主动语态比被动语态更直接,因此请确保您的句子的主语不只是"计算机"。这意味着,经常使用表格 1 和表格 3,而很少使用表格 2。 为了清楚起见:
如果你正在处理事物的内部状态,Thing.DoSomething() 更有意义,因为即使你改变了事物的内部表示,或者它的工作方式,与之对话的代码也不会必须改变。如果您正在处理事物的集合,或者编写一些实用方法,那么过程式的 DoSomethingToThing() 可能更有意义或更直接;但是,通常可以表示为表示该集合的对象上的方法:例如
vs
这真的取决于你的代码是如何面向对象的。 我同意 Orion 的观点,但我将重新表述决策过程。 你有一个名词和一个动词/一个宾语和一个动作。
我喜欢文件/字符串示例。有许多字符串操作,例如 "SendAsHTTPReply",这对于您的普通字符串不会发生,但在特定设置中经常发生。但是,您基本上总是会关闭一个文件(希望如此),因此将关闭操作放在类界面中是非常有意义的。 另一种理解方式是购买娱乐系统的一部分。将电视遥控器与电视捆绑在一起很有意义,因为您总是将它们一起使用。但是将特定录像机的电源线与电视捆绑在一起会很奇怪,因为许多客户永远不会使用它。关键思想是这个动作多久会在这个对象上使用一次? 一般来说,如果"something"是一个"thing"自然知道怎么做的动作,那么你应该使用thing.doSomething()。这是很好的 OO 封装,否则 DoSomethingToThing(thing) 将不得不访问"thing"的潜在内部信息。 例如 invoice.getTotal() 如果 "something" 自然不是 "thing\\'s" 域模型的一部分,那么一种选择是使用辅助方法。 例如:Logger.log(invoice) DoSomethingToThing(Thing n) 更像是一种函数式方法,而 Thing.DoSomething() 更像是一种面向对象的方法。 这是面向对象与过程编程的选择:) 我认为有据可查的 OO 优势适用于 Thing.DoSomething() 这已被问到设计问题:电话是否拨打电话号码,还是电话号码在电话上自行拨打? 这里没有足够的信息。这取决于您的语言是否支持构造 "Thing.something" 或等价物(即它是一种 OO 语言)。如果是这样,那就更合适了,因为那是 OO 范式(成员应该与他们作用的对象相关联)。当然,在程序风格中,DoSomethingtoThing() 是您唯一的选择……或者 ThingDoSomething() 即使您不是使用 OO 语言工作,也可以使用 Thing.DoSomething(),以提高代码的整体可读性,具有一组函数,例如: ThingDoSomething() 然后 AnotherThingDoSomething() 等等就更好了。 适用于"事物"的所有代码都在一个位置。当然,"DoSomething"和其他任务的命名应该一致——所以你有一个 ThingOneRead()、一个 ThingTwoRead()... 现在你应该明白了。当您在 12 个月后重新开始编写代码时,您会很高兴花时间让事情变得合乎逻辑。 如果对一个对象执行某项操作可能会在另一种情况下产生不同的结果,那么我建议您使用 oneThing.DoSomethingToThing(anotherThing)。 例如,您可能在程序中保存了两个东西,因此您可能采用 DatabaseObject.Save(thing) SessionObject.Save(thing) 会比 thing.Save() 或 thing.SaveToDatabase 或 thing 更有利。 SaveToSession(). 我很少不向类传递参数,除非我正在检索公共属性。 要添加到 Aeon 的答案,这取决于事情以及您想对它做什么。因此,如果您正在编写 Thing,并且 DoSomething 改变了 Thing 的内部状态,那么最好的方法是 Thing.DoSomething。但是,如果动作不仅仅改变内部状态,那么 DoSomething(Thing) 更有意义。例如:
优于
如果你没有写 Thing,并且不能创建派生类,那么你别无选择,只能做 DoSomething(Thing) 即使在面向对象的编程中,使用函数调用而不是方法(或者就此而言调用对象的方法而不是我们调用它的方法)可能很有用。想象一个简单的数据库持久性框架,您只想在一个对象上调用 save()。您可以创建一个定义 save(Class1)、save( Class2) 等及其实现。然后您实际上会调用 databaseSaver.save(class1) 并将所有内容放在一个地方。 我必须同意凯文·康纳的观点 还要记住这两种形式的调用者。调用者可能是某个其他对象的方法,它肯定对您的事物有作用:) 这里有几个需要考虑的因素:
|
最新内容
相关内容
linux命令行设置语言?
linux命令行设置语言?,系统,管理,环境,国家,工具,电脑,软件,文化,底部,语言,linux命令行下怎样改变语言1、将内容改为:LANG=zh_CN.UTF-8LANGUAGlinux使用命令改语言?
linux使用命令改语言?,系统,工作,管理,电脑,设备,字符集,中文,命令,语言,虚拟机,请问linux虚拟机装好以后怎么把英文改成中文?1、vmware设置中c语言写linux命令?
c语言写linux命令?,系统,工具,代码,智能,工作,环境,情况,位置,命令,文件,如何在C语言编程中调用linux系统终端下的命令1、C语言有一个system函linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux汇编语言命令?
linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇编语言指令的基本格式是什么1、有以下几种基本格式:标号,又称为指令linux内置命令位置?
linux内置命令位置?,工作,系统,信息,地址,位置,标准,命令,目录,密码,名字,Linux系统常用操作命令有哪些1、linux常用命令: pwd命令 该命令的linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux命令防火墙位置?
linux命令防火墙位置?,系统,服务,软件,密码,状态,位置,防火墙,工具,公共,设备,LINUX系统怎么关闭防火墙1、打开linux系统,在linux的桌面的空白linux命令是什么语言?
linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,部分,dos和linux的命令行里面用的是什么语言?1、DOS/Windows/Linuxlinux改语言命令行?
linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,linux命令行下怎样改变语言将内容改为:LANG=zh_CN.UTF-8LANGUAGE=zh_linux命令行c语言?
linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linux终端下如何进行C语言编译1、在Linux下面,如果要编译一个C语言源c语言在linux命令?
c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linux系统的命令是什么linux常用命令有pwd命令、cd命令、ls命令、cat