【厚积薄发系列】C++项目总结1—参数化建模数据基类的设计与演进

需求背景:
产品的名字就不说了,主要需求就是模拟建筑工地施工现场,这就需要构建出各种模拟的三维模型,如:墙梁板柱、道路、围栏、活动板房、拟建建筑、配电箱等等。
主要是模拟真实的建筑施工现场,打造成一款所见即所得的软件。

设计与演进:
第一版:需求给出的构件,每个构件对应设计一个类来实现,每个构件对应的类中包含该构件的位置点信息、各个体、截面轮廓、材质等其他属性信息,也就是一个一个去构造,构件之间都关系都是平级关系。主要类的UML图如下:



第二版:做了几个构件后发现有好些重复的工作,如构件的二次编辑(旋转、平移、镜像等)位置信息的改变需要做的一些矩阵变化都是一样的,不一样只是不同构件自己特有的东西。如:墙和梁本质一样只是截面宽度、厚度、材质不一样而已。而且经分析这些构建的绘制方式无非就是一点式绘制(如柱、配电箱)、二点式绘制(墙、梁)、多边形绘制(板)。于是第二版在构件类的上一层设计一个确定构件位置的数据信息基类,把构件的位置数据信息(点式:一个三维点、两点式:起点和终点、多边形:存polygon(点的集合))抽提到基类。这样设计解决第一版每次都要维护各个构件位置点数据信息的问题,二次编辑等操作都可以在数据基类里面统一完成,子只需要根据位置点信息和一些自己的特有属性尺寸和材质就可以构件出每个构件的三维模型。主要类的UML图如下:


第三版:基于OOP的几大原则来分析的,首先发现GCLDataBaseObject的职能就是点数据信息的维护没必要继承于构件基类GCLBaseObject,采用组合的来建立关系,其次GCLDataBaseObject违反了开放封闭原则,例如如果现在增加了一种新的绘制方法,则位置数据信息的维护只能在GCLDataBaseObject里面加,不好拓展而且可读性不高,所以可以派生成各种类型的子类(点式、线式、面式)。


备注:面向对象设计的几大原则(单一职责、开放封闭原则、里斯替换原则、最小知道原则、接口隔离原则、依赖倒置原则、组合复用原则)

猜你喜欢

转载自blog.csdn.net/lujiang0120/article/details/72568589