2016-03-20 7 views
1

Was ist die bevorzugte Methode der beiden unten, wenn es um Objektkonvertierung geht?Entwurfsmuster und Konventionen für die Objektkonvertierung

Objekt Umwandlung eine ASX() -Methode

public class Foo { 
    int foo; 
    public Bar asBar() { 
    return new Bar(foo); 
    } 
} 

class Bar { 
    int bar; 
    public Bar(int bar) { 
    this.bar = bar; 
    } 
} 

Objekt Konvertierung mit einem Konstruktor

public class Foo { 
    int foo; 
} 

class Bar { 
    int bar; 
    public Bar(int bar) { 
    this.bar = bar; 
    } 

    public Bar(Foo foo) { 
    this.bar = foo.foo; 
    } 

} 

Ich bin nicht sicher, ob der Verdienste der beiden Verfahren (in Bezug auf Wartbarkeit, Skalierbarkeit et Verwendung .c), verglichen mit den anderen. Was ist der etablierte Standard?

Ich akzeptierte, dass die Frage ziemlich breit ist, wie von Paul Boddington in den Kommentaren darauf hingewiesen, aber hoffe auf einige nützliche Diskussion, bevor diese Frage abgeschlossen ist.

+0

Sie sollten die Verantwortung für die Konvertierung in ein anderes Objekt legen. Was, wenn Sie "Foo" auch in einen anderen Typ als "Bar" umwandeln möchten? Sie haben am Ende eine Reihe von Konvertierungsmethoden in Ihrer Klasse. Nicht nur das, es wird das O/C-Prinzip verletzen, wenn Sie später entscheiden, andere Konvertierungsmethoden hinzuzufügen. –

+0

Zusätzlich zu den drei bisher vorgeschlagenen Ansätzen können Sie auch eine 'statische' Methode für die Konvertierung verwenden. Ich denke, diese Frage ist wirklich breit und es gibt keine richtige Antwort. –

+0

@VinceEmigh Würde den Namespace nicht durcheinander bringen, indem eine Klasse eingeführt wird, die nur für die Konvertierung zwischen Objekten verwendet wird. Es macht für mich Sinn, solche Konvertierungsmethoden in eine der Klassen zu setzen, in die konvertiert wird. – SamTebbs33

Antwort

1

Was ich gesehen habe viel verwendet und ich persönlich mag ist der Stil von vielen der JDK selbst verwendet, die eine statische Factory-Methode in der Zielklasse beinhaltet. Das ultimative Ziel ist es, den Code leicht lesbar zu machen.

Zum Beispiel:

Integer.fromString("42") 

Kredite aus dem Beispiel im OP:

public class Foo { 
    int foo; 
} 

class Bar { 
    int bar; 

    public static Bar fromFoo(Foo foo) { 
    return new Bar(foo.foo); 
    } 

    public Bar(int bar) { 
    this.bar = bar; 
    } 

} 

Auf diese Weise kann jemand ein Bar von einem Foo erstellen und der Code liest auch wenn dies zu tun:

Bar bar = Bar.fromFoo(foo); 

Es liest sich fast wie Englisch, ohne zu sein COBOL!

Verwandte Themen