【发布时间】:2016-03-05 00:43:16
【问题描述】:
程序员经常会注意到他在几个地方有一些非常相似的代码。可以说这里有类似代码的实例。 (为了清楚起见,这是一个玩具示例。在野外,这种反模式通常不会出现在这么简单的代码上)
function showLoginError(){
let msg = "Login Error";
logAtLevel(WARNING, msg);
displayInPopup(msg);
}
function showDbError(){
let msg = "Could not access DB";
logAtLevel(ERROR, msg);
displayInPopup(msg);
notify("db-admin@foo.com");
}
function showUnknownError(){
let msg = "Something has gone wrong";
logAtLevel(ERROR, msg);
displayInPopup(msg);
notify("general-admin@foo.com");
}
一个有经验的程序员可能会重构成这样的东西,现在它可以被普遍重用并且非常容易理解。
function showError(logLevel, msg, notifyEmail){
logAtLevel(logLevel, msg);
displayInPopup(msg);
if(notifyEmail){
notify(notifyEmail);
}
}
function showLoginError(){
showError(WARNING, "Login Error");
}
function showDbError(){
showError(ERROR, "Could not access DB", "db-admin@foo.com");
}
function showUnknownError(){
showError(ERROR, "Something has gone wrong", "general-admin@foo.com");
}
但是对于经验较少的程序员,我经常看到类似的东西
function showError(errorType){
let msg;
let logLevel = ERROR;
if(errorType == "LOGIN"){
msg = "Could not access DB";
level = WARNING;
}else if(errorType == "DB"){
msg = "Could not access DB";
}else if(errorType == "UNKNOWN"){
msg = "Something has gone wrong";
}
logAtLevel(logLevel, msg);
displayInPopup(msg);
if(errorType != "LOGIN"){
notify(errorType == "DB" ? "db-admin@foo.com" : "general-admin@foo.com")
}
}
function showLoginError(){
showError("LOGIN");
}
function showDbError(){
showError("DB");
}
function showUnknownError(){
showError("UNKNOWN");
}
他们应该有独立的部分函数来改变并从函数中提取它们,但相反,他们用“模式”(或有时是布尔标志)创建了一个函数。
函数的模式通常在整个函数的多个位置进行检查,以隐式设置变量和/或确定函数的哪些部分执行。虽然他们已经摆脱了复制粘贴的代码,但他们在其位置添加了一种特殊的意大利面条代码。
我已经看过很多次了,现在我认为它必须有一个名字。
附:如果还没有,我会考虑“Rotini Code”,因为它就像意大利面条,但它有 3 种不同的颜色混合在一起。
【问题讨论】:
标签: anti-patterns