Какова наилучшая практика для свойств / функций ReadOnly в VB.Net? - PullRequest
0 голосов
/ 28 сентября 2010

Я не слишком новичок в VB.Net и его синтаксисе, но я не эксперт.Я работаю над тем, чтобы переписать что-то в VB, которое раньше было в C #, и в то время как я делал это, я столкнулся с «дилеммой».У меня может быть свойство ReadOnly:

Public ReadOnly Property MaximumIndenture()
    Get
        Try
            'If the connection is closed, open it.'
            If _dbConnection.State = ConnectionState.Closed Then
                _dbConnection.Open()
            End If

            Dim dictFigureIndenture As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)
            Using dbReader As IDataReader = ExecuteReader("SELECT PART_FIGURE, MAX(PART_INDENTURE) AS 'MAX_INDENT' FROM PARTS GROUP BY PART_FIGURE")
                While dbReader.Read()
                    dictFigureIndenture.Add(dbReader("PART_FIGURE").ToString(), Convert.ToInt32(dbReader("MAX_INDENT").ToString()))
                End While
            End Using

            'If the connection is open, do what you need to and/or close it.'
            If _dbConnection.State = ConnectionState.Open Then
                _dbConnection.Close()
            End If

            Return dictFigureIndenture
        Catch ex As Exception
            'An exception was thrown.  Show it to the user so they can report it.'
            MessageBox.Show(ex.Message)

            'If the connection is open, do what you need to and/or close it.'
            If _dbConnection.State = ConnectionState.Open Then
                _dbConnection.Close()
            End If

            Return Nothing
        End Try
    End Get
End Property

И у меня может быть функция, которая делает то же самое:

Public Function MaximumIndenture() As Integer
    Try
        'If the connection is closed, open it.'
        If _dbConnection.State = ConnectionState.Closed Then
            _dbConnection.Open()
        End If

        Dim dictFigureIndenture As Dictionary(Of String, Integer) = New Dictionary(Of String, Integer)
        Using dbReader As IDataReader = ExecuteReader("SELECT PART_FIGURE, MAX(PART_INDENTURE) AS 'MAX_INDENT' FROM PARTS GROUP BY PART_FIGURE")
            While dbReader.Read()
                dictFigureIndenture.Add(dbReader("PART_FIGURE").ToString(), Convert.ToInt32(dbReader("MAX_INDENT").ToString()))
            End While
        End Using

        'If the connection is open, do what you need to and/or close it.'
        If _dbConnection.State = ConnectionState.Open Then
            _dbConnection.Close()
        End If

        Return dictFigureIndenture
    Catch ex As Exception
        'An exception was thrown.  Show it to the user so they can report it.'
        MessageBox.Show(ex.Message)

        'If the connection is open, do what you need to and/or close it.'
        If _dbConnection.State = ConnectionState.Open Then
            _dbConnection.Close()
        End If

        Return Nothing
    End Try
End Function

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

Ответы [ 3 ]

5 голосов
/ 28 сентября 2010

Это определенно должен быть метод, а не свойство.

Свойство обычно содержит легковесную операцию, например, получение значения закрытой переменной и, возможно, простое вычисление или преобразование.То, что извлекает данные из базы данных, определенно не соответствует тому, что обычно ожидается от свойства.

1 голос
/ 28 сентября 2010

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

Ваш код обращается к базе данных, поэтому это должен быть метод.

Из. Руководства по проектированию NET Framework 2-е издание, стр. 135

0 голосов
/ 28 сентября 2010

Я не могу вам пообещать, что это лучшая практика, но я бы сказал, идти с тем, что кажется вам более естественным и имеет больше смысла в реальном мире. Я бы сказал, что MaximumIndenture создаст лучшее свойство, чем функция, потому что мне кажется, что это скорее свойство объекта или существительного, которое ему принадлежит. Я бы использовал функцию, чтобы сделать больше операции или глагола, который имеет некоторый результат. Это мои 2 цента. Надеюсь, это поможет!

...