2017-03-11 2 views
1

Zum Beispiel:Hat Klasse mit statischen Methoden, die alle dieselbe Eigenschaft haben, die als schlecht angesehen wird?

class A 
    { 
    ... 
    //class variables and methods 

    public static A GetAWithKey (DatabaseConnection conn, string key) {...} 
    public static A[] GetSomeAWithKeys (DatabaseConnection conn, string keys[]) {...} 
    public static bool IsAWithThisPropertyExists (DatabaseConnection conn, string thisProperty) {...} 
    } 

Problem ist - ruft in Code alle von ihnen gleiche Instanz Database arbeiten, die ich an alle Methoden übergeben.

Es scheint schlau DatabaseConnection als statische Variable der Klasse A zu machen, aber dann, wie initialisiere ich es richtig? Oder gibt es eine andere gute Lösung?

+1

Verwenden Sie 'Singleton Muster' – Xaqron

+0

@Xaqron Ich verstehe nicht, wie, können Sie mit Codebeispiel klären? –

+1

überprüfen Sie diesen Link: http://csharpindepth.com/Articles/General/Singleton.aspx – Xaqron

Antwort

0

Ok, nachdem ich darüber nachgedacht habe, entschied ich, dass die beste Lösung denselben Wert von externer Quelle bekommen wird, wie @Xaqron erwähnt - Singleton Instanz. Das erfordert eine neue Referenz mit Singleton zu A Scope, aber immer noch scheint es, es ist die beste. Beispiel

class A 
{ 
... 
//class variables and methods 

public static A GetAWithKey (string key) 
{ 
    DatabaseConnection conn = DataBase.GetConnection(); 
    ... 
} 
} 
+0

stimme ich nicht zu. Die Antwort von Ghostcat wird Ihren Code flexibler machen. Was passiert zum Beispiel, wenn Sie eine Verbindung zu einer anderen Datenbank herstellen möchten? Was ist mit Komponententests? –

+0

@BrianMcCutchon bitte beziehen sich auf meinen Kommentar zu seiner Antwort, es macht es klarer, was ich versuche zu erreichen. –

1

Mit statischen ist eine Anomalie in gut OO sowieso. Also "allein mit statischen" ist oft schlecht (es sei denn, Sie verstehen wirklich, was/warum Sie es verwenden).

Und die Tatsache, dass alle Ihre Methoden nehmen, dass DBConnection conn Parameter ziemlich deutlich zeigt an, dass Sie stattdessen ändern möchten, dass connParameter ein gewöhnlicher Feld dieser Klasse (wo man Dependency Injection verwenden würde, um sicherzustellen, Sie können alle Ihre Methoden vernünftig testen.

+0

Kommentieren Sie [diese Frage] (http://stackoverflow.com/questions/42747978/error-in-java-how-to-remove-it) - überprüfen Sie die URL im Browser im Screenshot. Das ist ungefähr so ​​viel "Denken" wie dort weiterging;) –

+0

Vielleicht, vielleicht nicht. Ich werde Ihrer Einschätzung zustimmen, wenn meine Antwort in den nächsten Stunden 10 Downvotes und die Löschanfragen verursacht :-) – GhostCat

+0

@GhostCat Ich bin auch der Meinung, dass die Verwendung von Static schlecht ist, aber ich weiß nicht, wie Sie solche Operationen wie 'Find() implementieren würden. 'oder' Exists() 'in Action Record Pattern. Es scheint nur so natürlich zu sein, 'User userToDelete = User.FindByKey (key);' aufzurufen. Die einzige Lösung, die ich habe, ist, ein anderes Objekt zu erstellen, das mit DTO-Objekten arbeitet. _BUT_, wenn wir solche Objekte auf jedem DTO-Objekt erstellen würden, hätten wir einen einfachen Zoo von Objekten. Wir könnten ihnen durch ähnliche Methoden in der Schnittstelle wie FindById() beigetreten sein, aber was, wenn wir das nicht tun können, da jedes DTO-Objekt viele verschiedene Eigenschaften hat, mit denen wir alle arbeiten? –

Verwandte Themen