2016-04-14 4 views
5

Ich habe eine Klasse, die eine Möglichkeit zum Abrufen eines zufälligen Integer-Werts mit einem Maximum erfordert. Ich möchte nicht, dass diese Klasse auf eine bestimmte Art und Weise angewiesen wird, um diesen zufälligen Wert (wie system.random) abzurufen. Wäre es am besten zu:C# Best Practice: Verwenden eines Delegaten oder einer Schnittstelle als Klassenabhängigkeit

(A) Verwenden Sie ein öffentlich Delegierten (oder func)

public delegate int NextRandomInt(int maxValue); 

public class MyClass 
{ 
    public NextRandomInt NextRandomInt { get; set; } 

    public MyClass(NextRandomInt nextRandomInt) 
    { 
     NextRandomInt = nextRandomInt; 
    } 
} 

(B) Verwenden Sie einen öffentlichen Schnittstelle

public interface IRandomIntProvider 
{ 
    int NextInt(int maxValue); 
} 

public class MyClass 
{ 
    public IRandomIntProvider RandomIntProvider { get; set; } 

    public MyClass(IRandomIntProvider randomIntProvider) 
    { 
     RandomIntProvider = randomIntProvider; 
    } 
} 

(C) Etwas sonst alles zusammen.

Beide Möglichkeiten funktionieren. Ich denke, die Verwendung eines Delegaten wäre einfacher und schneller zu implementieren, aber die Schnittstelle ist besser lesbar und möglicherweise einfacher, wenn die Abhängigkeitsinjektion kommt.

+0

Suchen nach [Strategie] (http://www.dofactory.com/net/strategie-design-pattern) GOF Entwurfsmuster. Es kann dir helfen. – Fabjan

Antwort

0

Zu meiner Sicht (ich bin mir sicher) die zweite Option mit Schnittstelle ist die beste. Diese Situation ist ein typisches Beispiel für das Muster Strategy.

+0

Warum ist eine Schnittstelle Ihrer Meinung nach am besten? Und wie hängen diese beiden Aussagen zusammen? Strategie kann mit allen Arten von Abstraktionen, einschließlich Delegaten, implementiert werden, also sehe ich nicht, wie Strategie die Verwendung einer Schnittstelle impliziert. –

+0

@ Mr.Putty Ich schrieb, dass es mein Standpunkt ist :) Ich bevorzuge Schnittstellen in solchen Beispielen, weil für die Verwendung von Delegaten sollten Sie eine Methode in einer Klasse erstellen (und ich sehe nicht, wie diese Klasse benannt werden sollte - 'RandomDelegates '?). Und es wird einfach schöner sein, ein kleines Interface mit bestimmten Klassen zu erstellen. Ich hoffe, ich könnte meine Idee erklären. – user2216

1

Es hängt davon ab, wie viel Arbeit Sie mit einem Delegaten oder einer Schnittstelle implementieren möchten.

Wenn Ihre Schnittstelle nur eine oder sogar zwei Methoden verwenden soll, können Sie Func verwenden, um das gleiche Verhalten zu erzwingen. Ansonsten würde ich interface s verwenden.

Mark Seemann erklärt gerade ziemlich das schön hier: link

Um es zusammenzufassen er sagt dies:

Wann immer möglich, ich ziehe meine APIs mit Delegierten statt one-Methode Schnittstellen zu modellieren, da Das gibt mir mehr Flexibilität und weniger Infrastrukturcode.

Offensichtlich funktioniert diese Technik nur so lange, wie Sie nur eine einzelne Methode abstrahieren müssen. Sobald Ihre Abstraktion eine zweite Methode benötigt, müssen Sie eine geeignete Schnittstelle oder vorzugsweise eine abstrakte Basisklasse einführen.

0
  1. Use-Schnittstelle, wenn Sie denken, dass es eine andere Implementierung von NextRandomInt() sein können in dem System vorhanden sein können.
  2. Wählen Sie Delegat, wenn Sie denken, dass es als Ursache für ein Ereignis oder einen Rückruf ausgeführt werden soll.
    Ansonsten einfach mit einer Methode als Klassenmitglied gehen. Es liegt an Ihnen, ob die Methode als instance Methode oder static verfügbar sein soll.
Verwandte Themen