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 . Findestá 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, lookupoufetch , 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.
CustomerIde OrderIDsã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?