Parameterentwurf
Die Richtlinien in diesem Thema erleichtern Ihnen die Auswahl der richtigen Typen und Namen für Memberparameter. Die folgenden Themen enthalten auch Entwurfsrichtlinien für Parameter.
Verwenden Sie den Parametertyp mit den wenigsten Ableitungen, der die für den Member erforderliche Funktionalität bereitstellt.
Im folgenden Codebeispiel wird diese Richtlinie veranschaulicht. Die BookInfo-Klasse erbt von der Publication-Klasse. Die Manager-Klasse implementiert zwei Methoden: BadGetAuthorBiography und GoodGetAuthorBiography. BadGetAuthorBiographyBookInfo verwendete Verweise auf Objekte, obwohl es die nur Member verwendet, die in Publication deklariert werden. Mit der GoodGetAuthorBiography-Methode wird der richtige Entwurf veranschaulicht.
' A Class with some basic information.
Public Class Publication
Dim Protected authorValue as String
Dim Protected publicationDateValue as DateTime
Public Sub new(author as String, publishDate as DateTime)
Me.authorValue = author
Me.PublicationDateValue = publishDate
End Sub
Public Readonly Property PublicationDate as DateTime
Get
Return publicationDateValue
End Get
End Property
Public Readonly Property Author as String
Get
Return authorValue
End Get
End Property
End Class
' A Class that derives from Publication
Public Class BookInfo
Inherits Publication
Dim isbnValue as String
Public Sub new(author as string, _
publishDate as DateTime, _
isbn as String)
MyBase.New(author, publishDate)
Me.isbnValue = isbn
End Sub
Public Readonly Property Isbn as String
Get
Return isbnValue
End Get
End Property
End Class
Public Class Manager
' This method does not use the Isbn member
' so it doesn't need a specialized reference to Books
Shared Function BadGetAuthorBiography(book as BookInfo) as String
Dim biography as String = ""
Dim author as String = book.Author
' Do work here.
Return biography
End Function
' This method shows the correct design.
Shared Function GoodGetAuthorBiography(item as Publication) as String
Dim biography as String = ""
Dim author as String = item.Author
' Do work here.
Return biography
End Function
// A class with some basic information.
public class Publication
{
string author;
DateTime publicationDate;
public Publication(string author, DateTime publishDate)
{
this.author = author;
this.publicationDate = publishDate;
}
public DateTime PublicationDate
{
get {return publicationDate;}
}
public string Author
{
get {return author;}
}
}
// A class that derives from Publication
public class BookInfo :Publication
{
string isbn;
public BookInfo(string author, DateTime publishDate, string isbn) :
base(author, publishDate)
{
this.isbn = isbn;
}
public string Isbn
{
get {return isbn;}
}
}
public class Manager
{
// This method does not use the Isbn member
// so it doesn't need a specialized reference to Books
static string BadGetAuthorBiography(BookInfo book)
{
string biography = "";
string author = book.Author;
// Do work here.
return biography;
}
// This method shows the correct design.
static string GoodGetAuthorBiography(Publication item)
{
string biography = "";
string author = item.Author;
// Do work here.
return biography;
}
// A class with some basic information.
public ref class Publication
{
private:
String^ author;
DateTime publicationDate;
public:
Publication(String^ author, DateTime publishDate)
{
this->author = author;
this->publicationDate = publishDate;
}
property DateTime PublicationDate
{
DateTime get() {return publicationDate;}
}
property String^ Author
{
String^ get() {return author;}
}
};
// A class that derives from Publication
public ref class BookInfo : public Publication
{
private:
String^ isbn;
public:
BookInfo(String^ author, DateTime publishDate, String^ isbn) :
Publication(author, publishDate)
{
this->isbn = isbn;
}
property String^ Isbn
{
String^ get() {return isbn;}
}
};
private enum class ErrorOptions {ThrowOnError};
private enum class CasingOptions {CaseInsensitive};
private ref class BetterType
{
internal:
static void GetType(String^ name,
ErrorOptions throwOption,
CasingOptions caseOption)
{}
};
public ref class Manager
{
public:
// This method does not use the Isbn member
// so it doesn't need a specialized reference to Books
static String^ BadGetAuthorBiography(BookInfo^ book)
{
String^ biography = "";
String^ author = book->Author;
// Do work here.
return biography;
}
// This method shows the correct design.
static String^ GoodGetAuthorBiography(Publication^ item)
{
String^ biography = "";
String^ author = item->Author;
// Do work here.
return biography;
}
Verwenden Sie keine reservierten Parameter.
In zukünftigen Versionen einer Bibliothek können neue Überladungen hinzugefügt werden, die zusätzliche Parameter akzeptieren.
Im ersten Codebeispiel wird zunächst eine falsche Methode veranschaulicht, die diese Richtlinie verletzt, und anschließend werden Methoden mit dem richtigen Entwurf gezeigt.
Public Sub BadStoreTimeDifference (localDate as DateTime, _
toWhere as TimeZone, _
reserved as Object)
' Do work here.
End Sub
Public Sub GoodCStoreTimeDifference (localDate as DateTime, _
toWhere as TimeZone)
' Do work here.
End Sub
Public Sub GoodCStoreTimeDifference (localDate as DateTime, _
toWhere as TimeZone, _
useDayLightSavingsTime as Boolean)
' Do work here.
End Sub
public void BadStoreTimeDifference (DateTime localDate,
TimeZone toWhere,
Object reserved)
{
// Do work here.
}
public void GoodCStoreTimeDifference (DateTime localDate,
TimeZone toWhere)
{
// Do work here.
}
public void GoodCStoreTimeDifference (DateTime localDate,
TimeZone toWhere,
bool useDayLightSavingsTime)
{
// Do work here.
}
void BadStoreTimeDifference(DateTime localDate,
TimeZone^ toWhere,
Object^ reserved)
{
// Do work here.
}
void GoodCStoreTimeDifference(DateTime localDate,
TimeZone^ toWhere)
{
// Do work here.
}
void GoodCStoreTimeDifference(DateTime localDate,
TimeZone^ toWhere,
bool useDayLightSavingsTime)
{
// Do work here.
}
Verwenden Sie keine öffentlich verfügbar gemachten Methoden, die Zeiger, Arrays von Zeigern oder mehrdimensionale Arrays als Parameter akzeptieren.
Für die Verwendung der meisten Bibliotheken sollten keine Kenntnisse über diese erweiterten Features erforderlich sein.
Ordnen Sie alle out-Parameter nach allen als Wert oder als Verweis übergebenen Parametern (außer Parameterarrays) an, selbst wenn dies zu einer uneinheitlichen Parameteranordnung in Überladungen führt.
Diese Konvention erleichtert das Verständnis der Methodensignatur.
Benennen Sie Parameter einheitlich, wenn Sie Member überschreiben oder Schnittstellenmember implementieren.
Für Überschreibungen sollten die gleichen Parameternamen verwendet werden. Für Überladungen sollten die gleichen Parameternamen wie für die deklarierenden Member verwendet werden. Schnittstellenimplementierungen sollten die in der Schnittstellenmembersignatur definierten Namen verwenden.
Copyright für einzelne Teile 2005 Microsoft Corporation. Alle Rechte vorbehalten.
Copyright für einzelne Teile Addison-Wesley Corporation. Alle Rechte vorbehalten.
Weitere Informationen zu Entwurfsrichtlinien finden Sie unter „Framework-Entwurfs-Richtlinien: Idiome, Konventionen und Muster für wiederverwendbare .NET-Bibliotheken von Krzysztof Cwalina“ book und Brad Abrams, veröffentlicht von Addison-Wesley, 2005.