这个反模式叫什么?

What is this anti-pattern called?

假设我有一个名为 send_welcome_email() 的函数和一个名为 User 的 class(在 Python 中实现,但希望对于非 Python 开发者):

class User:
    email = TextField()
    first_name = TextField()
    last_name = TextField()


def send_welcome_email(user):
    msg = EmailMessage(recipient=user.email)
    msg.send()

这种情况下函数接口定义为:

def send_welcome_email(email)

这样的函数是不耦合的 User class.

我知道这是一个已知的反模式,但我找不到它。有人知道它叫什么吗?

听起来像Anemic Domain Model

send_welcome_email 的全部目的不就是为了欢迎用户的特定目的生成一封电子邮件吗(即需要有关用户的信息,例如姓名、用户名、电子邮件地址)?

你的选择不这样做。

该方法可能不应该在用户 class 中,而是像 UserEmailSender 或类似的东西。

因此我的回答是否定的:它看起来不像反模式。

我认为反模式没有名称,但违反的规则称为 Law of Demeter

LoD can be regarded as the principle of assuming "least structural knowledge" (something its creator calls "Structure-shy programming"). The idea is to assume knowledge of no object's internal structure other than your own immediate self.

我听到的描述方式是:在商店里,如果您向收银员付款,您会从钱包中取出信用卡并交给他们,而不是交出钱包让他们翻找。您的示例显示了翻箱倒柜的方法;该函数获取 User 对象,它必须知道如何访问电子邮件 属性,这是它不应该知道的。

该函数有点像 the Feature Envy code smell. ("Code smells" are antipatterns, documented in a chapter by Fowler and Beck in the Refactoring book,在 "antipattern" 这个词被广泛使用之前命名。)特征羡慕是指一个模块通过调用太多其他模块而与另一个模块耦合模块的方法。在这种情况下,一个太多了。

通常的解决方法是将一个方法提取到另一个模块上,但这在此处不适用,因为只有一个难闻的方法调用。只要调用者可以耦合到 User class.

,要求函数的调用者调用该方法的修复就可以工作

这确实提醒了 Law of Demeter 中的一个准则,它是一种减少耦合的准则,但它最具体地适用于根据调用另一个方法的结果调用方法的调用者,这在此处没有发生。