OOP是以数据为中心组织算法的。OOP把面向过程的函数变成了类的成员方法的过程,也是过程抽象到数据抽象的转变过程。但我发现,即使在OOP中过程抽象似乎还有存在的意义,特别是,我常对成员方法的设计还是有感觉拿不准的地方。比如:
1.STL中的算法多是作为函数提供的,没有作为容器类的成员方法。对于这个问题,我觉得STL的设计有它的合理的一面:因为sort,transform等算法本身也是一种被人所熟知的概念,它的独立存在是对概念的直接表达;独立性也增强了算法的普适性。但这样的设计也有缺点:对象的行为不够饱满;用户不仅需要获取对象,还需要依赖额外的算法,没有达到数据抽象的高内聚效果。了解mixin以后,我觉得也许mixin是解决这个问题的更好方法:既保持算法的独立性;又可以方便地混入对象达到数据对算法的吸附作用。
2.对于存在交互情况,比如:画笔在画纸上作画,我觉得不管是paper.draw(pen)还是pen.draw(paper)都不如用函数表达为draw(paper,pen)来得自然。据我所知,这种情况在建模中常抽象为一种服务来表达某一功能,比如:DrawService。
请问有没有一个比较好的方法来分析算法什么情况下适合设计为类的成员方法呢?什么情况下又应该作为独立的函数(C++)或者是抽象为服务呢?