2

Скажем, у меня есть функция под названием send_welcome_email() и класс под названием User (реализованный в 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 класса.

Я знаю, что это известный анти-шаблон, но я не могу его найти. Кто-нибудь знает, как это называется?

+1

Я разместил это в комментарии ниже, но думаю, что он заслуживает последующего обсуждения. Скажем, в send_welcome_email() он требует еще 3-4 свойств из класса User и говорит, что пользователь имеет 10 свойств.В какой момент можно пройти весь объект? – Glide

ответ

2

Я не думаю, что есть имя для анти-шаблона, но правило, что это является нарушением, называется Law of Demeter.

LoD можно рассматривать как принцип принятия «наименее структурных знаний» (что-то его создатель называет «структурно-застенчивым программированием»). Идея состоит в том, чтобы предположить знание внутренней структуры объекта, кроме вашего собственного непосредственного Я.

Как я слышал, он описал: в магазине, если вы платите кассир вы получите вашу кредитную карту с вашего кошелька и дать им, а не сдать бумажник и позволить им рыться через него. Ваш пример показывает подход к рывке; функция получает объект User, и она должна знать, как получить доступ к свойству электронной почты, о котором ему не нужно знать.

+0

Скажем, в 'send_welcome_email()' ему требуется еще 3-4 свойства из класса 'User' и говорят, что' User' имеет 10 свойств. В какой момент можно пройти весь объект? – Glide

+0

@ nathan-hughes - Я думаю, что Закон Деметры довольно близок. Мне тоже нравится аналогия! – aco

+0

@Glide - Хороший вопрос. Возможно, это лучше описано как запах кода, чем анти-шаблон. – aco

0

Звучит как Anemic Domain Model.

+0

Я не думаю, что это то, о чем говорит @aco. Это аномальная модель домена, но я думаю, дело в том, что 'send_welcome_email' нуждается только в электронной почте, но в первом случае весь пользователь был передан. –

+0

Да, @AidanKane верен. – aco

+0

Спасибо за разъяснение :-) – Oliver

0

Разве не цель send_welcome_email генерировать электронное письмо с целью приветствовать пользователя (мне нужна информация о пользователе, например, имя, имя пользователя, адрес электронной почты)?

Ваша альтернатива не делает этого.

Метод, вероятно, не должен быть в пользовательском классе, но что-то вроде UserEmailSender или аналогичного.

Таким образом, мой ответ отрицательный: он не похож на анти-шаблон.

+0

Нет, 'send_welcome_email()' нужен только адрес электронной почты. Вызывающему не нужно создавать объект «Пользователь» для его вызова - это необязательно связывает эту функцию с классом «Пользователь». – aco

+1

Приветственные письма обычно включают имя '' Привет {FirstName} {LastName} "' и имя пользователя: '" Для входа в систему используйте свое имя пользователя: {Username} "'. поэтому требуется информация пользователя. Но так как я не знаю, как выглядит ваша фактическая реализация, трудно сказать в вашем конкретном случае. – jgauffin

+0

Я должен уточнить, что 'send_welcome_email()' не является методом 'User', это полностью отдельная функция. Эта функция использует только адрес электронной почты. Он создает экземпляр объекта «EmailMessage», но передаёт ему только адрес электронной почты, а не имя и фамилию. – aco

1

Функция имеет the Feature Envy code smell. («Запахи кода» - это антипаттерны, задокументированные в главе Фаулера и Бек в the Refactoring book, названных до того, как слово «антипаттерн» было широко использовано.) Особенность Зависть - это когда один модуль связан с другим модулем, вызывая слишком много других модульных методов. В этом случае слишком много.

Обычное исправление заключается в извлечении метода на другой модуль, но это не применяется здесь, так как есть только один вызов вонючего метода. Исправление запроса вызывающего абонента функции для вызова метода работает до тех пор, пока это нормально, когда вызывающий абонент имеет эту связь с классом User.

Это напоминает один из Law of Demeter, руководство, которое уменьшает сцепление, но наиболее точно относится к вызывающему абоненту, вызывающему метод по результату вызова другого метода, чего здесь не происходит.

 Смежные вопросы

  • Нет связанных вопросов^_^