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

标签 anti-patterns

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

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/

相关文章:

llvm - 生成深度调用堆栈的代码是否可以被视为反模式?

java - 请问java RMI的意义?

PHP 字符串常量过度使用?

c++ - 如何让人们相信一个有 11975 行代码的类是不好的? (不是吗?)

oop - 添加这个层次类是反模式吗

java - OutOfMemoryError java堆空间

java - 如何查看 "anti if"运动及其目标?

javascript - 修改JavaScript内置原型(prototype)是不是反模式?

java - 包含空变量的 Java 对象是一种反模式吗?如果是哪一个?

oop - 什么是界面膨胀?