Programmazione di un'interfaccia e di una segregazione di interfaccia nel contesto di una classe utente [duplicato]

1

Cerco di programmare su un'interfaccia ogni volta che è possibile, ma non mi è chiaro come potrei applicarlo a un modello così vasto come un utente. Che può contenere molti campi disparati (nome, età, numero di telefono, ssn, ecc.) O essere composto da molti moduli.

Potrei progettare una libreria di funzionalità generiche da utilizzare tra le applicazioni, che potrebbe contenere un ICallable per effettuare una telefonata o Inameable per visualizzare un nome sulla console. Ma alla fine la classe utente (il modo in cui i dati sono accessibili e / o memorizzati) sarebbe unica per un'applicazione e le sue esigenze.

Se provo a progettare l'utente e i consumatori nella libreria (sopra indicata) per comunicare per interfaccia, ottengo una "zuppa di interfaccia" (o qualcosa di "hydra-esque") sulla classe utente. Dove mi sembra di estendere un'interfaccia per quasi tutti gli attributi o moduli.

public class Employee : INameable, ICallable, IAgeable, IPayable ...

Questo è particolarmente sbagliato? Sto sfruttando troppo l'interfaccia evitando completamente l'iniezione di classi concrete nel consumatore (e impedendo un uso più generale)?

Qual è un approccio migliore a questo problema?

    
posta profile 29.06.2015 - 09:27
fonte

3 risposte

1

Non è sbagliato. Potrebbe essere un suggerimento che la tua classe sia troppo grande per le sue scarpe in primo luogo e dovresti rifattarla, ma ciò non ha nulla a che fare con la programmazione contro le interfacce.

Se segui il principio secondo cui la funzionalità complessa dovrebbe trattare i tipi di interfaccia piuttosto che i tipi concreti, la tua classe concreta deve indossare tutti quei "cappelli" di interfaccia. Il fatto che dichiari una lunga lista di loro è solo un'espressione del fatto che fa molte cose.

Così com'è, le interfacce che stai estendendo sono tutte cose diverse, quindi questa lunga lista non è una violazione di DRY che potresti in qualche modo eliminare.

    
risposta data 29.06.2015 - 09:31
fonte
0

Ho anche avuto lezioni concrete che implementano una manciata di interfacce, ma le classi sono state mediatori che delegano il loro comportamento a classi di responsabilità singola che soddisfano ciascuna una singola interfaccia. La stessa classe di mediazione ha un comportamento limitato al di fuori di determinare come i singoli moduli interagiranno e saranno utilizzati. Questa mediazione diventa la sua unica responsabilità, quindi l'SRP è preservato.

    
risposta data 29.06.2015 - 15:47
fonte
0

Non dovremmo dimenticare che il tutto è più grande di la somma delle sue parti. Potrei immaginare una situazione in cui un utente esiste e il suo numero di telefono è sconosciuto .. L'utente è un'istanza di ICallable? Essere "callable" e "essere un utente" sono due cose diverse. Quindi, la progettazione delle interfacce dovrebbe riflettere questa nozione.

Penso che la tua domanda non riguardi gli aspetti tecnici, ma piuttosto la tua area di dominio.

    
risposta data 29.06.2015 - 21:49
fonte

Leggi altre domande sui tag