什么因素决定其方法是更合适?

有帮助吗?

解决方案

我认为两者都有自己的地方。

你不应该简单的使用 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();

这真的取决于如何对象向你的代码。

  1. 事情。或重写现 是适当的,如果事情是象你的句子。
    • 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形式。呼叫者可能是一种方法的其他一些目的,肯定不是你的东西:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top