L'ereditarietà è una proprietà nulla nel genitore una cattiva pratica?

0

Non sono un programmatore esperto. Quindi chiedo.

Il campo in questione è il campo "Quantità". Memorizzo un importo solo in un paio di livelli della classe derivata.

Il codice è una porzione delle classi POCO che costituiscono il mio modello di dati, il datalayer è Entity framework, il codice prima.

Ne parlo perché la ragione per cui ho fatto la proprietà di quantità come ho fatto è perché quando ho inserito l'importo solo in una classe derivata o due e non nella classe Navigation, la tabella nel database avrebbe un campo aggiuntivo per ogni classe con una proprietà Amount, ad esempio (Quantità, Quantità1, Quantità2). Non mi è piaciuto.

Quindi, dopo aver provato il codice per un po 'ho scoperto che ...

Posizionare la proprietà Amount nella classe di navigazione e sovrascriverla nelle classi che implementavano Amount mi dava una tabella con un solo campo "Amount" che era Null, a meno che non fosse una delle classi che utilizzava l'importo nel qual caso aveva un valore, che era proprio quello che volevo. Mi è piaciuto.

Quindi la domanda è, è il modo in cui la proprietà Amount è gestita completamente corretta o ha qualche svantaggio?

public class Navigation
{
    int Id { get; set; }
    string Title { get; set; }
    string Description { get; set; }
    ObservableCollection<Navigation> Children { get; set; }

    public virtual decimal? Amount
    {
        get { return null; }
        set { value = null; }
    }
}
public class C1 : Navigation { }
public class C2 : Navigation { }
public class C3 : Navigation
{
    private decimal _amount;
    public override decimal? Amount
    {
        get { return _amount; }
        set { if (value != null) _amount = (decimal)value; }
    }
}
public class C4 : Navigation
{
    private decimal _amount;
    public override decimal? Amount
    {
        get { return _amount; }
        set { if (value != null) _amount = (decimal)value; }
    }
}
    
posta Jon 04.10.2014 - 03:22
fonte

2 risposte

2

Non è una buona pratica perché le persone si aspettano qualcosa quando vedono la proprietà nella classe. Immagina se qualcuno scrive:

var n = new Navigation (...);
n.Amount = 123.45;
......
Console.WriteLine(n.Amount); //null? why???

Un approccio migliore sarebbe almeno avvertirli:

public virtual decimal Amount{
    get { return new NotSupportedException("Amount is not supported in this class."); }
    set { //same as above }
}

Ma ora riceverai l'avviso di pratica C #: "le proprietà dovrebbero comportarsi come i campi e non dovrebbero mai generare eccezioni".

Forse puoi aggiungere un campo Type , quindi eliminare completamente l'ereditarietà. Ma non sono sicuro che sia appropriato per il tuo scenario (forse hai molti campi extra nelle classi derivate).

Naturalmente, se non stai scrivendo una libreria che verrà utilizzata da molti altri programmatori, non c'è nulla di sbagliato nel piegare le pratiche comuni . Sii flessibile .

Lo trovi confuso? Se funziona e sei a tuo agio, vai avanti.

Che cosa dovrei fare? Questo è uno dei lati negativi di Entity Framework, che comunque non mi piace molto. Per me, porta più problemi di quanti ne risolva. Creo semplicemente le tabelle nel DB, creo le classi come preferisci in C #, quindi scrivo alcuni metodi di supporto per mapparle. Se tutto ciò che fai è SELECT e INSERT , non è così difficile come potresti pensare. È al di fuori dell'ambito di questo sito, ma ti garantisco che sono circa ~ 50 righe (l'ho fatto).

    
risposta data 04.10.2014 - 21:48
fonte
0

Una cosa che puoi fare se vuoi aggiungere una proprietà solo a poche delle sottoclassi è usare un'altra interfaccia. Nel tuo esempio: Navigazione - > AmountEnabledNavigation - > C3, ma Navigazione - > C1. Nel codice che gestisce gli oggetti, ad es. aggiunge gli importi, puoi semplicemente controllare se l'oggetto eredita da AmountEnabledNavigation e poi decidere in base a quello.

Questo impedisce anche problemi successivi come eccezioni durante l'accesso agli oggetti. Sebbene possano essere catturati e gestiti, rallentano notevolmente il codice.

    
risposta data 24.12.2014 - 21:35
fonte

Leggi altre domande sui tag