Когда можно использовать оператор GoTo в VB.Net? - PullRequest
3 голосов
/ 20 февраля 2009

У меня есть процесс, который должен создать кучу записей в базе данных и откатить все назад, если что-то пойдет не так. Что я хочу сделать, это:

Public Structure Result
    Public Success as Boolean
    Public Message as String
End Structure

Private _Repository as IEntityRepository

Public Function SaveOrganization( _
    ByVal organization As rv_o_Organization) As Result
    Dim result = Result.Empty

    _Repository.Connection.Open()
    _Repository.Transaction = _Repository.Connection.BeginTransaction()

    ''//Performs validation then saves it to the database
    ''// using the current transaction
    result = SaveMasterOrganization(organization.MasterOrganization)
    If (Not result.Success) Then
        GoTo somethingBadHappenedButNotAnException
    End If

    ''//Performs validation then saves it to the database
    ''//using the current transaction
    result = SaveOrganziation(dbOrg, organization)
    If (Not result.Success) Then GoTo somethingBadHappenedButNotAnException

somethingBadHappenedButNotAnException:
    _Repository.Transaction.Commit()
    _Repository.Connection.Close()
    Return result
End Sub

Это правильное использование оператора GoTo или просто очень плохой дизайн? Есть ли более элегантное решение? Надеюсь, что этот образец сможет получить точку через

Ответы [ 16 ]

0 голосов
/ 20 февраля 2009

Эх, в VBscript / ASP было приличное использование для обработки ошибок. Мы использовали его, чтобы вернуть обработку ошибок обратно в ASP, как только мы закончили с использованием возобновления ошибки далее.

в .net? Небеса, нет!

0 голосов
/ 20 февраля 2009

Оператор go to имеет тенденцию усложнять понимание программы. Я не помню, чтобы я использовал его в течение последних десяти лет, за исключением Visual Basic 6 в сочетании с «по ошибке».

Насколько я могу судить, вы пользуетесь программой go to, потому что ход программы очень ясен. Я не думаю, что использование try ... catch могло бы значительно улучшить ситуацию, потому что вам нужно было бы выдавать исключения в тех местах, где сейчас идут переходы.

Форматирование, однако, не очень привлекательно: -)

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

0 голосов
/ 20 февраля 2009

Я бы сказал, использовать очень экономно, так как это обычно связано с введением кода спагетти. Попробуйте использовать методы вместо меток.

Я думаю, хорошим примером использования GOTO является создание потока через select, который доступен в C #, но не VB.

0 голосов
/ 20 февраля 2009

Почему бы не обернуть каждый вызов функции в блок try catch, и когда это будет сделано, если выдается одно из ваших исключений, вы можете перехватить его и закрыть соединение. Таким образом, вы полностью избегаете оператора GOTO.

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

0 голосов
/ 20 февраля 2009

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

0 голосов
/ 20 февраля 2009

Каждый раз, когда я видел использованный goto, простой рефакторинг мог с этим справиться. Я бы порекомендовал никогда не использовать его, если вы «не знаете», что вы должны использовать его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...