11 Stimmen

Sollte eine List<T> privat sein?

Ich brauche Ihre Meinung dazu, denn ich habe viel Verschiedenes zu diesem Thema gelesen. Wenn Sie eine List<T> oder jede Art von Liste innerhalb einer Klassendeklaration machen Sie sie privat und fügen dann mit bestimmten Methoden Elemente hinzu oder entfernen sie, oder Sie machen sie öffentlich?

Wir würden uns über Ihre Meinung und die Vor- und Nachteile der einzelnen Optionen sehr freuen.

Um ein Beispiel zu geben, nehmen wir an, wir haben eine class Employer mit privaten Feldern name y List<Employees> . Meine Frage ist, ob wir die Arbeitnehmerliste privat oder öffentlich machen sollten und welche Vorteile/Nachteile es in beiden Fällen gibt.

6voto

Rune FS Punkte 20934

Für Liste explizit ja sollte es privat sein, je nachdem, was die Funktionalität, die Sie aussetzen soll, Schnittstellen wie IEnuemerable, ICollection oder IList wäre eine bessere Wahl oder wenn Sie eine Sammlung aussetzen Siehe SLaks Antwort.

Im Allgemeinen ist es keine gute Idee, interne Strukturen und Zustände zu veröffentlichen, und da Ihr Objekt vom Typ List beides ist, sollten Sie es intern halten. Es könnte sinnvoll sein, dem Benutzer die Möglichkeit zu geben, darüber zu iterieren, Elemente hinzuzufügen oder zu entfernen, aber Sie sollten die Liste trotzdem intern halten und entweder Methoden zum Hinzufügen/Entfernen oder zumindest eine Schnittstelle bereitstellen, die es ermöglicht, den Typ der internen Darstellung zu ändern, ohne die öffentliche Schnittstelle zu beeinflussen.

Wenn Sie eine Schnittstelle verwenden, sollten Sie die engstmögliche Schnittstelle wählen.

Wenn der Client-Code also nur eine Aufzählung benötigt, verwenden Sie IEnumerable, wenn der Client-Code einen Index benötigt, verwenden Sie ICollection usw.

weiter, wenn Sie als IEnumerable exponieren, sollten Sie sicherstellen, dass das, was immer Sie zurückgeben, tatsächlich nur lesbar ist, indem Sie entweder eine schreibgeschützte Auflistungsklasse oder einen Iteratorblock verwenden

EDIT nach Aktualisierung In Bezug auf Ihr Beispiel. Fragen Sie sich, ob es sinnvoll ist, dass irgendjemand außer dem Arbeitgeber ändern kann, wer seine Angestellten sind? für mich steckt das schon in den Worten, die Sie gewählt haben. Der Arbeitgeber stellt den Arbeitnehmer ein und sollte die volle Kontrolle darüber haben, wer seine Mitarbeiter sind. In diesem speziellen Fall würde ich es also privat halten und Hire(IEmployee employee) und Fire(IEmployee employee) offenlegen, damit der Code die Absicht deutlich macht

4voto

SLaks Punkte 832502

Wenn Sie eine Sammlung für die Benutzer Ihrer Klasse zugänglich machen müssen, sollten Sie eine schreibgeschützte Eigenschaft mit einer System.Collections.ObjectModel.Collection<T> .

Sie können diese Klasse dann erben und folgende Funktionen überschreiben InsertItem , RemoveItem et SetItem um benutzerdefinierte Logik auszuführen, wenn der Benutzer die Sammlung manipuliert.

Wenn Sie nicht wollen, dass der Benutzer die Sammlung ändern kann, sollten Sie eine ReadOnlyCollection<T> .

In Ihrem speziellen Beispiel sollten Sie wahrscheinlich eine ReadOnlyCollection<Employee> mit separaten Mutatormethoden in Employer .

3voto

supercat Punkte 72939

Und wenn Sie nur wollen, dass jemand die Liste aufzählen kann, könnten Sie ein iEnumerable bereitstellen, dessen GetEnumerator-Funktion einfach die GetEnumerator-Funktion der Liste aufrufen würde.

1voto

Nilesh Gule Punkte 1405

Gemäß dem Refactoring-Katalog ist es immer besser, die Sammlungen zu kapseln. Dadurch wird verhindert, dass jemand die Daten versehentlich verändert, indem er Elemente aus der Liste hinzufügt oder entfernt. Wenn Sie die Funktionalität zum Schutz Ihrer Daten vor versehentlichen Änderungen nicht benötigen, können Sie eine normale Liste zurückgeben.

Durch die Offenlegung der Add- und Remove-Methoden haben Sie den Vorteil, dass alle Änderungen nur über diese Methoden erfolgen.

0voto

Joachim VR Punkte 2282

Das hängt von der gewünschten Funktionalität ab. Wenn Sie nur wollen, dass die Liste manipuliert werden kann, können Sie sie über eine schreibgeschützte Eigenschaft (ohne Setter) zugänglich machen. Wenn Sie möchten, dass zusätzlicher Code ausgeführt wird, wenn Benutzer die Liste bearbeiten, sollten Sie Ihre eigenen Methoden schreiben und die Liste nicht offenlegen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X