Eigenschaften des Sammlertyps

8

Wenn die Eigenschaft einen Sammlungstyp wie

hat %Vor%

IMHO, ist es besser, leere Sammlung anstelle von Null-Wert zurückzugeben.
Es gibt viele Möglichkeiten, diese Funktionalität zu implementieren.

%Vor%

Auf diese Weise können Sie die Anzahl der Klassenfelder verringern, aber Sie müssen in jedem Konstruktor Code einfügen.

%Vor%

Dies ist ein Standardweg. Aber wenn jemand etwas in seinen Code schreibt, kann er das private Feld anstelle der Eigenschaft verwenden und Sie können einige Bugs bekommen, wenn Sie eine Aktion umgestalten.

%Vor%

Und das ist die Variante des vorherigen Weges mit Lazy Loading.

Was möchten Sie als Standardwert für die Sammlung zurückgeben? Wenn dies eine leere Sammlung ist, wie implementieren Sie es?

    
Steck 19.02.2010, 09:53
quelle

5 Antworten

2
___ qstnhdr ___ Eigenschaften des Sammlertyps ___ answer2295458 ___

Ich verwende normalerweise die Variante, in der Sie die Liste im Konstruktor initialisieren. Dies kann den Konstruktor "aufgeblähter" machen, aber die Verantwortung des Konstruktors ist Konstruieren des Objekts. Das Einrichten von guten Standardwerten ist IMHO vollständig innerhalb seiner Verantwortlichkeiten. Außerdem müssen Sie sich als Bonus keine Sorgen um private Felder machen, die den Code sauberer erscheinen lassen.

Sicher, Refactoring macht ein wenig schwieriger, aber nicht signifikant. Vergessen Sie nicht, dass Sie Ihre Konstruktoren verketten können (meistens sowieso). Selbst wenn Sie mehrere Konstruktoren haben, sollten Sie nur einmal den Initialisierungscode schreiben müssen.

Vergessen Sie nicht zu dokumentieren, dass der Standardwert eine leere Sammlung ist. Und das Sammelfeld schreibgeschützt zu setzen, ist eine gute Übung, es sei denn, Sie haben einen guten Grund, es später zurückzusetzen.

    
___ qstntxt ___

Wenn die Eigenschaft einen Sammlungstyp wie

hat %Vor%

IMHO, ist es besser, leere Sammlung anstelle von Null-Wert zurückzugeben.
Es gibt viele Möglichkeiten, diese Funktionalität zu implementieren.

%Vor%

Auf diese Weise können Sie die Anzahl der Klassenfelder verringern, aber Sie müssen in jedem Konstruktor Code einfügen.

%Vor%

Dies ist ein Standardweg. Aber wenn jemand etwas in seinen Code schreibt, kann er das private Feld anstelle der Eigenschaft verwenden und Sie können einige Bugs bekommen, wenn Sie eine Aktion umgestalten.

%Vor%

Und das ist die Variante des vorherigen Weges mit Lazy Loading.

Was möchten Sie als Standardwert für die Sammlung zurückgeben? Wenn dies eine leere Sammlung ist, wie implementieren Sie es?

    
___ antwort2295383 ___

% readonly ist in der Tat nicht ideal. Für Alternativen; es hängt von der Verwendung ab. IMO, diese Version (vom Hauptpost kopiert) ist die einfachste, tut aber alles, was wir brauchen:

%Vor%

und als ein Vorteil, es wird mit %code% arbeiten, wo-wie alles mit einem %code% wird nicht funktionieren (ein Fehler; es sieht den Setter, aber nicht bemerkt es kann es nicht benutzen).

Der faule Ansatz ist normalerweise IMO-Overkill, wie in den meisten interessanten Fällen werden Sie die Listen trotzdem füllen.

    
___ antwort2295379 ___

Aus den .NET Design-Richtlinien :

  

Geben Sie sinnvolle Standardwerte für alle Eigenschaften an und stellen Sie sicher, dass die Standardwerte nicht zu einer Sicherheitslücke oder einem extrem ineffizienten Design führen.

Wenn Sie dieses Prinzip erweitern und es mit dem Prinzip der geringsten Überraschung kombinieren, sollten Sie deutlich machen, dass Sie sollten geben Sie immer eine leere Sammlung anstelle von null zurück.

Warum sollten Sie Ihren Anrufer auf Null prüfen, wenn Sie einen vernünftigen, intuitiven Standardwert angeben können?

Der ganze Sinn von Kapselung besteht darin, die Arbeit an einem einzelnen Ort zu erledigen. Es kann diese spezifische Klassenimplementierung etwas komplexer machen, aber es macht die Verwendung seiner API einfacher.

In den meisten Fällen implementiere ich die Sammlung als Invariante in dem enthaltenden Typ:

%Vor%

Beachten Sie die Verwendung des Schlüsselworts %code% , das sicherstellt, dass die einmal ermittelte Liste niemals ersetzt oder gelöscht werden kann (aber sie kann immer noch zurückgesetzt werden). Dies schützt die Liste als eine Invariante der Klasse, die mich davon abhält, im Rest meines Codes Null-Checks zu schreiben.

Lazy Loading ist auch ein gültiges Kodierungs-Idiom, aber ich benutze es nur, wenn ich es explizit brauche.

    
___ antwort2295381 ___

Ich bevorzuge die zweite Variante, weil sie offensichtlicher ist und die Konstruktorgröße verringert. Aber machen Sie diese Felder in der Regel nur readonly:

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123ienumerable ___ IEnumerable und sein generisches Gegenstück IEnumerable sind .NET-Schnittstellen zum Iterieren (oder Aufzählen) einer Sammlung von Elementen. ___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe abzurufen und festzulegen. ___ tag123collections ___ Auflistungs-APIs stellen Entwicklern eine Reihe von Klassen und Schnittstellen zur Verfügung, mit denen die Sammlung von Objekten vereinfacht wird. ___ answer2295369 ___

Option 2 (Standardweg) und vermeiden Sie das Refactoring-Problem, indem Sie sicherstellen, dass Ihre Unit-Tests überprüfen, dass die leere Liste erwartungsgemäß zurückgegeben wird.

    
___
Mark Seemann 19.02.2010, 10:00
quelle
1
___ qstnhdr ___ Eigenschaften des Sammlertyps ___ answer2295458 ___

Ich verwende normalerweise die Variante, in der Sie die Liste im Konstruktor initialisieren. Dies kann den Konstruktor "aufgeblähter" machen, aber die Verantwortung des Konstruktors ist Konstruieren des Objekts. Das Einrichten von guten Standardwerten ist IMHO vollständig innerhalb seiner Verantwortlichkeiten. Außerdem müssen Sie sich als Bonus keine Sorgen um private Felder machen, die den Code sauberer erscheinen lassen.

Sicher, Refactoring macht ein wenig schwieriger, aber nicht signifikant. Vergessen Sie nicht, dass Sie Ihre Konstruktoren verketten können (meistens sowieso). Selbst wenn Sie mehrere Konstruktoren haben, sollten Sie nur einmal den Initialisierungscode schreiben müssen.

Vergessen Sie nicht zu dokumentieren, dass der Standardwert eine leere Sammlung ist. Und das Sammelfeld schreibgeschützt zu setzen, ist eine gute Übung, es sei denn, Sie haben einen guten Grund, es später zurückzusetzen.

    
___ qstntxt ___

Wenn die Eigenschaft einen Sammlungstyp wie

hat %Vor%

IMHO, ist es besser, leere Sammlung anstelle von Null-Wert zurückzugeben.
Es gibt viele Möglichkeiten, diese Funktionalität zu implementieren.

%Vor%

Auf diese Weise können Sie die Anzahl der Klassenfelder verringern, aber Sie müssen in jedem Konstruktor Code einfügen.

%Vor%

Dies ist ein Standardweg. Aber wenn jemand etwas in seinen Code schreibt, kann er das private Feld anstelle der Eigenschaft verwenden und Sie können einige Bugs bekommen, wenn Sie eine Aktion umgestalten.

%Vor%

Und das ist die Variante des vorherigen Weges mit Lazy Loading.

Was möchten Sie als Standardwert für die Sammlung zurückgeben? Wenn dies eine leere Sammlung ist, wie implementieren Sie es?

    
___ antwort2295383 ___

% null ist in der Tat nicht ideal. Für Alternativen; es hängt von der Verwendung ab. IMO, diese Version (vom Hauptpost kopiert) ist die einfachste, tut aber alles, was wir brauchen:

%Vor%

und als ein Vorteil, es wird mit XmlSerializer arbeiten, wo-wie alles mit einem private set wird nicht funktionieren (ein Fehler; es sieht den Setter, aber nicht bemerkt es kann es nicht benutzen).

Der faule Ansatz ist normalerweise IMO-Overkill, wie in den meisten interessanten Fällen werden Sie die Listen trotzdem füllen.

    
___ antwort2295379 ___

Aus den .NET Design-Richtlinien :

  

Geben Sie sinnvolle Standardwerte für alle Eigenschaften an und stellen Sie sicher, dass die Standardwerte nicht zu einer Sicherheitslücke oder einem extrem ineffizienten Design führen.

Wenn Sie dieses Prinzip erweitern und es mit dem Prinzip der geringsten Überraschung kombinieren, sollten Sie deutlich machen, dass Sie sollten geben Sie immer eine leere Sammlung anstelle von null zurück.

Warum sollten Sie Ihren Anrufer auf Null prüfen, wenn Sie einen vernünftigen, intuitiven Standardwert angeben können?

Der ganze Sinn von Kapselung besteht darin, die Arbeit an einem einzelnen Ort zu erledigen. Es kann diese spezifische Klassenimplementierung etwas komplexer machen, aber es macht die Verwendung seiner API einfacher.

In den meisten Fällen implementiere ich die Sammlung als Invariante in dem enthaltenden Typ:

%Vor%

Beachten Sie die Verwendung des Schlüsselworts %code% , das sicherstellt, dass die einmal ermittelte Liste niemals ersetzt oder gelöscht werden kann (aber sie kann immer noch zurückgesetzt werden). Dies schützt die Liste als eine Invariante der Klasse, die mich davon abhält, im Rest meines Codes Null-Checks zu schreiben.

Lazy Loading ist auch ein gültiges Kodierungs-Idiom, aber ich benutze es nur, wenn ich es explizit brauche.

    
___ antwort2295381 ___

Ich bevorzuge die zweite Variante, weil sie offensichtlicher ist und die Konstruktorgröße verringert. Aber machen Sie diese Felder in der Regel nur readonly:

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123ienumerable ___ IEnumerable und sein generisches Gegenstück IEnumerable sind .NET-Schnittstellen zum Iterieren (oder Aufzählen) einer Sammlung von Elementen. ___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe abzurufen und festzulegen. ___ tag123collections ___ Auflistungs-APIs stellen Entwicklern eine Reihe von Klassen und Schnittstellen zur Verfügung, mit denen die Sammlung von Objekten vereinfacht wird. ___ answer2295369 ___

Option 2 (Standardweg) und vermeiden Sie das Refactoring-Problem, indem Sie sicherstellen, dass Ihre Unit-Tests überprüfen, dass die leere Liste erwartungsgemäß zurückgegeben wird.

    
___
Marc Gravell 19.02.2010 10:00
quelle
1

Ich verwende normalerweise die Variante, in der Sie die Liste im Konstruktor initialisieren. Dies kann den Konstruktor "aufgeblähter" machen, aber die Verantwortung des Konstruktors ist Konstruieren des Objekts. Das Einrichten von guten Standardwerten ist IMHO vollständig innerhalb seiner Verantwortlichkeiten. Außerdem müssen Sie sich als Bonus keine Sorgen um private Felder machen, die den Code sauberer erscheinen lassen.

Sicher, Refactoring macht ein wenig schwieriger, aber nicht signifikant. Vergessen Sie nicht, dass Sie Ihre Konstruktoren verketten können (meistens sowieso). Selbst wenn Sie mehrere Konstruktoren haben, sollten Sie nur einmal den Initialisierungscode schreiben müssen.

Vergessen Sie nicht zu dokumentieren, dass der Standardwert eine leere Sammlung ist. Und das Sammelfeld schreibgeschützt zu setzen, ist eine gute Übung, es sei denn, Sie haben einen guten Grund, es später zurückzusetzen.

    
wasatz 19.02.2010 10:14
quelle
0

Option 2 (Standardweg) und vermeiden Sie das Refactoring-Problem, indem Sie sicherstellen, dass Ihre Unit-Tests überprüfen, dass die leere Liste erwartungsgemäß zurückgegeben wird.

    
Paolo 19.02.2010 09:58
quelle
0
___ qstnhdr ___ Eigenschaften des Sammlertyps ___ answer2295458 ___

Ich verwende normalerweise die Variante, in der Sie die Liste im Konstruktor initialisieren. Dies kann den Konstruktor "aufgeblähter" machen, aber die Verantwortung des Konstruktors ist Konstruieren des Objekts. Das Einrichten von guten Standardwerten ist IMHO vollständig innerhalb seiner Verantwortlichkeiten. Außerdem müssen Sie sich als Bonus keine Sorgen um private Felder machen, die den Code sauberer erscheinen lassen.

Sicher, Refactoring macht ein wenig schwieriger, aber nicht signifikant. Vergessen Sie nicht, dass Sie Ihre Konstruktoren verketten können (meistens sowieso). Selbst wenn Sie mehrere Konstruktoren haben, sollten Sie nur einmal den Initialisierungscode schreiben müssen.

Vergessen Sie nicht zu dokumentieren, dass der Standardwert eine leere Sammlung ist. Und das Sammelfeld schreibgeschützt zu setzen, ist eine gute Übung, es sei denn, Sie haben einen guten Grund, es später zurückzusetzen.

    
___ qstntxt ___

Wenn die Eigenschaft einen Sammlungstyp wie

hat %Vor%

IMHO, ist es besser, leere Sammlung anstelle von Null-Wert zurückzugeben.
Es gibt viele Möglichkeiten, diese Funktionalität zu implementieren.

%Vor%

Auf diese Weise können Sie die Anzahl der Klassenfelder verringern, aber Sie müssen in jedem Konstruktor Code einfügen.

%Vor%

Dies ist ein Standardweg. Aber wenn jemand etwas in seinen Code schreibt, kann er das private Feld anstelle der Eigenschaft verwenden und Sie können einige Bugs bekommen, wenn Sie eine Aktion umgestalten.

%Vor%

Und das ist die Variante des vorherigen Weges mit Lazy Loading.

Was möchten Sie als Standardwert für die Sammlung zurückgeben? Wenn dies eine leere Sammlung ist, wie implementieren Sie es?

    
___ antwort2295383 ___

% %code% ist in der Tat nicht ideal. Für Alternativen; es hängt von der Verwendung ab. IMO, diese Version (vom Hauptpost kopiert) ist die einfachste, tut aber alles, was wir brauchen:

%Vor%

und als ein Vorteil, es wird mit %code% arbeiten, wo-wie alles mit einem %code% wird nicht funktionieren (ein Fehler; es sieht den Setter, aber nicht bemerkt es kann es nicht benutzen).

Der faule Ansatz ist normalerweise IMO-Overkill, wie in den meisten interessanten Fällen werden Sie die Listen trotzdem füllen.

    
___ antwort2295379 ___

Aus den .NET Design-Richtlinien :

  

Geben Sie sinnvolle Standardwerte für alle Eigenschaften an und stellen Sie sicher, dass die Standardwerte nicht zu einer Sicherheitslücke oder einem extrem ineffizienten Design führen.

Wenn Sie dieses Prinzip erweitern und es mit dem Prinzip der geringsten Überraschung kombinieren, sollten Sie deutlich machen, dass Sie sollten geben Sie immer eine leere Sammlung anstelle von null zurück.

Warum sollten Sie Ihren Anrufer auf Null prüfen, wenn Sie einen vernünftigen, intuitiven Standardwert angeben können?

Der ganze Sinn von Kapselung besteht darin, die Arbeit an einem einzelnen Ort zu erledigen. Es kann diese spezifische Klassenimplementierung etwas komplexer machen, aber es macht die Verwendung seiner API einfacher.

In den meisten Fällen implementiere ich die Sammlung als Invariante in dem enthaltenden Typ:

%Vor%

Beachten Sie die Verwendung des Schlüsselworts %code% , das sicherstellt, dass die einmal ermittelte Liste niemals ersetzt oder gelöscht werden kann (aber sie kann immer noch zurückgesetzt werden). Dies schützt die Liste als eine Invariante der Klasse, die mich davon abhält, im Rest meines Codes Null-Checks zu schreiben.

Lazy Loading ist auch ein gültiges Kodierungs-Idiom, aber ich benutze es nur, wenn ich es explizit brauche.

    
___ antwort2295381 ___

Ich bevorzuge die zweite Variante, weil sie offensichtlicher ist und die Konstruktorgröße verringert. Aber machen Sie diese Felder in der Regel nur readonly:

%Vor%     
___ tag123c ___ C # (sprich "Cis") ist eine objektorientierte Programmiersprache auf hohem Niveau, die für die Erstellung einer Vielzahl von Anwendungen entwickelt wurde, die auf dem .NET Framework (oder .NET Core) ausgeführt werden. C # ist einfach, leistungsfähig, typsicher und objektorientiert. ___ tag123ienumerable ___ IEnumerable und sein generisches Gegenstück IEnumerable sind .NET-Schnittstellen zum Iterieren (oder Aufzählen) einer Sammlung von Elementen. ___ tag123properties ___ Eine Eigenschaft in einigen objektorientierten Programmiersprachen ist eine spezielle Art von Klassenmember, die zwischen einem Feld (oder Datenelement) und einer Methode liegt. Eigenschaften werden wie Felder gelesen und geschrieben, aber Lese- und Schreibvorgänge für Eigenschaften werden (normalerweise) übersetzt, um Methodenaufrufe abzurufen und festzulegen. ___ tag123collections ___ Auflistungs-APIs stellen Entwicklern eine Reihe von Klassen und Schnittstellen zur Verfügung, mit denen die Sammlung von Objekten vereinfacht wird. ___ answer2295369 ___

Option 2 (Standardweg) und vermeiden Sie das Refactoring-Problem, indem Sie sicherstellen, dass Ihre Unit-Tests überprüfen, dass die leere Liste erwartungsgemäß zurückgegeben wird.

    
___
Dmitry Borovsky 19.02.2010 10:00
quelle