- 主题:重构了屎山代码
最近完成了重构某位二十年工作经验人员写的代码
其特点是特别善于使用stl,善于使用各种先进特性
主要优点有:
(1)善于使用pair, tuple,各种tuple满天飞
最长定义了一个6个字段的tuple, 各种 std::get满天飞
(2)努力认真严谨,每个函数都有返回值, 都要严格判断返回值, 各种if判断
努力写注释,比如 "//* 添加注释", 3行完成的代码能if注释到9行
(3)善于制造嵌套,努力复用变量, 一个函数七八层嵌套是常事
所有嵌套公用N个变量,这些变量在每层意思均不同
(4)善于在if, for声明中使用复杂labmda表达式,比如完成一个自定义查找算法
并且绝不换行,最长的一行代码打到378个字符
(5)善于简化if,for循环的代码行数, 循环的业务逻辑提升到if,for中
能够有效避免一屏看不清 { }对应关系
看了他的代码后,我觉得程序员秃头是有原因的
--
FROM 221.219.211.*
bool CUSBLProcess::ReplyTransponderState(QByteArray byUSBLData)
{
bool bParseOK = false;
QString strUnpacketData = "";
if(m_DataProtocol.UnpacketData(std::move(byUSBLData), strUnpacketData))
{
QDomDocument doc;
doc.setContent(strUnpacketData);
if(!doc.isNull())
{
QDomElement elementObject = doc.documentElement();
if(!isValidReply(elementObject))
{
return false;
}
QDomNode node;
QDomNamedNodeMap AttributeNodeMap;
QDomNodeList nodeList = elementObject.elementsByTagName("SynchStatus");
if (!nodeList.isEmpty() && !(nodeList = nodeList.at(0).toElement().elementsByTagName("Job")).isEmpty())
{
node = nodeList.at(0);
if(!node.isNull() && !node.attributes().namedItem("RemoteControlEnabled").isNull() && !(nodeList = node.toElement().elementsByTagName("Objects")).isEmpty())
{
if(!(nodeList = nodeList.at(0).toElement().elementsByTagName("Object")).isEmpty())
{
AttributeNodeMap = nodeList.at(0).attributes();
if(!AttributeNodeMap.namedItem("Type").isNull() && !AttributeNodeMap.namedItem("UID").isNull() &&
!(nodeList = nodeList.at(0).toElement().elementsByTagName("Properties")).isEmpty() &&
!(node = nodeList.at(0).attributes().namedItem("State")).isNull())
{
std::string sType = AttributeNodeMap.namedItem("Type").nodeValue().trimmed().toStdString();
std::string sUID = AttributeNodeMap.namedItem("UID").nodeValue().trimmed().toStdString();
if(node.nodeValue().trimmed() == "Tracked")
{
auto itTransponder = m_mTransponder.end();
if((itTransponder = std::find_if(m_mTransponder.begin(), m_mTransponder.end(), [sType, sUID](const std::map<int32_t, std::tuple<std::string, std::string, std::string, int32_t, int32_t, std::string>>::value_type &ItemData){return std::get<0>(ItemData.second) == sType && std::get<1>(ItemData.second) == sUID;})) != m_mTransponder.end())
{
std::get<2>(itTransponder->second) = node.nodeValue().trimmed().toStdString();
}
bParseOK = true;
}
}
}
else
{
bParseOK = true;
}
}
}
}
SendUSBLDataToDisplay(doc);
}
return bParseOK;
}
【 在 pgw 的大作中提到: 】
: 你倒是贴几段赏析一下
--
FROM 221.219.211.*
在这里你看不出玄妙
拷贝到文本编辑器里不换行才知道酸爽
【 在 Zinux 的大作中提到: 】
: 其实他没干啥呀,就是用了move和lambda,还好吧
: 大部分都是xml的常规代码
--
FROM 111.199.185.*
这是重构后的代码
QDomElement node = doc.documentElement()
.firstChildElement("SynchStatus")
.firstChildElement("Job")
.firstChildElement("Objects");
bParseOK = !node.isNull();
【 在 hgoldfish 的大作中提到: 】
: 我倒觉得这个代码还可以。非常清晰地说明这个代码里面是解析 xml 的代码,并且回复。
: 无论是 Qt 还是 JAVA,碰到解析 xml 都特别麻烦。除非使用 python 才简单一些,几个 query 就搞定了。业务代码就是烦。
--
FROM 111.199.185.*
主要是把一些严重影响代码行数,让人很难看懂逻辑走向的代码改进
比如提取公用函数,改进类型安全,消灭不必要的分支和返回
像上面代码写的例子,就几乎是重写了
应该说写这个代码是能work的,可读性太差
平白无故增加了太多的编码和调试工作量
让后续的人难以维护
【 在 zpfzhang 的大作中提到: 】
: 你咋重构呢?按你的理解重写一遍?
: 发自「今日水木 on iPhone 8」
--
FROM 111.199.188.*
我觉得会,甚至觉得应该禁止使用tuple
【 在 codeAnimal 的大作中提到: 】
: tuple会不会降低可读性?
--
FROM 111.199.188.*
全靠人测~
【 在 tgfbeta 的大作中提到: 】
: 你们用了啥测试框架?
: 还是你手写了测试集保障你的重构?
--
FROM 111.199.189.*