Как сегодня на восьмом бейсике воспроизвести технологии тридцателетней давности

vbnet2000
Дата: 28.04.2007 13:27:30
Как правильно оптимизировать этот код? У меня много подобных фрагментов. Как видите, алгоритм абсолютно одинаков, но просто происходит обращение к РАЗНЫМ свойствам обьектов.

    'Рекурсивный обход дерева в поисках нужного тега
    Private Function GetNodesForTag(ByVal StartNode As System.Web.SiteMapNode, ByVal TableIndex As Integer) As System.Web.SiteMapNode
        If StartNode.ResourceKey = TableIndex Then Return StartNode
        If StartNode.ChildNodes IsNot Nothing Then
            For Each X As System.Web.SiteMapNode In StartNode.ChildNodes
                If X.ResourceKey = TableIndex Then
                    Return X
                Else
                    GetNodesForTag(X, TableIndex)
                End If
            Next
        End If
    End Function

    'Рекурсивный обход дерева в поисках нужного URL
    Private Function GetNodesForURL(ByVal StartNode As System.Web.SiteMapNode, ByVal URL As String) As System.Web.SiteMapNode
        If StartNode.URL = URL Then Return StartNode
        If StartNode.ChildNodes IsNot Nothing Then
            For Each X As System.Web.SiteMapNode In StartNode.ChildNodes
                If X.Url = URL Then
                    Return X
                Else
                    GetNodesForURL(X, URL)
                End If
            Next
        End If
    End Function

Я начинал программировать еще 29 лет назад на великолепном языке - макроассемблер. И в нем я бы реализовал этот единый алгоритм так:


Search Macro &Pref, &Property, &Type
   Private Function GetNodesFor&PrefL(ByVal StartNode As System.Web.SiteMapNode, ByVal URL As &Type) As System.Web.SiteMapNode
        If StartNode.&Property = URL Then Return StartNode
        If StartNode.ChildNodes IsNot Nothing Then
            For Each X As System.Web.SiteMapNode In StartNode.ChildNodes
                If X.&Property = URL Then
                    Return X
                Else
                    GetNodesFor&Pref(X, URL)
                End If
            Next
        End If
    End Function
End  Macro

потом породил бы эти обе функции вот так:

Search "Tag", "ResourceKey",  "Integer"
Search "URL", "URL",  "String"

А как именно написать сегодня из такой функции Дженерик, который бы реализовал ЕДИНЫЙ алгоритм со строгой проверкой типа?
Теперь, на этапе компиляции это уже сделать невозможно (ну без невыносимого гимороя).
Ну хотя бы на этапе исполнения как ИМЕННО это сделать? Поскажите, плиз.
Нахлобуч
Дата: 28.04.2007 13:36:54
Делегаты спасут отца русской демократии. Если в VB додумались до анонимных делегатов -- то еще лучше.
vbnet2000
Дата: 28.04.2007 13:59:29
Да... Наверное... Делегаты это в принципе вариант - но насколько он УБОГИЙ по сравнению с тридцателетней давности технологиями от IBM. Или вы несогласны?

По-моему они умножают на ноль всю легкость, крастоту и изящество решений тридцателетней давности и превратят этот код в неудобовариемое месиво.

Кстати и с делегатами тут тоже проблема. Если бы тип его был один - это одно. Но я же хочу чтобы было ДВА его различных типа. Причем со строгой типизацией.

Насколько я понимаю, такое реализуется только Дженериками. Я хочу научиться писать их - но пока не освоил эту технику. В смысле СВОИ ПИСАТЬ, а не ПРИМЕНЯТЬ пяток встроенных дженериков. Учитываю IQ некоторых членов этой тусовки - думаю последняя оговорка оправдана.
Last_Alien (v.6.1.)(local)
Дата: 28.04.2007 14:09:40
вбнет2000 - это явно какойта приколист!
Нахлобуч
Дата: 28.04.2007 14:15:29
vbnet2000
Делегаты это в принципе вариант - но насколько он УБОГИЙ по сравнению с тридцателетней давности технологиями от IBM. Или вы несогласны?

По-моему они умножают на ноль всю легкость, крастоту и изящество решений тридцателетней давности и превратят этот код в неудобовариемое месиво.

Не согласны/не превращают:
string requiredResourceKey = "...";
SiteMapNode resourceKeyNamedSiteMapNode = SiteMapNodeTraversal(rootSiteMapNode,
    delegate(SiteMapNode siteMapNode) 
    { 
        return siteMapNode.ResourceKey == requiredResourceKey; 
    });

string requiredUrl = "...";
SiteMapNode urlNamedSiteMapNode = SiteMapNodeTraversal(rootSiteMapNode,
    delegate(SiteMapNode siteMapNode) 
    { 
        return siteMapNode.Url == requiredUrl ; 
    });  

vbnet2000

Кстати и с делегатами тут тоже проблема. Если бы тип его был один - это одно. Но я же хочу чтобы было ДВА его различных типа. Причем со строгой типизацией.


Беспредметный разговор. Будет проблема -- будем решать.
BlackTigerAP
Дата: 28.04.2007 14:30:54
"Last_Alien (v.6.1.)(local)":
вбнет2000 - это явно какойта приколист!


По-моему он просто копи-пастит откуда-то всякую чушь... Типа "топ самых глупых вопросах на форумах".

And God Said "Let us make man in our image. In our likeness."
| Мой Brainbench | BookReader 1.1 | Wallpaper Cycler |

vbnet2000
Дата: 29.04.2007 09:54:06
Если чесно, шарповский синтаксис с делегатами я не понимаю. Кто-нибудь может это все на VB показать?

И потом - разве это единственный подход? Что свои дженерики делать невозможно?

Для примера возьмем вот такой мой код. Как видите, в нем есть крошечные различия. В jlzjv речь идет о WEB-дереве, в другом о WIN-дереве.

В технологиях тридцатилетней давности это крошечное различие делалось МАКРОСОМ. Те меняется стурктура базы или каких-то ключей - меняем макрос.
И все работает. Не понимаю как из ЭТИХ ДВУХ ПРОГРАММ СДЕЛАТЬ ОДНУ СЕЙЧАС.

Заметьте, я не утверждаю, что MS так уложнила и испохабила элементарные принципы программирования - я просто говорю - я не понимаю как сделать правильно.
Обясните мне кто-нибудь. Желательно на VB и на этих моих живых примерах. Чтобы до меня дошло - как именно можно заменить обычный МАКРОС?
    Shared Sub FillTree(ByVal CurrentTovar As WorkingTovar, ByRef Tv1 As System.Web.UI.WebControls.TreeView)
        For i As Integer = 0 To CurrentTovar.PriceDS.MyBlock.Count - 1
            Dim X As New TreeNode
            X.SelectAction = TreeNodeSelectAction.Expand
            X.Text = CurrentTovar.PriceDS.MyBlock(i).Gname
            X.Value = "MyBlock_i=" & CurrentTovar.PriceDS.MyBlock(i).i.ToString
            For j As Integer = 0 To CurrentTovar.PriceDS.MyFieldsList.Count - 1
                If CurrentTovar.PriceDS.MyFieldsList(j).ToBlock = CurrentTovar.PriceDS.MyBlock(i).i Then
                    For k As Integer = 0 To CurrentTovar.PriceDS.MyFields.Count - 1
                        If CurrentTovar.PriceDS.MyFields(k).i = CurrentTovar.PriceDS.MyFieldsList(j).ToFields Then
                            Dim Y As New TreeNode
                            Y.SelectAction = TreeNodeSelectAction.Expand
                            Y.Text = CurrentTovar.PriceDS.MyFields(k).Fname & " : "
                            For l As Integer = 0 To CurrentTovar.PriceDS.MyValueList.Count - 1
                                If CurrentTovar.PriceDS.MyValueList(l).ToFields = CurrentTovar.PriceDS.MyFieldsList(j).ToFields Then
                                    For m As Integer = 0 To CurrentTovar.PriceDS.MyValue.Count - 1
                                        If CurrentTovar.PriceDS.MyValue(m).i = CurrentTovar.PriceDS.MyValueList(l).ToValue Then
                                            Try
                                                Y.Text &= CurrentTovar.PriceDS.MyValue(m).VValue
                                                Y.Value = "MyBlock_i=" & CurrentTovar.PriceDS.MyBlock(i).i.ToString & ",MyFields_i=" & CurrentTovar.PriceDS.MyFields(k).i.ToString & ",MyValue_I=" & CurrentTovar.PriceDS.MyValue(m).i.ToString
                                            Catch n As System.Data.StrongTypingException
                                            End Try
                                        End If
                                    Next
                                End If
                            Next
                            X.ChildNodes.Add(Y)
                        End If
                    Next
                End If
            Next
            Tv1.Nodes.Add(X)
        Next
    End Sub
    Shared Sub FillTree(ByVal CurrentTovar As WorkingTovar, ByRef Tv1 As System.Windows.Forms.TreeView)
        For i As Integer = 0 To CurrentTovar.PriceDS.MyBlock.Count - 1
            Dim X As New System.Windows.Forms.TreeNode
            X.Text = CurrentTovar.PriceDS.MyBlock(i).Gname
            X.Name = "MyBlock_i=" & CurrentTovar.PriceDS.MyBlock(i).i.ToString
            For j As Integer = 0 To CurrentTovar.PriceDS.MyFieldsList.Count - 1
                If CurrentTovar.PriceDS.MyFieldsList(j).ToBlock = CurrentTovar.PriceDS.MyBlock(i).i Then
                    For k As Integer = 0 To CurrentTovar.PriceDS.MyFields.Count - 1
                        If CurrentTovar.PriceDS.MyFields(k).i = CurrentTovar.PriceDS.MyFieldsList(j).ToFields Then
                            Dim Y As New System.Windows.Forms.TreeNode
                            Y.Text = CurrentTovar.PriceDS.MyFields(k).Fname & " : "
                            For l As Integer = 0 To CurrentTovar.PriceDS.MyValueList.Count - 1
                                If CurrentTovar.PriceDS.MyValueList(l).ToFields = CurrentTovar.PriceDS.MyFieldsList(j).ToFields Then
                                    For m As Integer = 0 To CurrentTovar.PriceDS.MyValue.Count - 1
                                        If CurrentTovar.PriceDS.MyValue(m).i = CurrentTovar.PriceDS.MyValueList(l).ToValue Then
                                            Try
                                                Y.Text &= CurrentTovar.PriceDS.MyValue(m).VValue
                                                Y.Name = "MyBlock_i=" & CurrentTovar.PriceDS.MyBlock(i).i.ToString & ",MyFields_i=" & CurrentTovar.PriceDS.MyFields(k).i.ToString & ",MyValue_I=" & CurrentTovar.PriceDS.MyValue(m).i.ToString
                                            Catch n As System.Data.StrongTypingException
                                            End Try
                                        End If
                                    Next
                                End If
                            Next
                            X.Nodes.Add(Y)
                        End If
                    Next
                End If
            Next
            Tv1.Nodes.Add(X)
        Next
    End Sub
vbnet2000
Дата: 30.04.2007 10:35:34
UP
vbnet2000
Дата: 02.05.2007 13:22:54
Ну этот вопрос повисшим я оставить никак не могу. Ответ на него проясняет очень многие вещи.
В данном случае - на обычных технологиях тридцатилетней давности эта прога реализуется элементарно. На скрине видны крошечные отличия этих двух прог - это две лишние строки, один ключик и один тип данных в параметрах.

Но как из этих двух прог ОДНУ сделать в NET FRAMEWORK 2 ? Не могу поверить, что сегодняшние технологии настолько отстойные. Скорее я просто не вижу решения...
Право имеющий
Дата: 02.05.2007 13:36:56
vbnet2000
Ну этот вопрос повисшим я оставить никак не могу. Ответ на него проясняет очень многие вещи.
В данном случае - на обычных технологиях тридцатилетней давности эта прога реализуется элементарно. На скрине видны крошечные отличия этих двух прог - это две лишние строки, один ключик и один тип данных в параметрах.

Но как из этих двух прог ОДНУ сделать в NET FRAMEWORK 2 ? Не могу поверить, что сегодняшние технологии настолько отстойные. Скорее я просто не вижу решения...

Красиво!