Оператор case в нескольких методах


Моя страница содержит: управления gridview1, GridView2, button1, имя button2, DropDownList1 я связываю gridviews и в таблице, выбранной в раскрывающемся такой:

Dim results as DataTable
Select Case ddl1.SelectedValue
    Case 0
        Dim cl as ClassZero = new ClassZero()
        results = cl.GetClassZeroNames()
    Case 1
           Dim cl as ClassOne = new ClassOne()
        results = cl.GetClassOneNames()
    Case 2
         Dim cl as ClassTwo = new ClassTwo()
        results = cl.GetClassTwoNames()
End Select
GridView1.DataSource = results
GridView1.DataBind()

Тогда у меня две кнопки следующий код:

Protected Sub btn1_Click(sender As Object, e As EventArgs) Handles btn2.Click
    Select Case ddl1.SelectedValue
        Case 0
             Dim cl as ClassZero = new ClassZero()
        results = cl.RunInsert()
        Case 1
             Dim cl as ClassOne = new ClassOne()
        results = cl.RunInsert()
        Case 2
             Dim cl as ClassTwo = new ClassTwo()
        results = cl.RunInsert()
    End Select
End Sub

И

Protected Sub btn2_Click(sender As Object, e As EventArgs) Handles btn2.Click
    Select Case ddl1.SelectedValue
        Case 0
             Dim cl as ClassZero = new ClassZero()
        results = cl.RemoveFromZero()
        Case 1
            Dim cl as ClassOne = new ClassOne()
        results = cl.RemoveFromOne()
        Case 2
            Dim cl as ClassTwo = new ClassTwo()
        results = cl.RemoveFromTwo()
    End Select
End Sub

Для меня это выглядит, как много накладных расходов. Как я могу улучшить дизайн и только указать, что я работаю на следующую запись в списке без указания условий каждый раз? Необходимо ли мне менять дизайн или оставить все как есть?

RunZero, RunOne, RunTwo, RemoveZero, RemoveOne, RemoveTwo, RemoveThree - выполнять шесть различных хранимых процедур.



1297
1
задан 17 августа 2011 в 07:08 Источник Поделиться
Комментарии
3 ответа

Вы могли бы использовать делегаты. Набор делегатов в Изменить случае ddl1, то вы всегда можете позвонить одними и теми же делегатами в обработчики кнопок. Таким образом, вы только нужно переключиться в ddl1 изменить событие, и ваш кнопку обработчики станет намного чище. Тем не менее, хотя это могло бы сделать код намного более ремонтопригодны/чтения, вероятно, будет менее эффективным, хотя вы все равно не сможете почувствовать разницу в обработчики пользовательского интерфейса.

Обновление: пример добавил

Что-то вдоль этих линий (не скопировать и вставить):

Public Delegate Function CreateClassDelegate() As NumberClass

Public Class Form
Public CreateClass As CreateClassDelegate

Private Sub ddl1_SelectedValueChanged(sender As Object, e As EventArgs)
Select Case Integer.Parse(TryCast(ddl1.SelectedItem, String))
Case 0
CreateClass = New CreateClassDelegate(AddressOf ClassZero.CreateClassZero)
Exit Select
Case 1
CreateClass = new CreateClassDelegate(AddressOf ClassOne.CreateClassOne);
Exit Select
Case 2
CreateClass = new CreateClassDelegate(AddressOf ClassTwo.CreateClassTwo);
Exit Select
End Select
End Sub

Private Sub btn1_Click(sender As Object, e As EventArgs)
Dim cl As NumberClass = CreateClass()
cl.GetNames()
End Sub

Private Sub btn2_Click(sender As Object, e As EventArgs)
Dim cl As NumberClass = CreateClass()
cl.RunInsert()
End Sub
End Class

Public MustInherit Class NumberClass
Public MustOverride Function GetNames() As List(Of String)
Public MustOverride Sub RunInsert()
Public MustOverride Sub Remove()
End Class

Public Class ClassZero
Inherits NumberClass
Public Overrides Function GetNames() As List(Of String)
...
Return Nothing
End Function
Public Overrides Sub RunInsert()
...
End Sub
Public Overrides Sub Remove()
...
End Sub

Public Shared Function CreateClassZero() As ClassZero
Return New ClassZero()
End Function
End Class

' ... same as above for ClassOne, ClassTwo

2
ответ дан 17 августа 2011 в 10:08 Источник Поделиться

Мне нравится использовать словари для таких вещей. Так в первом случае вы сможете создать словарь и использовать, что вместо оператора switch.

0
ответ дан 17 августа 2011 в 07:08 Источник Поделиться

Этот переключатель-заявление имеет очень мало накладных расходов. Словарь будет очистить его, но не так выразительны, как оператор switch. Вам все равно придется, например, словарь и заполнить его значениями.

Я действительно не вижу ничего плохого в том, что вы делаете. Некоторые могут мелочилась и рекомендовать операторе switch должны быть в другой способ. Когда вы садитесь на него, эти операторы Switch, вероятно, наименьшая из ваших проблем. Спасти тех, когда вам действительно больше нечем работать.

Обновление
Увидев обновление, первое, что я вижу, это тот же экземпляр снова и снова ...и пару способов борьбы с этим классы.

Вариант 1:
Сделать ClassZero, ClassOne, ClassTwo требуют новый экземпляр каждый раз? Другими словами, почему бы не делать их статическими. У вас не будет код экземпляра повторяется. Что бы очистить вещи чрезвычайно.

Вариант 2:
Если классы должны быть созданы в любое время, я буду думать о реализации 2 модели: завод & команды

...Есть много примеров в интернете, и вникая в специфику проекта.

Используя обе эти модели будут двигаться реализацию из вашей логики пользовательского интерфейса для бизнес-ориентированных слоя. Например, я верю, что вы могли бы достичь чего-то в таком виде:

Dim cl as IDataClass = DataClassFactory.CreateDataClass(ddl1.SelectedValue);

Dim results as DataTable = cl.GetClassNames()

GridView1.DataSource = results
GridView1.DataBind()

По сути, в каждой кнопки события click, вы создадите IDataClass производные ClassZero, ClassOne, ClassTwo.

IDataClass определяет метод GetClassNames (), что суб-классы будут осуществлять независимые друг от друга.

0
ответ дан 17 августа 2011 в 08:08 Источник Поделиться