我有这样一个代码结构,我这里用类来描述。
class P0
class P1(P0)
class P2(P0)
class P3(P0)
class C1(P1,P2)
class C2(P1,P3)
每一个类里面都有好几种方法,子类会多次调用父类的方法。如果我把代码改成全为普通函数,那不是其中逻辑少了很多?今后自己维护起来也不方便。
提前感谢任何的建议或帮助。
我有这样一个代码结构,我这里用类来描述。
class P0
class P1(P0)
class P2(P0)
class P3(P0)
class C1(P1,P2)
class C2(P1,P3)
每一个类里面都有好几种方法,子类会多次调用父类的方法。如果我把代码改成全为普通函数,那不是其中逻辑少了很多?今后自己维护起来也不方便。
提前感谢任何的建议或帮助。
julia的核心逻辑是面向过程而非面向对象,所以在考虑改写传统上OOP的代码时的确需要重新设计。
对于你这里的情况,P0
可以考虑作为AbstractStruct
,而P1, P2, P3
则是三个P0
的子类实例struct
。而C1
和C2
作为描述上述子类之间相互关系的“子类”,在julia中可以完全借由multiple-dispatch多重派发来完成,而无需使用新的类来描述。而所谓“子类多次调用父类方法”,那就应该考虑把这些通用的方法接口参数的类型写成P0
的类型。大致这样的思路改写不大应该损失任何逻辑,反倒是应该由于减少了boiler plates使得代码变得更简单了。
英文社区对此有非常多的讨论。但我还没有找到比较好的总结。
目前比较完备的材料是:《Hands-On Design Patterns and Best Practices with Julia》
在以上链接中,Stefan Karpinski的一个视频和一份文字说明值得着重浏览:
如Chris Rackauckas所说,我们比较熟悉的OOP可以理解为single dispatch,也就是基于实际上的第一个参数来选择调用的方法。但是Stefan的回帖中也指出了用class组织代码的局限性,以及为什么Julia不想也不需要支持class。