Progettazione di parametri
Le linee guida fornite in questa sezione consentono di selezionare i tipi e i nomi corretti per i parametri dei membri. Vengono inoltre fornite linee guida di progettazione per i parametri.
Utilizzare il tipo di parametro con un numero inferiore di derivazioni che fornisce la funzionalità richiesta dal membro.
Questa indicazione è illustrata nell'esempio di codice riportato di seguito. La classe BookInfo eredita dalla classe Publication. La classe di gestione implementa due metodi: GoodGetAuthorBiography. BadGetAuthorBiography e BadGetAuthorBiography utilizza riferimenti a oggetti BookInfo anche se utilizza esclusivamente i membri dichiarati in Publication. Il metodo GoodGetAuthorBiography dimostra la procedura di progettazione corretta.
' 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;
}
Non utilizzare parametri riservati.
Nelle future versioni di una libreria sarà possibile aggiungere nuovi overload che accettano parametri aggiuntivi.
Nell'esempio di codice riportato di seguito viene prima illustrato un metodo non valido che viola questa indicazione, quindi vengono illustrati i metodi con la procedura di progettazione corretta.
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.
}
Non utilizzare metodi esposti pubblicamente che accettano puntatori, matrici di puntatori o matrici multidimensionali come parametri.
Per l'utilizzo della maggior parte delle librerie non deve essere richiesta la conoscenza di queste funzioni avanzate.
Collocare tutti i parametri out dopo tutti i parametri pass-by-value e ref (escluse le matrici di parametri), anche se ciò può comportare un'incoerenza nell'ordinamento dei parametri tra gli overload.
Questa convenzione rende più comprensibile la firma del metodo.
Quando si esegue l'override di membri o si implementano membri di interfaccia, assegnare ai parametri dei nomi coerenti.
Gli override devono utilizzare gli stessi nomi di parametro. Gli overload devono utilizzare gli stessi nomi di parametro del membro dichiarante. Le implementazioni di interfacce devono utilizzare gli stessi nomi definiti nella firma del membro di interfaccia.
Portions Copyright 2005 Microsoft Corporation. Tutti i diritti riservati.
Portions Copyright Addison-Wesley Corporation. Tutti i diritti riservati.
Per ulteriori informazioni sulle linee guida di progettazione, vedere “le linee guida di progettazione di Framework: Idiomi convenzioni, e modelli per libro raccolte riutilizzabili .NET„ di Krzysztof Cwalina e brad Abrams, emessi da Addison-Wesley, 2005.
Vedere anche
Altre risorse
Linee guida di progettazione dei membri
Linee guida di progettazione per lo sviluppo di librerie di classi