Estou trabalhando em um aplicativo ASP.NET MVC e tenho adquirido o hábito de colocar o que parecem ser úteis e convenientes getters em minhas classes de modelo / entidade.
Por exemplo:
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string FullName
{
get { return FirstName + " " + LastName; }
}
public string FormattedPhoneNumber
{
get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
}
}
Eu estou querendo saber as pessoas pensam sobre o FullName
e FormattedPhoneNumber
getters.
Eles facilitam a criação de formatos de dados padronizados em todo o aplicativo e parecem economizar muito código repetido, mas definitivamente pode-se argumentar que o formato dos dados é algo que deve ser tratado no mapeamento de modelo para modelo de exibição.
De fato, originalmente eu estava aplicando esses formatos de dados na camada de serviço em que faço o mapeamento, mas estava se tornando um fardo precisar constantemente escrever formatadores e aplicá-los em muitos lugares diferentes. Por exemplo, eu uso "Nome completo" na maioria das visualizações e ter que digitar algo como em model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);
todo o lugar parecia muito menos elegante do que apenas digitar model.FullName = entity.FullName
(ou, se você usar algo como o AutoMapper, provavelmente não digita nada).
Então, onde você desenha a linha quando se trata de formatação de dados. É "bom" fazer a formatação de dados no seu modelo ou é um "cheiro de padrão"?
Nota: eu definitivamente não tenho nenhum html no meu modelo. Eu uso ajudantes html para isso. Estou falando estritamente sobre formatação ou combinação de dados (e especialmente dados usados com freqüência).
fonte
PhoneNumber
provavelmente pertence à sua própria classe (que eu implementei agora). MasFullName
foi realmente o que me motivou a escrever a pergunta. Mas estou interessado em descobrir se, em geral, faz sentido colocar a formatação / penteado de dados etc. no modelo para coisas que serão aplicadas em todo o aplicativo. A partir das respostas abaixo, parece que isso não é um antipadrão, mas a decisão deve ser tomada com cuidado.Respostas:
No seu exemplo, eu gosto do
FullName
getter (por todos os motivos que você deu), mas não gosto do getter FormattedPhoneNumber. A razão é: provavelmente não é assim tão fácil (uma vez que você tem números internacionais de telefone etc.) e se você colocar a lógica de formatação números de telefone em um método deMember
, as chances são que você vai precisar para refatorar (ou copiar e colar caugh ) uma vez que você também precisa de um número de telefone formatadoInstitution
,Vendor
etc.EDIT: IMO, seria melhor ter uma
PhoneNumber
classe com umFormatted
getter.fonte
String
turma, presumo), você "ensina" aString
turma como formatar números de telefone. É realmente responsabilidade daString
classe saber sobre números de telefone? Acho que não. Usados dessa maneira, os métodos de extensão são um açúcar sintático para deixar algo que claramente não é orientado a objetos.PhoneNumber
aula. Estou planejando fazer isso de qualquer maneira, porque também tenho umaPhoneType
propriedade.PhoneNumber
como uma classe de instância porque os dados são nativosstring
. Em vez disso, deve ser uma classe estática com métodos comopublic static string Format(string phoneNumber, PhoneNumberStyle style)
.O que você precisa considerar ao escrever um código: está correto? É legível? É eficiente? É sustentável? Eu argumentaria, como @btilly mencionou, que não é sustentável devido à formatação específica da cultura, mas a questão parece ser mais geral do que isso.
Usar acessadores como esses torna seu código mais legível e, dependendo de como você o usa, pode tornar outras partes do código muito mais limpas. Na minha opinião, isso não cheira nada. Começaria a cheirar se você tivesse acessadores de formatação para qualquer tipo de string que você queira imprimir (
public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;
, etc)Ou, em outras palavras, o uso de um padrão não faz com que seu código tenha "cheiro de padrão" automaticamente. Você precisa abusar dele se quiser ganhar esse atributo.
fonte
Quebra o princípio da responsabilidade única. Por que não fazer uma classe de número de telefone, etc ...?
fonte
FullName
aula?Para o seu exemplo, não considero muito difícil usar formatos específicos. É uma ou duas e todas as partes do aplicativo usam o mesmo formato.
O ponto em que essa decisão começaria a ser interrompida é quando você tem os mesmos dados em vários locais diferentes, exigindo formatos diferentes .
Se isso acontecesse, eu ficaria tentado a puxar a
Member
turma de volta para:E, em seguida, faça adaptadores diferentes para cada destino. Por exemplo, suponha que as informações sejam necessárias no formato CSV:
Sempre assumindo que você limpou os dados para que não haja vírgulas etc. nas strings.
O adaptador não precisa ser um método de extensão, mas, para esse caso de simulação, parece se encaixar.
fonte
over
tantas vezes quanto isso, então há algo errado com o design.