我必须实现一种完全符合程序设计方法的算法。它与某些数据结构无关,它只需要几个对象,一堆控制参数并对它们执行复杂的操作,包括创建和修改中间时态数据,子程序调用,许多cpu密集型数据转换。该算法太具体,不能作为方法包含在任何参数对象中。
用OOP语言包装这些算法的惯用方法是什么?使用执行计算的静态方法定义静态对象?定义将所有算法参数作为构造函数参数并使用result
方法返回结果的类?还有别的吗?
如果你需要更多细节,我是用scala写的。但任何一般的OOP方法也适用。
答案 0 :(得分:3)
静态方法(或者在Scala的情况下对单例对象的方法 - 我只是称之为静态方法,因为这是最常用的术语)可以完美地工作,并且可能是最常用的方法此
使用其他方法有一些原因,但它们并非绝对必要,我会避免使用它们,除非你真的需要它们提供的优势。这是因为静态方法是最简单的(如果不是通用的)方法。
使用非静态方法非常有用,因为您可以使用工厂模式等设计模式。例如,您可能拥有一个Operator
类,其方法为evaluate
。现在,您可以让不同的工厂创建不同的Operator
,以便您可以即时交换算法。也许计算器可能有AddOperatorFactory
,MultiplyOperatorFactory
等等。显然,这要求您能够实例化表示算法的对象。当然,你可以直接传递函数,就像Scala和许多其他语言所允许的那样。但是,类允许继承,这为一些设计模式打开了大门,而且,你要问的是OOP,而不是Scala。
同样有用的是具有对象状态的能力。使用静态方法,保留状态的唯一选项是具有全局状态(ew)或使静态方法的用户跟踪此状态(为用户提供更多工作)。使用对象的实例,您可以将该状态保留在实例中。例如,如果您的算法是图搜索,也许您希望在找到第一个匹配(显然需要存储状态)后允许恢复搜索。
要做new MyAlgorithm().doStuff()
而不是MyAlgorithm.doStuff()
并不困难,所以如果有疑问,如果您认为自己需要具备的功能,我会错误地避免使用静态方法一个实例提供。