上次画出了求解子系统的顺序图,基本明白了各个类的接口的定义。在具体编程的过程中,发现很不顺手。原因是各个类已经设计得比较具体了,并且有一定得耦合度了,要完成这些编程需要每个类逐个仔细琢磨,感觉有点无从下手,目标遥遥无期——我没有做过OO设计和编程,一切都是从这个项目开始的。于是就觉得,还是先把具体的方法空着吧。这样不就等于是做了一些空接口类么?我猛然想起了AMROC中有不少这样的接口类——几乎没有数据成员,只有纯虚函数。万事皆有其存在的意义。于是,我也在现有的类之上构造了它们的抽象基类。又经过一番反复,求解子系统的逆向类图如下所示
新加入的有以Base为前缀的四个抽象基类:BaseSolver,BaseIntegrator,BaseNumericalBC和BaseInitialCondition。它们完全定义了顺序图中的调用接口。不过,我没有让BaseSolver包含BaseIntegrator,BaseNumericalBC和BaseInitialCondition,因为我发现只有具体的实现中才涉及到相互调用,而在接口定义时是不会遇到这些东西的。所以我在实现Solver的时候才包含了BaseIntegrator,BaseNumericalBC和BaseInitialCondition。我不知道这样是否合适,但是现在看来似乎是合理的。
程序是编了,编译也通过了,不过还没有测试。时间过得好快呀。如果采用结构化编程,估计现在已经做得差不多了。OO编程就是慢呀。
此外,我初步实现了DataFunction。对于这个数组封装类,我本来是打算利用现成的类库,如Blizt++,A++/P++之类的东西。不过考虑到这些玩意本身也不是很简单,为了把它们嵌入进去,我恐怕还需要钻研一下它们的手册,琢磨一下编译,这些要花不少时间。而我对数组封装的要求不高,所以还是自己做个简单的封装算了。