2009-06-25 3 views
1

Können sagen, wir haben diese Schnittstelle:C#: Sollte eine ILog-Schnittstelle ein IEnumerable <Message> sein oder haben?

public interface ILog 
{ 
    void Add(Message message); 
} 

Es sollte natürlich auch eine Möglichkeit haben, diese Nachrichten hinzugefügt zugreifen. Aber was denkst du ist natürlicher und richtig? Dass ILog IEnumerable-Eigenschaft implementiert? Oder vielleicht beides? Oder werden beide etwas komisch und unnötig sein? Oder sollte es ein IEnumerator anstelle von IEnumerable sein? (Oder das ist vielleicht völlig falsch? Habe noch nicht ganz begriffen den Unterschied zwischen jenen, ...)

public interface ILog : IEnumerable<Message> 
{ 
    void Add(Message message); 
} 

public interface ILog 
{ 
    IEnumerable<Message> Messages { get; } 
    void Add(Message message); 
} 

public interface ILog : IEnumerable<Message> 
{ 
    IEnumerable<Message> Messages { get; } 
    void Add(Message message); 
} 

Das ist natürlich wahrscheinlich ein wenig subjektiv, aber ich mag andere Meinung hören. Ich weiß es nicht wirklich, noch habe ich jemand anderes zu fragen: p

Antwort

3

Ich würde vorschlagen, dass ILog keinen Enumerator haben sollte - der Code, der die Protokollierung durchführt, muss nicht alle Nachrichten aufzählen.

Der Schlüssel ist, dass eine Klasse mehrere Schnittstellen implementieren kann - so können Sie (und sollten) jede Schnittstelle auf eine bestimmte Verwendung konzentriert halten.

So würde ich eine zweite Schnittstelle (sagen wir, ILogStore) erstellen, die einen Enumerator der Nachrichten implementiert:

public interface ILogStore 
{ 
    IEnumerable<LogMessage> GetMessages(); 
} 

ich dies eine Memberfunktion für eine mögliche zukünftige Überlastungen zu ermöglichen, machen würde.Angenommen, Sie möchten alle Protokollmeldungen von einem bestimmten Subsystem abrufen:

public interface ILogStore 
{ 
    IEnumerable<LogMessage> GetMessages(); 
    IEnumerable<LogMessage> GetMessagesBySubsystem(string subsystem); 
} 

und so weiter.

0

IMO, müssen Sie nur Ihre Schnittstelle von IEnumerable < Nachricht> erben, so dass Sie keine spezielle Eigenschaft, Nachrichten zu erhalten, benötigen, weil IEnumerable hat entsprechende Methode GetEnumerator. Dies ist elegant und natürlich für. NET-Framework.

+0

Klingt vernünftig. – Svish

2

Wenn Sie den .NET Framework-Weg gehen, sollten Sie eine Auflistungsklasse ("MessageCollection") definieren, die von Collection {T} erbt. Dies bietet die Funktionalität zum Hinzufügen oder Entfernen von Nachrichten und implementiert die Schnittstelle IEnumerable {T}.

Ihre Schnittstelle sollte eine schreibgeschützte Eigenschaft "Message" definieren, die eine Instanz Ihrer definierten Sammlungsklasse zurückgibt.

public interface ILog { 
    MessageCollection Messages {get;} 
    void AddMessage(Message message); // Additional method. 
} 

public class MessageCollection : Collection<Message>{ 
    // Addional methods. 
} 
+1

Hm, das klingt in diesem Fall ein wenig übertrieben, aber ein guter Gedanke, dass ich wahrscheinlich ein anderes Mal verwenden könnte. Die ICollection Schnittstelle enthält ein bisschen zu viel Zeug, das ich nicht wirklich brauche oder implementieren möchte. – Svish

+0

Implementieren Sie dann nur die Schnittstelle IEnumerable , und fügen Sie den void Add (Message) on type MessageCollection hinzu. Wenn Sie weitere Funktionen wünschen, können Sie sie zur Klasse hinzufügen. Aufgrund von "Framework Design Guidlines" ist eine Sammlung ein Typ, der IEnumerable implementiert und eine Liste von Elementen darstellt. In Ihrem Fall eine Liste von "Nachrichten" – Jehof

1

Gut fühlen: machen Sie es zu einem Mitglied.

Wenn die Schnittstelle nur AddMessage und messgae Enumeration enthält, können Sie erben. In diesem Fall ist jedoch die Rolle von ILog selbst fraglich.

Erstens ist die Nachrichtengenerierung praktisch immer vom Nachrichtenverbrauch getrennt. Also würde ich ILog in ILogTarget (enthält die AddMessage) und ILogMessages, Message-Enumeration aufteilen.

(Diese Trennung könnte künstlich und übertrieben für Ihre Anwendung sein, also nehmen Sie dies nur als allgemeine Anmerkung).

Selbst in diesem Fall würde ich IEnumerable Messages ein Mitglied von ILogMessages machen, einfach weil diese Schnittstelle wachsen könnte: Sie könnten eine IEnumerable Errors oder separate Filteroptionen hinzufügen.

Als ein kleines Problem Bequemlichkeit, ein Mitglied ist auch leichter durch Intellisense entdeckt.

+0

Sehr gute Punkte. Es könnte im Moment ein bisschen übertrieben sein, es zu teilen, aber ja. Alle guten Punkte. – Svish

Verwandte Themen