Sni.DelWoods Ответов: 3

(Решено) сплит (VB).Чистый класс в подводные лодки


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

Класс происхождения (псевдо)
Public Class MyBigClass()
    Public myData As New DataSet()

    Public Sub InitMyData()
        '...Build Dataset from database and custom data
        myData = New DataSet("dummy")
    End Sub

    Public Sub DoCheck()
        If myData.Tables(0).Rows(0)("checkField").ToString() = "123" Then
            myData.Tables(0).Rows(0)("checkField").ToString() = "456"
        End If
    End Sub
    
    Public Sub SaveToDatabase()
        myData = Nothing
    End Sub
End Class


Текущий вызов класса
Dim MyClass As New MyBigClass()
MyBigClass.InitMyData()
MyBigClass.DoCheck()
MyBigClass.SaveToDataBase()


Хотел структуре вызовов
Dim MyClass As New MyBigClass()
MyBigClass.DataAccess.InitMyData()
MyBigClass.CheckFunctions.DoCheck()
MyBigClass.DataAccess.SaveToDataBase()


Что я уже пробовал:

На самом деле я понятия не имею, как разделить класс на описательные сегменты.
Есть какие-нибудь предложения или закономерности?

В прошлом я использовал набор данных (или базовый класс) в качестве параметра для подклассов, но я думаю, что лучше всего было бы избежать этого.

Public Class MyBigClass()
    Public myData As New DataSet
    Public DataAccess As _DataAccess() = Nothing

    Public Sub Init()
        DataAccess = New DataAccess(myData)
    End Sub

    Public Class _DataAccess()
        Public myData As New DataSet

        Public Sub New(ByRef myData2use As DataSet)
            myData = myData2use
        End Sub
    End Class
End Class

3 Ответов

Рейтинг:
5

Sni.DelWoods

Отличное решение для вложенных классов:
Мне не нужно заботиться о наборе данных - он идеально относится к базовому классу.
Таким образом, из подклассов у меня есть полный доступ ко всем методам базы, и она разбита на функциональные группы.

Мое решение

Public Class MyBigClass
    Public MyData As New DataSet
    Public DataAccess As New DataAccess(Me)

    Public Class _DataAccess 'must be Public due to self reference 
        Private _MyBigClass As MyBigClass = Nothing

        Sub New(ByRef MyBigClass2use As MyBigClass)
            _MyBigClass = MyBigClass2use
        End Sub
    End Class
End Class


Рейтинг:
2

CPallini

Смотреть также Что не следует делать: анти-паттерны и решения[^] (из нашего Сандер Россель) - The God Object раздел.


Рейтинг:
1

OriginalGriff

Ну, вы могли бы вложить классы:

Public Class MyBigClass
   Public Class DataAccess
      ...
   End Class
   Public Class CheckFunctions
      ...
   End Class
   ...
End Class
Или даже вложить их и использовать Partial, чтобы разделить их на отдельные файлы:
Public Partial Class MyBigClass
   Public Class DataAccess
      ...
   End Class
   ...
End Class


CPallini

5.

Sni.DelWoods

Это основная идея.
Я уже разделил класс на частичный класс и разные файлы (MyBigClass.Доступа к данным.ВБ)

Но как я могу получить доступ к объекту myData в MyBigClass frm класса DataAccess?
Я добавил пример моего текущего решения. Я думаю, что должен быть лучший образец для этого....

OriginalGriff

Вы сказали, что это глобально: они доступны для всех классов.
Если это не так, то у вас есть два варианта:
1) Если есть только один экземпляр, то общий-это путь.
2) Если существует экземпляр для каждого экземпляра класса MyBigClass, то вам придется передать этот экземпляр подклассу, когда он ему понадобится.

Sni.DelWoods

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