Utilizzo delle interfacce come parte dell'incapsulamento

0

Sto creando interfacce per un certo numero di classi esistenti per motivi di derisione. Molte di queste classi hanno anche metodi di scope del pacchetto come tentativo di fornire un certo livello di incapsulamento assicurando che solo il controller possa modificare parte del loro stato. Avevo pensato di poter usare questo cambiamento per cercare di ottenere un incapsulamento più pulito.

La mia domanda è due volte. Innanzitutto, è considerato fattibile utilizzare le interfacce per l'incapsulamento? Potrei fare certi metodi non nella mia interfaccia che sono disponibili nella classe. oppure potrei avere il mio metodo IBar con un metodo getFoo che restituisce un IFoo, ma la mia classe bar sostituisce getFoo per restituire una barra. Il problema è che chiunque potrebbe facilmente trasmettere il mio Ixxx alla classe reale, quindi è davvero considerato un incapsulamento utile?

La mia seconda domanda ha a che fare con il mio modello. Vorrei che il mio modello avesse alcuni metodi getAllFoo che restituiscono oggetti IFoo. tuttavia, voglio che il mio controller abbia un modo per recuperare l'implementazione di actuall Foo (cioè sapere che il mio IFoo è di tipo Foo) in modo che abbia accesso a metodi non nell'interfaccia. Qual è considerato il modo più pulito per garantire che il mio controllore abbia accesso alla classe completa, ma le altre classi vedono solo l'interfaccia? Prenderò solo il casting dell'interfaccia per la sua classe concreta sarebbe considerato piuttosto sciatto?

    
posta dsollen 26.02.2014 - 16:43
fonte

2 risposte

-1

L'interfaccia non offre vantaggi di incapsulamento se è necessario eseguire il cast sulla classe per poter utilizzare un oggetto, o se la classe è pubblica, piuttosto che interna o privata annidata in un'altra classe.

Per dare al tuo controller l'accesso ai membri che non sono disponibili ad altre classi, devi rendere Foo una classe nidificata privata all'interno della classe controller, rendendola invisibile anche all'interno dello stesso assembly, oppure rendere Foo una classe interna, rendendola invisibile all'esterno dell'assembly.

Il mio consiglio è di evitare il più possibile le interfacce e usarle solo nei casi in cui è necessario i vantaggi dell'ereditarietà multipla, in quanto è l'unica forma di ereditarietà consentita (sì non è vera ereditarietà, ma l'idea è la stessa). Utilizzare le classi base il più possibile. Questo renderà più semplice per gli altri leggere e navigare nel tuo codice. Per l'incapsulamento, prova a mettere le classi correlate nello stesso assembly, quindi alcune di esse possono essere interne e alcuni membri possono anche essere interni.

Scelta tra Classe e Interfaccia nel Framework Design Il libro delle linee guida ha più informazioni.

    
risposta data 27.02.2014 - 00:36
fonte
-1

Ogni volta che il casting è un problema per l'incapsulamento dipende ogni volta che hai Abilitazione o Dirigere l'atteggiamento . Per la persona con atteggiamento direttivo, il fatto che sia possibile ignorare l'incapsulamento è sicuramente un problema, quindi probabilmente non vedranno l'utilizzo di un'interfaccia come incapsulamento appropriato. Ma per una persona con un atteggiamento favorevole, questo non è un problema, perché per loro è sufficiente che l'interfaccia comunichi al programmatore quali metodi sono sicuri da usare e che qualsiasi programmatore sarà ben consapevole dei problemi e dei rischi che l'upcasting può portare e non lo userà leggermente.

C'è anche il caso di usare l'interfaccia pubblica con una classe privata o interna. Quindi il problema dell'upcasting va via, perché il compilatore non consentirà l'accesso alla classe privata in modo da poter eseguire l'upcast.

E non dimentichiamo della riflessione. Anche se il programmatore è limitato dall'incapsulamento, di solito la riflessione può aggirarlo. Quindi c'è sempre un modo per spezzare l'incapsulamento se il programmatore pensa che risolverà i suoi problemi.

Come per la tua domanda sul modello. Dov'è il problema di mantenere collection of Foo internamente nel controller ma restituendo collection of IFoo al mondo esterno?

    
risposta data 05.04.2014 - 08:39
fonte

Leggi altre domande sui tag