2010-04-14 12 views
19

Ich habe das oft im Code gesehen, aber wenn ich davon spreche, kenne ich den Namen für ein solches 'Muster' nicht.Ist das ein bekanntes Designmuster? Was ist sein Name?

Ich habe eine Methode mit 2 Argumenten, die eine überladene Methode aufruft, die 3 Argumente hat und absichtlich setzt die dritte auf eine leere Zeichenfolge.

Der Grund, warum ich das tue, ist, Code nicht zu kopieren, und vorhandenen Anrufern zu erlauben, noch die Methode aufzurufen, die nur 2 Parameter hat.

Ist das ein Muster, und hat es einen Namen?

+4

meinst du nicht DoWork (name, phoneNumber, string.Empty)? – Andrey

+0

ja Andrey, ich habe es jetzt bearbeitet, danke, dass du darauf hingewiesen hast, und entschuldige mich für jede mögliche Verwirrung – GenEric35

+0

Danke an alle für die schnellen Antworten, ich werde warten, wenn jemand einen Namen dafür hat, da ich das ziemlich gesehen habe oft und möchte einen Namen geben. Ich werde eine Antwort vor dem Ende des Tages annehmen, danke. – GenEric35

Antwort

34

Es ist eigentlich mehr als nur Methode Überlastung (wo in der Regel die gleiche Methode Namen Typen unterschiedliches Argument haben), dieses spezifische Muster - wo Überlastungen im Grunde das gleiche Verfahren sind, und die kürzere ruft die man länger mit Standardwert, um optionale Parameter zu emulieren - wird das teleskopische/teleskopische Muster genannt, das normalerweise auf Erbauern gesehen wird, aber selbstverständlich auf irgendeine Methode verallgemeinerbar ist.


Für eine autoritative Zitat, hier ist ein Auszug aus Effective Java 2nd Edition, Punkt 2: Werft Muster Betrachten Sie, wenn sie mit vielen Konstruktorparameter (excerpt online)

Kultur konfrontiert, Programmierer haben das telescoping Konstruktor Muster verwendet, in dem Sie einen Konstruktor mit nur den erforderlichen Parametern, ein anderes mit einem einzelnen optionalen Parameter, ein Drittel mit zwei optionalen Parametern und so bereitstellen auf ...

Wieder wird normalerweise das teleskopische Muster im Zusammenhang mit Konstruktoren diskutiert (wo z.B. ein 2-Arg-Konstruktor hätte eine Zeile this(arg1, arg2, ARG3_DEFAULT);, um den 3-arg-Konstruktor usw. aufzurufen), aber ich sehe nicht, warum er nicht auch auf andere Methoden verallgemeinert werden kann.


andere maßgebende Zitat leider ohne Definition des Musters: Sun Developer Network: How to Write Doc Comments for the Javadoc Tool:

Hinweis Die Methoden und Konstrukteuren in „teleskopier“ Ordnung sind, die den „kein Arg“ Form eine erste Einrichtung, dann die "1 arg" -Form, dann die "2 arg" -Form und so weiter.


Und noch ein zufälliges Zitat, mit einer expliziten Definition des Musters: I Am Hate Method Overloading (And So Can You!):

Teles Methoden

Sie eine Funktion haben können, die eine bestimmte Anzahl von Argumenten entgegennimmt . Die letzten paar Argumente sind vielleicht nicht so wichtig, und die meisten Benutzer wären genervt, wenn sie herausfinden müssten, was in sie übergeht. Sie erstellen also ein paar weitere Methoden mit dem gleichen Namen und weniger Argumenten, die zur "Master" -Methode führen.

Dieses letzte Zitat schlägt direkt vor, dass Sprachunterstützung für Standardargumente eine viel bessere Alternative ist.

+0

große Antwort, danke – GenEric35

+1

@polygeneubricants: Ich freue mich wirklich über Ihr Feedback, danke! Mein Punkt ist, während ich zu 100% mit Ihnen in der allgemeinen Idee einverstanden bin, bin ich für diesen speziellen Fall nicht sehr überzeugt. Die Tatsache, dass wir seit 40 Jahren OOP und Designmuster für 30 Jahre haben und für solch eine gemeinsame Situation kaum 3 Referenzen in der Welt gefunden haben, die ein "Designmuster" (oder zumindest Verallgemeinerung der Idee) nennen, machen dich nicht denke, dass es kein akzeptiertes Designmuster gibt und wahrscheinlich, weil es nicht notwendig ist? Glaubst du, dass es mit den zur Verfügung gestellten Daten ausreicht, zu sagen: Das ist das "Telescopic Pattern"? –

+1

@Claudio: _maybe_ der Name hat noch nicht weit verbreitet, aber es ist in _Effective Java_ verwendet, die ich glaube, ist ein weit gelesenes Buch. In jedem Fall fangen wir an, den Namen zu verwenden, anstatt ihn überhaupt zu benennen. Wir verwenden das Muster (gut oder schlecht), also können wir es, anstatt es namenlos zu lassen, auch als etwas bezeichnen. Und was weißt du schon, manche Leute schon. – polygenelubricants

20

Der Name davon ist eine Überlastung und es ist kein Design-Muster, sondern ein OOP Feature

http://en.wikipedia.org/wiki/Method_overloading

+0

Ok, ich hätte die zweite Methode privat setzen sollen, das ist der Fall, in dem die überladene Methode für den Aufrufer verborgen ist, und die überladenen Methoden vom Parent aufgerufen werden. Ich werde meinen Code anpassen, danke, gibt es einen Namen für diese Funktion oder Verwendung der überladenen Methode? – GenEric35

+1

IMO, Überladung könnte als ein Entwurfsmuster betrachtet werden, das von OOP und anderen Sprachen unterstützt wird. – kenny

+0

Zu sagen, dass dies "nur Methode Überladung" ist, ist wie sagen, z. das Besuchermuster ist "nur dynamischer Versand". Es beschreibt perfekt die OOP-Mechanik, aber es vermisst es, die ganze Vorstellung davon, was ein Designmuster ist, anzusprechen. – polygenelubricants

3

Ich vermute, entweder Ihre DoWork Methoden sollten CreateContact oder Ihren Anruf CreateContact aufgerufen werden soll DoWork sein. ..

Aber das ist nicht wirklich ein Muster. Es ist nur eine häufige Verwendung von method overloading.

+0

Ja, ich hätte es Kontakt erstellen können, wollte aber keine Konstruktoren einbeziehen, da dies in meinem realen Beispiel statische Methoden sind, also habe ich es einfach DoWork genannt. Ich verstehe, dass es Überladen der Methode genannt wird, vielleicht sollte ich das in die Frage stellen, um es klar zu machen, ich weiß, dass diese überladene Versionen der gleichen Methode sind. Es ist der Fall, wo der Anrufer die überladene Methode nicht direkt aufrufen kann, ich hätte die zweite private gemacht, die ich jetzt bearbeiten werde. Gibt es einen Namen für diese Verwendung der überladenen Methode, wo sie sich gegenseitig anrufen und nur einer von ihnen öffentlich ist? – GenEric35

+0

Soweit mir bekannt ist, ist das immer noch nur ein Überladen und nicht eines der akzeptierten Muster. –

7

Nein, dies ist kein Entwurfsmuster in der Gruppe der vier Sinne, aber es ist in vielen Sprachen üblich, die Standardparameter nicht zulassen.

In einer Sprache wie Ruby Sie etwas ähnliches tun könnten wie folgt

def dowork(name, phoneNumber, emailAddress = '') 
    # code here 
    end 
4

Ich würde sagen, dass dies # < 4 Arbeit um aus Mangel an Standardargumenten ziemlich eine c ist. Wenn Sie der Denkrichtung "Muster sind fehlende Sprachmerkmale" verschreiben, könnte man sagen, dass es ein Muster ist, obwohl es nicht allgemein bekannt ist.

bearbeiten: ok Ihr Update hat mich wirklich geworfen, ich sehe nicht, was Sie mit einer öffentlichen Methode zu tun versuchen, eine private Methode aufrufen. soweit es die öffentliche api betrifft, könnten sie einfach alle privaten methoden in die öffentliche methode verschieben und eine lokale variable für den "defaulted" -Wert haben. Oder werden beide Methoden auch von anderen Stellen in der Klasse aufgerufen?

3

Es wird als Funktion Overloading.In Funktion Überladung Name einer Funktionen sind gleich, aber sie unterscheiden sich in beiden Arten von Parameter oder Anzahl der Parameter. Es wird auch als falscher Polymorphismus bezeichnet. Es ist kein Muster, es ist ein grundlegendes OOP-Konzept.

5

Es ist ein Beispiel für eine Hilfsmethode. Sheesh Leute, nicht in der Gang of Four Buch zu sein, hört nicht auf, es ein Muster zu sein. In dem speziellen Fall, in dem der Helfer öffentlich ist und die unterstützte Methode privat ist, ist dies ein Beispiel für die Kapselung. Möglicherweise etwas zu viel Verkapselung in diesem Fall.

+0

das half auch, danke: D – GenEric35

2

Ich stimme @polygeneubulicants zu, möchte aber darauf hinweisen, dass das Teleskopmuster neben der Überladung verwendet werden kann. Ein Beispiel ist in Objective-C, wo Methoden-Selektoren (Signaturen) eindeutig sein müssen und nicht überladen werden können.

- (id)init { 
    return [self initWithParam:0]; 
} 

- (id)initWithParam:(int)param { 
    // Do real initialization here! 
    return self; 
} 
Verwandte Themen