Come rappresentare un oggetto parzialmente valido

3

Supponiamo che una funzione deserializzi e convalidi alcuni oggetti dalla stringa e restituisca il risultato come Either<string, MyObject> . Quindi un oggetto è completamente deserializzato e valido o si è verificato un qualche tipo di errore. Supponiamo ora che anche se solo alcuni dei campi siano validi, la funzione di deserializzazione dovrebbe restituirli. In che modo questo tipo di risultato potrebbe essere rappresentato in C # o in Java? Stavo pensando di restituire Either<Tuple<int, string, MyObject>, MyObject> con int come una bandiera che indica quali campi sono effettivamente validi ma che non sembrano elegiari. Qualche idea?

    
posta synapse 30.06.2017 - 22:29
fonte

4 risposte

5

A seconda della semantica desiderata, dovresti rendere i campi di MyObject tipi come Optional<T> , oppure dovresti creare una nuova classe con campi come quello o con tipo Either<string, T> . Dovresti fare il primo se solo può accadere che MyObject possa mancare alcuni campi. Dovresti fare quest'ultimo se vuoi elaborare l'oggetto intermedio per produrre MyObject , ad esempio sostituendo i valori predefiniti per i campi mancanti o combinando più oggetti insieme, o se vuoi produrre una descrizione più dettagliata dell'errore di deserializzazione . In pratica, deserializzi in questo oggetto intermedio, quindi produci un MyObject da esso se tutti i campi sono disponibili (o se i valori possono essere altrimenti forniti per loro) o se generano un errore.

    
risposta data 30.06.2017 - 23:15
fonte
2

Quello che vuoi veramente è un oggetto di trasferimento dati . È fondamentalmente un sacchetto di proprietà che non ha alcuna logica speciale. Quindi sei libero di associarlo a una business class e gestire altrimenti i dati non validi.

    
risposta data 01.07.2017 - 00:52
fonte
0

Suppose a function deserializes and validates some object from string and returns the result as Either.

Sarebbe meglio incapsulare la parte di deserializzazione e di validazione in un oggetto separato.

Supponiamo che tu abbia una tipica applicazione web, in cui devi trattare con i dati dei moduli, potresti usare qualcosa di simile a questo:

public class MyForm {
    [...]
    public boolean is_valid(){
        // return validation result
    }

    public List<ValidationError> getValidationErrors(){
        // return validation errors
    }

    public MyObject getCleanData(){
        // gets an object only containing validated data
    }
    [...]
} 

MyForm è un oggetto che incapsula la funzionalità della (de-) serializzazione di dati da o verso altri oggetti contenenti ulteriore logica aziendale. E getCleanData desera solo i campi validi in MyObject - nel caso in cui il modulo sia valido, risulta in un'istanza completamente compilata.

La domanda per la tua logica applicativa è come gestire un oggetto mezzo pieno .

    
risposta data 01.07.2017 - 07:35
fonte
-1

How to represent partially valid object

Non farlo. È valido o no, quindi è utile o può essere buttato via.

So an object is either completely deserialized and valid or some kind of error happened. Now suppose if even only some of the fields are valid the deserialization function should return them.

Ma a quanto pare hai diversi livelli di validità. Non hai detto cosa intendi fare con l'oggetto non valido ma sembra che in alcuni scenari sia valido dopotutto e puoi lavorare con esso altrimenti non lo restituiresti. Poi vuoi usarlo in un altro scenario e si scopre che non funzionerà più.

Tuttavia, penso che quello che stai cercando di ottenere è di abusare dell'oggetto che la deserializzazione ritorna per dire se si sono verificati errori durante quel processo in base alle proprietà dell'oggetto restituito. Quindi ora non ha solo lo scopo di essere solo un oggetto di dati ma anche un risultato di deserializzazione. Ha due responsabilità e questo viola la S di SOLID.

Dovresti invece creare un altro oggetto il cui scopo è raccogliere informazioni sulla deserializzazione in modo da conoscere esattamente cosa è andato storto o quali proprietà non possono essere deserializzate e forse per quale motivo ecc.

    
risposta data 01.07.2017 - 17:03
fonte

Leggi altre domande sui tag