gpt4 book ai didi

anti-patterns - 这个反模式(一个带模式的函数)有名字吗?

转载 作者:行者123 更新时间:2023-12-03 21:35:40 32 4
gpt4 key购买 nike

程序员经常会注意到他在几个地方有一些非常相似的代码。假设这里有类似代码的实例。 (为了清晰起见,这是一个玩具示例。在野外,这种反模式通常不会出现在如此简单的代码中)

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");
}

他们应该有独立的部分功能,可以改变并将它们从函数中提取出来,但相反,他们制作了一个带有“模式”(或有时是 bool 标志)的函数。

函数的模式通常在整个函数的几个地方进行检查,以隐式设置变量和/或确定函数的哪些部分执行。虽然他们已经摆脱了复制粘贴的代码,但他们在其位置添加了一种特殊的意大利面条代码。

我已经看到了足够多的时间,现在我在想它必须有一个名字。

附言如果一个不存在,我在想“Rotini Code”,因为它就像意大利面,但它有 3 种不同的颜色混合在一起。

最佳答案

是的,这是 RTTI = 运行时类型信息。通常是代码异味,有时不是。

通常它是一种代码异味,应该用多态替换,参见例如Do polymorphism or conditionals promote better design?

顺便说一句,Java 枚举的功能更像是枚举类的子类,因此您可以避免编写大量打开枚举的函数。但这并不总是可以避免的(例如,当无法向枚举添加方法的类必须向枚举添加自己的方法时)。

关于anti-patterns - 这个反模式(一个带模式的函数)有名字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35808597/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com