2

Sagen wir, ich habe eine Funktion send_welcome_email() und eine Klasse namens User genannt (implementiert in Python, aber hoffentlich einfach für Nicht-Python-Entwickler zu verstehen):Wie heißt dieses Anti-Muster?

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


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

In diesem Fall wäre es das gewesen, besser zu definieren haben Funktionsschnittstelle als:

def send_welcome_email(email) 

so dass die Funktion mit der User Klasse nicht gekoppelt.

Ich weiß, das ist ein bekanntes Anti-Pattern, aber ich kann es nicht finden. Wer weiß, wie es heißt?

+1

Ich postete dies in einem Kommentar, aber ich denke, es gibt eine Follow-up-Diskussion. Nehmen wir an, in der Nachricht send_welcome_email() sind 3-4 weitere Eigenschaften aus der Benutzerklasse erforderlich und es wird angegeben, dass der Benutzer über 10 Eigenschaften verfügt.An welchem ​​Punkt ist es in Ordnung, das ganze Objekt zu übergeben? – Glide

Antwort

2

Ich glaube nicht, dass es einen Namen für das Anti-Muster gibt, aber die Regel, die dies verletzt, wird Law of Demeter genannt.

LoD kann als das Prinzip angesehen werden, "geringstes strukturelles Wissen" anzunehmen (etwas, das sein Schöpfer "strukturscheue Programmierung" nennt). Die Idee besteht darin, Kenntnis von der inneren Struktur eines Objekts anzunehmen, die sich von Ihrem eigenen unmittelbaren Selbst unterscheidet.

So wie ich gehört habe es beschrieben: in einem Geschäft, wenn Sie einen Kassierer Sie Ihre Kreditkarte aus der Brieftasche bekommen bezahlen und es ihnen geben, anstatt die Brieftasche übergeben und lassen Sie sie durch sie kramen. Ihr Beispiel zeigt den Suchansatz. Die Funktion ruft das Benutzerobjekt ab und sie muss wissen, wie sie auf die E-Mail-Eigenschaft zugreifen kann, über die sie nicht informiert werden sollte.

+0

Nehmen wir an, in 'the send_welcome_email()' benötigt es 3-4 weitere Eigenschaften aus der 'User' Klasse und sagt,' User' hat 10 Eigenschaften. An welchem ​​Punkt ist es in Ordnung, das ganze Objekt zu übergeben? – Glide

+0

@ nathan-hughes - Ich denke, Gesetz von Demeter kommt ziemlich nah. Ich liebe auch die Analogie! – aco

+0

@Glide - Gute Frage. Vielleicht ist es besser als Code-Geruch als ein Anti-Muster beschrieben. – aco

0

Es klingt wie die Anemic Domain Model.

+0

Ich glaube nicht, dass @aco sich darauf bezieht. Es ist ein anämisches Domain-Modell, aber ich denke, der Punkt war, dass "send_welcome_email" nur die E-Mail benötigt, aber im ersten Fall wurde der ganze Benutzer reingelassen. –

+0

Ja, @AidanKane ist korrekt. – aco

+0

Danke für die Klarstellung :-) – Oliver

0

Ist nicht der ganze Zweck von send_welcome_email eine E-Mail für den speziellen Zweck der Begrüßung des Benutzers zu generieren (ich brauche Informationen über den Benutzer wie Name, Benutzername, E-Mail-Adresse)?

Ihre Alternative tun Sie das nicht.

Die Methode sollte wahrscheinlich nicht in der Benutzerklasse aber etwas wie UserEmailSender oder ähnlich sein.

Meine Antwort ist daher nein: Es sieht nicht wie ein Anti-Muster aus.

+0

Nein, die 'send_welcome_email()' benötigt nur eine Email Adresse. Der Aufrufer sollte kein "Benutzer" -Objekt konstruieren müssen, um es aufzurufen - das würde diese Funktion unnötigerweise mit der Klasse "Benutzer" verbinden. – aco

+1

Begrüßungs-E-Mails enthalten normalerweise den Namen "Hallo {Vorname} {Nachname}", und einen Benutzernamen: '" Um sich einzuloggen, benutze deinen Benutzernamen: {Benutzername} "'. Daher sind Benutzerinformationen erforderlich. Aber da ich nicht weiß, wie Ihre tatsächliche Implementierung aussieht, ist es in Ihrem speziellen Fall schwer zu sagen. – jgauffin

+0

Ich sollte klarstellen, dass 'send_welcome_email()' keine Methode von 'User' ist, es ist eine völlig separate Funktion. Diese Funktion verwendet nur die E-Mail-Adresse. Es instanziiert ein 'EmailMessage'-Objekt, übergibt ihm aber nur die E-Mail-Adresse, nicht den Vor- und Nachnamen. – aco

1

Die Funktion hat einen Hauch von the Feature Envy code smell. ("Code smells" sind Antipattern, dokumentiert in einem Kapitel von Fowler und Beck in , genannt, bevor das Wort "antipattern" weit verbreitet war.) Feature Envy ist, wenn ein Modul an ein anderes Modul gekoppelt ist, indem zu viele andere aufgerufen werden Methoden des Moduls. In diesem Fall ist einer zu viel.

Die übliche Lösung ist, eine Methode auf das andere Modul zu extrahieren, aber das trifft hier nicht zu, da es nur einen stinkigen Methodenaufruf gibt. Die Fehlerbehebung, den Aufrufer der Funktion anzurufen, die Methode stattdessen aufzurufen, funktioniert, solange es für den Aufrufer OK ist, diese Kopplung mit der Klasse User zu haben.

Dies erinnert an die Law of Demeter, eine Richtlinie, die Kopplung reduziert, aber das gilt am spezifischsten für einen Aufrufer Aufruf einer Methode auf das Ergebnis der Aufruf einer anderen Methode, die hier nicht passiert.