Design de parâmetro
As diretrizes neste tópico o ajuda a selecionar os tipos corretos e os nomes dos parâmetros de membro. As seguintes tópicos também presentes diretrizes de design para parâmetros.
Use o tipo de parâmetro derivado a menos que fornece a funcionalidade exigida pelo membro.
O exemplo de código a seguir ilustra essa diretriz. O BookInfo classe herda de Publication classe. O Manager classe implementa dois métodos: BadGetAuthorBiographye GoodGetAuthorBiography. BadGetAuthorBiography usa referências a BookInfo objetos mesmo que ele usa apenas os membros declarados em Publication. O GoodGetAuthorBiography método demonstra o design correto.
' 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;
}
Não use parâmetros reservados.
Versões futuras de uma biblioteca podem adicionar novas sobrecargas que usam parâmetros adicionais.
Primeiro, o exemplo de código a seguir demonstra um método incorreto que viole essa diretriz e mostra os métodos com o design correto.
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.
}
Não use os métodos expostos publicamente que levam a ponteiros, matrizes de ponteiros ou matrizes multidimensionais como parâmetros.
Conhecimento desses recursos avançados não devem usar a maioria das bibliotecas.
Coloque todos os parâmetros de saída após todos os parâmetros de passar por valor e o ref (excluindo as matrizes de parâmetros), mesmo que isso resulta em uma inconsistência no parâmetro ordenação entre sobrecargas.
Esta convenção faz com que a assinatura do método mais fácil de entender.
Seja consistente em parâmetros de nomeação quando substituindo membros ou implementar membros de interface.
Substituições devem usar os mesmos nomes de parâmetro. Sobrecargas devem usar os mesmos nomes de parâmetro como o membro declarativo. Implementações de interface devem usar os mesmos nomes definidos na assinatura do membro de interface.
Portions Copyright 2005 Microsoft Corporation. Todos os direitos reservados.
Portions Copyright Addison-Wesley Corporation. Todos os direitos reservados.
Para obter mais informações sobre as diretrizes de design, consulte a "diretrizes de Design do Framework: Convenções, idiomas e padrões de reutilizável.Bibliotecas de rede" catálogo por Krzysztof Cwalina e Brad Abrams, publicado pela Addison-Wesley, 2005.
Consulte também
Outros recursos
Diretrizes de Design do membro
Diretrizes de Design para desenvolvimento bibliotecas de classe