Vantagens de FindById () .
Futuro à prova : Se você começar com Find(int)
, e mais tarde tem que adicionar outros métodos ( FindByName(string)
, FindByLegacyId(int)
, FindByCustomerId(int)
, FindByOrderId(int)
, etc), pessoas como eu tendem a gastar idades procurando FindById(int)
. Não é realmente um problema se você puder e mudará Find(int)
para FindById(int)
quando necessário - a prova futura é sobre estes se s.
Mais fácil de ler . Find
está perfeitamente bem se a chamada parecer record = Find(customerId);
Ainda FindById
é um pouco mais fácil de ler se estiver record = FindById(AFunction());
.
Consistência . Você pode aplicar consistentemente o padrão FindByX(int)
/ em FindByY(int)
qualquer lugar, mas Find(int X)
/ Find(int Y)
não é possível porque eles entram em conflito.
Vantagens de Find ()
- BEIJO.
Find
é simples e direto e, ao lado operator[]
dele, é um dos 2 nomes de funções mais esperados nesse contexto. (Algumas alternativas populares sendo get
, lookup
oufetch
, dependendo do contexto).
- Como regra geral, se você tiver um nome de função que seja uma única palavra conhecida que descreva com precisão o que a função faz, use-a. Mesmo se houver um nome mais longo com várias palavras, é um pouco melhor para descrever o que a função faz. Exemplo: Length vs NumberOfElements . Há uma troca, e onde traçar a linha está sujeito a um debate em andamento.
- Geralmente é bom evitar redundância. Se olharmos
FindById(int id)
, podemos remover facilmente a redundância alterando-a para Find(int id)
, mas há uma troca - perdemos alguma clareza.
Como alternativa, você pode obter as vantagens de ambos usando IDs fortemente tipados:
CustomerRecord Find(Id<Customer> id)
// Or, depending on local coding standards
CustomerRecord Find(CustomerId id)
Implementação de Id<>
: Digitando fortemente valores de ID em C #
Os comentários aqui, bem como no link acima, levantaram várias preocupações sobre as Id<Customer>
quais gostaria de abordar:
- Preocupação 1: É um abuso de genéricos.
CustomerId
e OrderID
são tipos diferentes ( customerId1 = customerId2;
=> bom, customerId1 = orderId1;
=> ruim), mas sua implementação é quase idêntica, para que possamos implementá-los com copiar colar ou com metaprogramação. Embora exista valor em uma discussão sobre expor ou ocultar o genérico, a metaprogramação é para que servem os genéricos.
- Preocupação 2: não impede erros simples. / É uma solução em busca de um problema O principal problema que é removido usando Ids fortemente tipados é a ordem errada dos argumentos em uma chamada para
DoSomething(int customerId, int orderId, int productId)
. Ids fortemente tipados também evitam outros problemas, incluindo o que o OP perguntou.
- Preocupação 3: Ele realmente apenas obscurece o código. É difícil dizer se um ID é mantido
int aVariable
. É fácil dizer que um ID está retido Id<Customer> aVariable
, e podemos até dizer que é um ID de cliente.
- Preocupação 4: esses IDs não são tipos fortes, apenas invólucros.
String
é apenas um invólucro byte[]
. O agrupamento ou encapsulamento não está em conflito com a digitação forte.
- Preocupação 5: acabou de engenharia. Aqui está a versão mínima, embora eu recomende adicionar
operator==
e operator!=
também, se você não quiser confiar exclusivamente em Equals
:
.
public struct Id<T>: {
private readonly int _value ;
public Id(int value) { _value = value; }
public static explicit operator int(Id<T> id) { return id._value; }
}
T Find<T>(string name)
ou(int size)
como planeja resolver os problemas inevitáveis?