Qual é a melhor maneira de propriedades de acesso da mesma classe, através de assessores ou diretamente? [fechadas]
-
21-08-2019 - |
Pergunta
Este é algo que eu não sou muito consistente sobre e sempre curioso sobre o que outras pessoas fazem.
Como você acessar propriedades internas (privadas ou públicas)?
Por exemplo, você tem essa propriedade:
Private _Name As String
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Na mesma classe dentro de outra função qual deles você prefere? e por quê?
_Name = "Johnny"
ou
Name = "Johnny"
ignorar o fato de que eu usei nome em vez de Me.Name.
Solução
Pessoalmente eu prefiro usar a propriedade sempre que possível. Isso significa que você ainda obter a validação, e você pode facilmente colocar pontos de interrupção no acesso a propriedade. Este não trabalho em que você está tentando fazer uma alteração em duas propriedades que validam uns contra os outros - por exemplo, um "min e max" par, onde cada um tem uma restrição de validação de tal forma que min <= max
em todos os momentos. Você pode ter (C #):
public void SetMinMax(int min, int max)
{
if (max > min)
{
throw new ArgumentOutOfRangeException("max";
}
// We're okay now - no need to validate, so go straight to fields
this.min = min;
this.max = max;
}
Em algum ponto no futuro, eu gostaria de ver C # ganhar a capacidade de declarar o campo de apoio dentro da propriedade, de modo que é privada para apenas propriedade:
public string Name
{
string name;
get { return name; }
set
{
if (value == null)
{
throw new ArgumentNullException("value");
}
name = value;
}
}
Fora da propriedade, você não seria capaz de chegar a name
em tudo, apenas a Name
. Nós já temos isso por propriedades implementadas automaticamente, mas eles não podem conter qualquer lógica.
Outras dicas
Eu diria
Name = "Johnny"
A razão é que eu poderia ter alguma validação (ou gatilho, ou inicialização lenta, ou ...), ou pode decidir mais tarde para inserir alguma validação, ao atribuir nome e eu quero ter a certeza de gatilho que código.
Eu prefiro:
Name = "Johny"
Para mim, a razão é muito simples, se algo de ruim acontece com _Name, você pode sempre colocar alguma saída em getter / setter e descobrir o que está causando o problema.
Este é bastante interessante, eu acho que a maioria das pessoas fazendo o que faço
Me.Name = "Johnny"
ou
Name = "Johnny"
No entanto a maioria dos projetos que eu vi usando
_Name = "Jonny"
estilo. Que I embora foi uma má idéia, e graças a respostas que você confirmou. Mesmo a maior parte do código gerado auto-code por várias ferramentas utiliza acesso directo.
Existe algum impacto na performance particular? Ou é compilador otimiza-lo quando não há nenhum código extra em conjunto ou obter.
Use propriedade (Name). Eu acredito que uma propriedade deve ser o único "dono" de campo (_name) subjacente.
Vantagens de encapsular campo sob uma propriedade:
- Legibilidade: Apenas uma região de código onde _name é alterado ou transformado antes retornado.
- Fácil de set point break-, depuração etc.
- DRY: Nenhum código repetido tanto quanto validação e processamento está em causa.
- Alterar resiliência: Mudando validação e processamento não afetará o código usando propriedade.