2013年11月2日星期六

weekly update - one list for two item types

这一周都在为之前的设计错误埋单。一个(two dimension) double linked list在当前代码中被广泛使用,其中的ListNode被当作是一种类A了,现在新需求是加入另一种新的种类B,但是要求是用户看到的A跟B是可以混排的,例如A->A->B->A->B->B->A-....。之前为了不影响已有的code,不改当前的list,而重新加入一个新的list,维护那些B,两天时间尝试给这新的ListB来添加维护ListNodeB的功能,例如add / remove/ insert / move等。当作到undo的时候,不行,ListB的操作需要考虑list中前后nodes类型,上下文,A还是B呢?太烦。
于是转肽,把旧的ListNode扩展为默认是typeA, 额外要求的话可以是typeB,于是A and B这两种类型的东西可以mix到一个list里面,因为A and B are objects of the same ListNode。但旧代码对这个list的操作,例如traverse the list to visit every ListNode, 都是把ListNode做为A的,现在要添加判断了:假如是A,照旧,假如是B,新的做法。等于做surgery,但是觉得应该坚持觉得对的而不是避开繁琐的。

这是最简单实例 (one dimention double linked list):
struct ListNode {
  ListNode *m_pPrve, m_pNext;
  bool m_bTypeA; // default is true;
  ...
};
class List {
  ListNode m_pHead;
}; 

没有评论:

发表评论