Oggetto dati pubblici ma campo accessibile privatamente per selezionare la classe

1

Questa è una domanda di progettazione software. Non so come chiedere, quindi illustrerò con uno scenario. Aggiornerò il titolo per aiutare il riferimento per gli altri se c'è un modo migliore per chiedere.

Scenario

BizLogic è il livello aziendale in un tipico MVVM. Gestisce le normali operazioni CRUD su un elenco. Un requisito è che Data abbia un contatore di età. BizLogic è l'unica classe che dovrebbe accedere a Data.Age, poiché utilizza il campo Età per l'eliminazione dell'elenco. Tuttavia, ViewModel necessita dell'accesso all'oggetto Data per passare al livello di presentazione.

My question is, what is the best way to hide the Age field so that ViewModel doesn't inadvertently mess up BizLogic?

    
posta TrickySituation 13.09.2016 - 04:30
fonte

2 risposte

0

Che cosa farebbe l'interfaccia utente con Data che non dovrebbe essere in BizLogic ?

Raccolta personalizzata

[BizLogic] uses the Age field for pruning the List.

Un DataCollection personalizzato è in ordine. La responsabilità unica si applica anche se BizLogic è l'unico cliente. Presumo che il tuo linguaggio e le relative classi di raccolta consentano l'inserimento di un blocco di codice, LINQ, ecc. Con i metodi "Trova".

Dato una collezione con funzionalità appropriate potresti non aver bisogno di BizLogic per il livello di presentazione per fare la cosa.

Due% classiData

Spero che non esista una "struttura parallela". Non si vuole forzare i client a scrivere codice per questo. Il controllo dell'esposizione di Age deve essere progettato sia attraverso una classe composita che attraverso l'ereditarietà. Certamente la già citata collezione personalizzata e possibilmente BizLogic può emettere% Age -less di oggetti dal suo% interno% co_de.

Per prima cosa ho letto la risposta @Caleb, ho pensato che "blanking out" Data era buono ma poi, no. Questo rende oggetti dati non validi. punto.

    
risposta data 14.09.2016 - 17:42
fonte
0

what is the best way to hide the Age field so that ViewModel doesn't inadvertently mess up BizLogic?

Il modo migliore dipende probabilmente dalla lingua in cui stai lavorando e da come contraddittorio vuoi che sia la relazione tra il modello di dati e il modello di visualizzazione. Ecco due opzioni:

  1. Nascondi l'interfaccia con le informazioni sull'età. un modo per implementare questo sarebbe avere un'interfaccia pubblica per l'oggetto Data che è tutto ciò che è noto al mondo al di fuori del modello di dati, e un'interfaccia più dettagliata che è nota solo all'interno del modello di dati. Un modo per implementarlo è attraverso l'ereditarietà. Ad esempio, potresti avere una classe PublicData che fornisce le operazioni che qualsiasi client della classe può utilizzare e una sottoclasse BizLogicData di PublicData che fornisce la funzionalità aggiuntiva per tenere traccia di data age e tutte le altre cose di cui non vuoi sapere tutto il mondo.

  2. Mantieni separate le informazioni sull'età dal resto dei dati. Se BizLogic è responsabile dell'inserimento e dell'eliminazione di elementi nell'oggetto Data , dovrebbe essere possibile mantenere una struttura parallela separata che tenga traccia delle informazioni sull'età per ciascun elemento. In alternativa, puoi conservare le informazioni sull'età con il resto dei dati, ma eliminale da eventuali copie di Data fornite ai clienti esterni.

Cercare di mantenere sincronizzate le strutture parallele è sempre problematico, quindi preferirei la prima opzione quando possibile.

    
risposta data 13.09.2016 - 05:42
fonte