Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, чтобы сопоставить несколько полей графического интерфейса пользователя со свойствами объекта (т. Е. Слой представления с отображением уровня бизнес-логики). Чтобы быть более конкретным, это в VB.Net 2.0 WinForms.
Природа решения требует, чтобы у нас было 4 столбца, которые демонстрируют одинаковый тип поведения в нашем графическом интерфейсе - каждый столбец, состоящий из 11 текстовых полей (мы просто будем использовать этот небольшой размер выборки, поскольку проблема выходит за рамки 11 текстовых полей) .
В настоящее время я задаю значение тега каждого текстового поля во всех четырех столбцах следующим образом:
Textbox1.tag = "name"
Textbox2.tag = "type"
Textbox3.tag = "speed"
Когда событие вызывается в текстовом поле (например, при нажатии клавиши), я смотрю на родительский контейнер, тег которого я также установил в виде строки, отображающей конкретный объект. Я использую это вместе с тегом текстового поля, чтобы определить, какое свойство объекта мне нужно установить. В целом это выглядит примерно так:
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
Как видите, это может быть очень плохо, довольно быстро. В настоящее время мы устанавливаем 43 некоторых нечетных свойства, которые могут быть сопоставлены - таким образом, оператор select является чрезвычайно длинным - многие из которых встроены в несколько методов, чтобы попытаться выполнить DRY (я разбавил код по существу до концептуального реализация).
Вопрос: как я могу это изменить? Я пытался до некоторой степени использовать словари / хэши, но они либо стали слишком сложными, либо просто не имели смысла в реализации, поскольку еще больше запутали проблему.
Спасибо за помощь.