有的程序在写之前都会很好地“研究”一番,讲究一些独特的技巧,但有时可能造成后来的维护者半天看不明白。过去这方面见过,相信也有人遇到过类似的情况。
个人觉得一般程序在不响应功能的情况下应该顺其自然,适合常规思维、简单易维护为目的。
下面以开发中的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));
}
自然地实现上面的代码,相信将来即使它出现了问题,维护者也不会感觉到头痛.