DoSomethingToThing(事情n)与的事情。或重写现有的()
-
09-06-2019 - |
题
什么因素决定其方法是更合适?
解决方案
我认为两者都有自己的地方。
你不应该简单的使用 DoSomethingToThing(Thing n)
只是因为你觉得"编程功能是良好"。同样地你不应该简单的使用 Thing.DoSomething()
因为"面向对象编程是良好"。
我认为这归结到你们试图传达的。停止思考你的代码作为一系列的指令,并开始思考这样一段或一句的一个故事。想想哪些部分是最重要的是从观点的任务。
例如,如果一部分的'一句'你想强调的是目的,应使用面向对象的风格。
例如:
fileHandle.close();
大部分时间当你传递文件的处理,主要的东西你想的是跟踪的文件,它表示。
反:
string x = "Hello World";
submitHttpRequest( x );
在这种情况下提交HTTP请求是重要得多的串其是身体,所以 submitHttpRequst(x)
是最好 x.submitViaHttp()
不用说,这些并不是相互排斥的。你可能会实际上有
networkConnection.submitHttpRequest(x)
在哪你把他们两个。重要的是,你想谈什么零件都强调,和什么你会被传送到未来读者的代码。
其他提示
是面向对象的,告诉别问: http://www.pragmaticprogrammer.com/articles/tell-dont-ask.
这样,事情。或重写现有的()而不是DoSomethingToThing(事情n)。
如果你处理内部状态的一个东西,东西。或重写现有的()更有意义,因为即使如果改变内部表示的事情,或者它是如何工作的,该代码说它没有改变。如果你正在处理一个集合的事情,或者编写一些实用方法、程序式的DoSomethingToThing()可能会更有意义或更直接的前进;但是,通常可以表示为方法上的对象表示,收集:例如
GetTotalPriceofThings();
vs
Cart.getTotal();
这真的取决于如何对象向你的代码。
- 事情。或重写现 是适当的,如果事情是象你的句子。
- DoSomethingToThing(事情n) 是适当的,如果事情是象你的句子。
- ThingA.DoSomethingToThingB(ThingB m) 是的一个不可避免的结合,因为在所有的语言,我可想到的职能属于一个类别并不相互拥有。但这是有道理的,因为你可以有一个主题,一个对象。
活动的声音是更加直截了当于被动语,所以确保你的句子有一个主题,不只是"电脑"。这意味着,使用形式1和表3,并使用形式2很少。
为了清楚起见:
// Form 1: "File handle, close."
fileHandle.close();
// Form 2: "(Computer,) close the file handle."
close(fileHandle);
// Form 3: "File handle, write the contents of another file handle."
fileHandle.writeContentsOf(anotherFileHandle);
我同意马,但我要重新措辞的决策过程。
你有一个名词和词/象和行动。
- 如果许多对象的这种类型将使用这一作用,尝试让该行动的一部分的对象。
- 否则,尝试组的行动分开,但与有关的行动。
我喜欢文件/字符串的实例。有许多串行动,例如"SendAsHTTPReply",这不会发生对于你的平均串,但经常发生在某一设置。然而,基本上你将永远关闭一个文件(希望),所以它非常有意义投入的关闭行动的类界面。
另一种方式认为这是因为购买部分的一个娱乐体系。它是有意义的束了电视遥控电视、因为你总是使用他们在一起。但是,这将是很奇怪捆电线电缆用于一个具体的录像机有一台电视,由于许多客户永远不会用这个。关键的想法是 如何经常将这种行动可以用于这个目的?
几乎没有足够的信息在这里。它取决于如果你的语言,甚至支持建造"东西。什么"或同等(ie。这是一个面向对象的语言)。如果是这样,这是更为合适,因为这是OO模式(成员应以相关对象,他们的行为)。在一个程序性风格,当然,DoSomethingtoThing()是你唯一的选择...或ThingDoSomething()
DoSomethingToThing(事情n)将更多的功能性做法而事情。或重写现有的()将更多的面向目标的方法。
这是面向对象的与过程编程的选择:)
我认为很好的记录OO优点应用到的东西。或重写现有的()
这里有几个要考虑的因素:
- 你可以修改或延长
Thing
类。如果不是,使用前 - 可以
Thing
实例化。如果不是,使用后作为一个静态的方法 - 如果
Thing
实际上得到修改(即具有的性质,改变),倾向于后者。如果Thing
不是修改后者只是作为可接受的。 - 否则,作为对象是意图在现实世界的目的,选择的方法,似乎更多地立足于现实。
即使你不是在工作中面向对象的语言,在那里你会有的东西。或重写现有的(),用于总体的可读性代码的、具有一定的职能,如:
ThingDoSomething() ThingDoAnotherTask() ThingWeDoSomethingElse()
然后
AnotherThingDoSomething()
等等是远远更好。
所有代码,适用于"东西"是一个位置。当然,"或重写现有的"及其他任务应该是命名一致的-所以你有一个ThingOneRead()、ThingTwoRead()...现在你应该得到点。当你回到工作上的代码,在十二个月时,你会更好抽出时间来做事情的逻辑。
在一般情况下,如果"东西"是一个行动是"事情"当然知道怎么做,那么应当使用的事情。或重写现有的().这是很好的OO封装,因为否则DoSomethingToThing(事情)会访问潜在的内部信息的"事情"。
例如发票。getTotal()
如果"什么"是不自然的一部分"的事情的"领域模型,然后一个选择是使用辅助方法。
例如:记录。日志(发票)
如果DoingSomething到的一个目的是可能会产生不同的结果在另一种情况,那么我建议你oneThing.DoSomethingToThing(anotherThing).
例如你可能有两个被拯救的东西在你的节目所以,你可能会通过一DatabaseObject.保存(事情)SessionObject.保存(事情)将更有利于事情。Save()或事情。SaveToDatabase或事情。SaveToSession().
我很少通过没有参数的一类,除非我检索的公共性质。
添加Aeon的答案,它取决于所述的事情和你想要做什么。所以如果你正在写的东西,或重写现有改变国家内部的事情,那么最好的方法是事情。或重写现有的.然而,如果的行动并不改变内部的状态,然后或重写现有的(事情)更有意义。例如:
Collection.Add(Thing)
比
Thing.AddSelfToCollection(Collection)
如果你没有写东西,并不能创建一个源类,那么你有没有chocie但要做到或重写现有的(事情)
即使在面向对象编程可能是有用的,使用一种功能的电话,而不是一个方法(或对于这个问题的呼叫一个对象的方法之外的其他我们叫它上)。想象一下,一个简单的数据库中的持久性框架,你会喜欢只是呼救()关于一个对象。而不是包括SQL声明在每一课你想要有保存,从而使问题复杂化的代码、传播SQL全代码并使改变储存引擎的一个饼,您可以创建一个接口界定保存(1级),省(2级)等。及其执行情况。然后你会实际上是呼吁databaseSaver.保存(1级)和拥有一切的一个地方。
我有同意 凯文*康纳
还铭记的呼叫者不论的2形式。呼叫者可能是一种方法的其他一些目的,肯定不是你的东西:)