讨论一下这个问题如何设计类结构?
手头上现在有一个比较麻烦的算法问题,描述如下:
客户所给算法有大约20多类,每类下面又下辖2-10种不同的算法,在这一共约100多种算法中,相互之间又有依赖关系,即,A算法要使用B的结果,B算法呢,又要使用C算法和D算法的计算结果,简单的说,这种依赖关系是一个有向无环图,现在的问题是,如何把这些算法结构很好的使用C++类实现,要满足结构清晰,调用简单,而且便于扩充。
针对这个问题,我想了如下两种方式:
1.设计一个算法抽象类,类中定义入口double参数指针与算法抽象类本身接口列表(以便调用子类算法),动作成员为一个抽象的计算函数,同时把这100多种算法编号定义成宏,每一个类别的算法继承这个抽象接口,类中定义一个工厂函数,用于根据指定宏编号产生对应的具体实现子类算法,最后,算法子类继承类别算法类,实现具体的算法实现。
2.把所有算法编号,并把这些依赖关系存放到一个数据库表(或XML文件)中,设计一个算法基类,类成员中定义参数列表及读取依赖成员的虚函数,算法实现类继承该类,实现读取依赖成员函数(从数据库表或XML中),并据此调用其它成员实现相应算法。
以上两个方法我认为各有优缺点:第1个方法效率效高,但结构固定,扩充比较麻烦,用户可能需要了解算法调用细节,第2个算法由于与外部表发生了关系,计算效率可能有影响,但扩充性比较好,即维护这张依赖表同时可以继承类别类以实现新算法。
各位大虾,那个方法更好?或您有什么更好的想法?
[解决办法]
我对“算法”还没理解
算法:对一堆数据输入得到一堆输出,
你的算法,怎么还有依赖关系呢,
好像是流水线上的一个节点,
[解决办法]
不同的算法有不同的益处,这个估计和实际情况有关系,要是给油藏人员使用,并且想分门别类做好划分的话,估计你要了解这些算法的特点,然后根据使用情景分类,不过我想这个工作量有些大,要么你就按照使用的地质情况或者其他直观的划分方式分类。
我的意思就是了解算法本身,了解使用的情景,自然就分好类了,至于封装的方式,这个也是看情况吧,估计这类算法需要扩展的机会比较少!
[解决办法]
(1)如果有实现相同功能的算法,可以按算法实现的功能进行分类,这样同类的算法随时可以进行扩充。
(2)如果只是算法间存在依赖,那把相互依赖的算法封装成一个算法模块,每个算法模块对外具有相同的接口方式,以后扩充算法就是扩充一个算法模块,并且改变已有算法模块的算法对客户的使用没有影响。