同时问其他OO高手:我的类该怎样安排
我做了个树类,里面有
(1)treeview类型的成员变量m_tree,类初始化的时候指向相关联的treeview控件
(2)还有m_strTreeWndName,指向这个treeview所在的窗体名字。注意它有可能是也可能不是treeview的父窗体,由程序员根据自己的需求来定。
(3)还有m_strNodeTable,指向存储这个树控件的节点信息的节点表。
(4)还有m_strTreCtlName,指向这个treeview控件的控件名。这个直接用m_tree.name是得不到的,应为msctlcomlib.treeivew类没有name这个属性。
同一个节点表可能对应多棵树,同一个窗体上也可能有多个树。反正吧,上面4个变量唯一地规定了,当前这个类对象是哪个窗体上哪个树控件以及它是展示的哪个表的数据。
另外还有些用于树生成、增删改拖拽拷贝节点的方法。
除了一些常规的树操作,还有些我自己特别的需求,比如需要知道树节点的值和层次百分比等等,总之吧,为了方便,我给node安排了好些标志位,分别安排在node对象的text, tag, key属性里。
我的树上的节点可以多挂,就是具有同样细节的节点,既可以挂在这棵树上,也可以挂在那颗树上,只要符合一定的规则。所以,节点有多挂计数,知道自己被挂了几次。如果这个计数变为0的话,这个节点对应的细节也会被删掉。(数据库里主要是两类表,节点表和细节表。节点表存各树的节点之间的父子关系,细节表存各种细节的具体信息。节点都有细节类型,不同类型的节点的细节信息存在相应的细节表里)。
说了这么多,我是想说,我这些树它们是联动的,它们是牵一发而动全身的,因为有多挂节点的存在。
而因为存在多树联动的问题,我的树类模块就膨胀得很快,现在要从头翻到尾的都有点累手了。我自己也知道,其中有些过程和函数其实并不是这个树类特有的或直接相关的。[b]我想请教,我该如何安排这些函数?是把它们移出到标准模块里,还是另外写个什么类(可我一时又想不好能抽象出什么对象)[/b]?
举个例子吧。比如我有这么个函数,叫CopyNode。它的功能是把源树atSource上的源节点nodSource移到目标树atDest上的目标节点nodDest下。这个函数,我现在把它放在CAnnaTree类模块中(就是我在开发的这个树类)。可是其实,它并不是直接和CAnnaTree对象绑定的。没错,它是用到了atSource和atDest两个CAnnaTree对象,但是它并不是在处理CAnnaTree的内部事务,它完全是可以用来处理和它本身毫不相干的另外两棵树之间的节点拷贝。所以,我觉得它不应该放在CAnnaTree类里。我另外做个标准模块叫basTree,我把这个函数设为public放在basTree里。但说不出为什么,觉得这种方法不伦不类。呵呵。
再举个例子吧。比如我还有个函数,叫MakeNodeKey。它的功能是根据传来标志位,根据一定的规则,计算返回一个符合标准的节点key值。这个可以说也是和CAnnaTree对象本身不完全相关了,它完全可以用于其他CAnnaTree对象的节点key的计算。
如此种种,感觉很乱。