Domanda

Il problema che sto attualmente riscontrando è la mappatura di più campi della GUI sulle proprietà degli oggetti (ovvero il livello di presentazione sulla mappatura del livello di logica aziendale). Per essere più specifici, questo è in WinForms VB.Net 2.0.

La natura della soluzione ci richiede di avere 4 colonne che mostrano lo stesso tipo di comportamento sulla nostra GUI - ogni colonna composta da 11 caselle di testo (utilizzeremo solo questa piccola dimensione di esempio, poiché il problema si estende oltre 11 caselle di testo) .

Quello che sto attualmente facendo è impostare il tag di ogni casella di testo in tutte e quattro le colonne su un valore simile al seguente:

Textbox1.tag = "name"
Textbox2.tag = "type"
Textbox3.tag = "speed"

Quando un evento viene generato dalla casella di testo (ad es. pressione dei tasti), guardo il contenitore padre, il cui tag ho anche impostato come stringa che mappa un oggetto specifico. Lo uso, insieme al tag della casella di testo, per determinare quale proprietà dell'oggetto devo impostare. Nel complesso, sembra qualcosa del genere:

dim objectToMapTo //the generic parent object which all my custom myObjects inherit from

select case sender.parent.tag //the parent object that the property needs to map to
    case "column1"
         objectToMapTo = myObject1
    case "column2"
         objectToMapTo = myObject2
    case "column3"
         objectToMapTo = myObject3
    case "column4"
         objectToMapTo = myObject4
end select

select case sender.tag //the actual textbox's tag value which maps to the property
    case "name"
         objectToMapTo.Name = sender.text //sender.text is conceptual for 
        //the data that needs to be set -- i.e. this could be a calculated 
        //number based on the text, or simply a string, etc
    case "type"
         objectToMapTo.Type = sender.text
    case "speed"
         objectToMapTo.Speed = sender.text
    ...
end select

Come puoi vedere, questo può andare molto male, piuttosto rapidamente. Attualmente stiamo impostando 43 alcune proprietà dispari che possono essere mappate - quindi quell'istruzione select è estremamente lunga - molte delle quali sono incorporate in più metodi per provare e tentare DRY (ho annacquato il codice essenzialmente implementazione).

La domanda è: come posso refactoring questo? Ho provato a utilizzare dizionari / hash in una certa misura, ma o è diventato eccessivamente complesso, o semplicemente non ha avuto un senso di implementazione in quanto ha contorto il problema ancora di più.

Grazie per l'aiuto.

È stato utile?

Soluzione

il primo problema che hai risolto impostando il tag come oggetto. Poiché il tag non è una stringa ma di tipo object.

E il secondo problema che risolvi usando usin reflection ma rispetto al valore nel tag deve corrispondere esattamente al nome della proprietà.

_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text})

Disclaimer il riflesso è vicino ma forse non è corretto al 100%.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top