Si tratta di un "odore modello" per mettere getter come "FullName" o "FormattedPhoneNumber" nel modello?

13

Sto lavorando su un'app ASP.NET MVC e ho preso l'abitudine di inserire quelli che sembrano utili e utili getter nelle mie classi modello / entità.

Ad esempio:

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); }
    }
}

Mi chiedo se le persone pensino a FullName e FormattedPhoneNumber getter.

Semplificano la creazione di formati di dati standardizzati in tutta l'app e sembrano risparmiare molto codice ripetuto, ma si potrebbe sicuramente sostenere che il formato dei dati è qualcosa che deve essere gestito nella mappatura dal modello alla visualizzazione- modello.

In effetti, inizialmente stavo applicando questi formati di dati nel mio livello di servizio in cui eseguivo la mia mappatura, ma stava diventando un peso dover scrivere continuamente i formattatori quindi applicarli in molti posti diversi. Ad esempio, uso il "Nome completo" nella maggior parte delle visualizzazioni e dover digitare qualcosa come model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName); in tutto il posto mi è sembrato molto meno elegante rispetto alla semplice digitazione di model.FullName = entity.FullName (oppure, se si utilizza qualcosa come AutoMapper, potenzialmente non si digita nulla affatto).

Quindi, dove si disegna la linea quando si tratta di formattazione dei dati. È "ok" per eseguire la formattazione dei dati nel modello o è un "odore modello"?

Nota: non ho alcun html nel mio modello. Io uso helper html per questo. Sto parlando rigorosamente di formattazione o combinazione di dati (e in particolare di dati che vengono usati frequentemente).

    
posta devuxer 23.06.2011 - 23:31
fonte

4 risposte

9

Nel tuo esempio, mi piace il FullName getter (per tutti i motivi che hai fornito) ma non mi piace il getter FormattedPhoneNumber. Il motivo è: probabilmente non è così facile (una volta che hai numeri di telefono internazionali ecc.) E se posizioni la logica per la formulazione di numeri di telefono in un metodo di Member , è probabile che dovrai refactoring (o copia-incolla < em> caugh ) quando hai bisogno di un numero di telefono formattato per Institution , Vendor ecc.

EDIT: IMO sarebbe meglio avere una classe PhoneNumber con un Formatted getter.

    
risposta data 23.06.2011 - 23:47
fonte
5

Le cose che devi considerare quando scrivi il codice: è corretto? È leggibile? È efficiente? È mantenibile? Direi, come @btilly, che non è mantenibile a causa della formattazione specifica della cultura, ma la domanda sembra essere più generale di quella.

L'utilizzo di accessori come questi rende il tuo codice più leggibile e, a seconda di come lo usi, potrebbe rendere molto più pulite altre parti del tuo codice. A mio avviso, questo non ha alcun odore. Avrebbe iniziato a puzzare se avessi accesso alla formattazione per qualsiasi tipo di stringa che potresti voler stampare ( public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode; , ecc.)

Oppure, per dirla in altro modo, l'uso di un pattern non rende automaticamente il tuo codice "odore di modello". Devi abusarne se vuoi guadagnare quell'attributo.

    
risposta data 23.06.2011 - 23:52
fonte
3

Rompe il principio della singola responsabilità. Perché non creare una classe di numeri di telefono, ecc ...?

    
risposta data 24.06.2011 - 01:01
fonte
1

Per il tuo esempio, non lo vedo come un problema troppo grande per utilizzare formati specifici. Sono uno o due e tutte le parti dell'applicazione usano lo stesso formato.

Quando questa decisione inizia a decadere è quando si hanno gli stessi dati in diversi luoghi che richiedono formati diversi .

Se ciò accadesse, sarei tentato di riportare la classe Member su:

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }  
}

E poi fai diversi adattatori per ciascun bersaglio. Ad esempio, supponiamo che le informazioni fossero richieste in formato CSV:

public static class CSVMemberAdapter
{
    public static string ToCSV(this Member mbr)
    {
         return mbr.Id + "," + mbr.LastName + "," + mbr.FirstName, "," mbr.PhoneNumber;
    }
}

Supponendo sempre di aver disinfettato i dati in modo che nessuna virgola ecc. sia nelle stringhe.

L'adattatore non deve essere un metodo di estensione, ma per questo caso immaginario sembra adattarsi.

    
risposta data 23.06.2011 - 23:52
fonte

Leggi altre domande sui tag