以顺其自然的思路写程序(Thinkvd开发日志)

来源:互联网 发布:图像轮廓提取软件 编辑:程序博客网 时间:2024/06/02 17:37

      有的程序在写之前都会很好地“研究”一番,讲究一些独特的技巧,但有时可能造成后来的维护者半天看不明白。过去这方面见过,相信也有人遇到过类似的情况。

  个人觉得一般程序在不响应功能的情况下应该顺其自然,适合常规思维、简单易维护为目的。

下面以开发中的thinkvd merge items 合并不同的条目为例说明一下:
实现目的:把当前选择的ITEM合并生成新item,需要合并的item为刚生成的新item的子item,有点拗口,以图示例:



实现思路:
1。判断item 数不小于2条
2。生成新的item1作为父记录
3。遍历itemA、B、C并成为item1的子item 2,3,4
4.  将A,B,C的数据COPY到对应的2,3,4中
5。计算出item1的时长及输出文件大小。

相关QT代码:
void AxListTreeViewEx::onMergeItem()
{
 QModelIndexList indexs = selectedRows();
 if (indexs.count() < 2) return;

 tplStringVarMap map;
 map.insert("_name", "merge item");
 map.insert("_outfile", "merge_tem");
 map.insert("_target", m_profileComboBox->getProfileSuffix());
 QModelIndex index = addItem(map, QModelIndex());
 ImListTreeItem *pItem = modelEx()->getItem(index);  //item1
 m_profileControl->putProfileData(pItem->getItemKey());

 QString s;
 double totalTime = 0;
 foreach(QModelIndex idx, indexs)
 {
    ImListTreeItem *item = modelEx()->getItem(idx); //itemA,B,C
    totalTime += item->data("_duration").toDouble();


   // subItem info
   map.clear();
   map.insert("_name", item->data("_name"));
   map.insert("_duration", item->data("_duration"));
   map.insert("_target", pItem->data("_target"));
  
   // qDebug() << leftVal << "== "<< rightVal << s;
   QModelIndex subIdx = addItem(map, index);  //item2,3,4
   ImListTreeItem *subItem = modelEx()->getItem(subIdx);
   subItem->backupMediaData(item);
}

 pItem->setData("_duration", totalTime);
 pItem->setData("_outsize", outputSize(pItem, m_profileControl));
}

自然地实现上面的代码,相信将来即使它出现了问题,维护者也不会感觉到头痛.