面向对象设计问题

时间:2009-02-16 21:47:03

标签: design-patterns

当你注意到一个应用程序有很多类,但是这些类不是真正的可对等对象而是一组常用函数时,你会怎么做?

示例:

Class Point 
{ 
 calculatePoints(something) {} 
 calculatePointsAnotherWay(something) {} 
}

9 个答案:

答案 0 :(得分:11)

我将查看这些函数,了解它们如何使用可实例化的对象。如果是函数:

  • 将用户定义类型的对象作为参数
  • 从该对象中提取数据,
  • 根据对这些提取数据的计算生成结果,

那么该函数是成为其参数类的方法的候选者。这种编码有时候是一个线索,创建原始类型的程序员或编写“外部”函数(或两者)的程序员可能仍然在考虑命令式/程序式,而不是OO风格。

答案 1 :(得分:4)

如果语言允许,我会让它们成为免费(非成员)功能。如果他们不属于一个班级,他们就属于它。

如果要对它们进行分组,请将它们放在单独的命名空间中。

在C#或Java中,这当然是不可能的,所以我可能会将它们放在一个单独的静态类中。

答案 2 :(得分:2)

使方法成为静态和类也是如此(如果可以的话),如果名称不正确则重命名类(例如,Point是该类的一个非常糟糕的名称),然后在适当的情况下移动或重新组合方法。 / p>

我的猜测是你关注的是类的名称。如果有很多这些类,那么需要简洁命名,并且应该遵守Single Responsiblity Principle而不仅仅是通用方法分组。

答案 3 :(得分:1)

根据我的经验,并根据问题中的有限信息进行工作,似乎在这种情况下你不应该做任何事情。拥有一个只包含公共函数和子例程的静态对象(不可实例化)是完全合法的。

答案 4 :(得分:1)

正如你将问题标题为OO。我想你想知道如何将其构造为OO代码。

目前,正如您所描述的那样,作者编写了程序代码,但恰好使用了面向对象的语言。

如果您已经获得了这样的代码,并希望它采用更纯粹的OO形式,那么您需要对OO是什么以及如何在设计中使用其功能进行一些认真研究。

这比我在这里的答案更合适。我认为一本书或10本书可以让你走上正确的道路。

这个可能是一个好的开始: http://www.amazon.com/Object-Oriented-Modeling-Design-James-Rumbaugh/dp/0136298419

答案 5 :(得分:1)

听起来你可以命名PointUtilities类,并使函数静态。

答案 6 :(得分:0)

从我读过的内容来看,分组相关函数显然是对OOP世界中一个类的有效使用。

答案 7 :(得分:0)

代码可能是以程序风格编写的,这本身并不坏。我首先会尝试确保所有方法都相对较小,不超过50行。如果有大型方法,我会将它们拆分为较小的方法。这样我就能确保我有良好的程序设计。如果做得好的话,程序式编程也不是坏事。

然后我将查找具有5个以上参数的方法,并尝试根据参数创建类。然后我会做我称之为C到C ++的转换:将这些“参数”类与操作它们的方法捆绑在一起,因此OO样式将开始出现。

答案 8 :(得分:0)

好吧,似乎框架中的常用方法(例如Java API中的java.lang.Math,.NET Framework类库中的System.Math)是将这些方法分组到static / final / sealed类中并使方法statis / final / sealed。

是的 - 这是一种程序方法。

另一方面,如果你读了很多书(只是开玩笑),可能你可以让它更加面向对象......

在我看来,在适当的时候我没有反对这个意见 - 或许最终承认世界不是纯粹的面向对象更容易。 :)