Option Strict On и .NET для программистов VB6

Я готовлю курс по Visual Basic 2005, ориентированный на программистов Visual Basic 6, переходящих на платформу .NET.

Я хотел бы получить совет о том, рекомендовать ли им всегда включать Option Strict или нет.

Я работал исключительно с языками программирования в стиле C, в основном с Java и C #, поэтому для меня явное приведение - это то, чего я всегда ожидал. необходимо сделать, так как это никогда не было вариантом.
Однако я признаю ценность работы с языком, который имеет встроенную поддержку позднего связывания, потому что не нужно быть чрезмерно явным насчет типов в коде действительно экономит время. Это дополнительно подтверждается популярным распространением языков с динамической типизацией даже на платформе .NET с динамической языковой средой выполнения.

Имея это в виду, следует поощрять кого-то, кто впервые приближается к .NET с использованием VB.NET и с опытом работы с VB6, понять, что приходится работать с временем компиляции проверка типа, потому что это «лучшая практика» в среде CLR? Или можно продолжать пользоваться преимуществами позднего связывания?


person Enrico Campidoglio    schedule 21.10.2008    source источник


Ответы (8)


Да! Option Strict определенно является лучшей практикой для .Net. Подчеркните, что .Net по своей сути является строго типизированной платформой и будет таковой до тех пор, пока DLR не будет полностью поддерживаться. За некоторыми исключениями, для каждого Dim и Function должен быть объявлен явный тип, соответствующий им. Такие вещи, как LINQ или Boo и JScript, являются исключениями, подтверждающими правило.

Вот еще несколько моментов, на которые стоит обратить внимание. Я уверен, что вам все это хорошо известно, но мне приходилось работать и поддерживать много кода VB.Net, написанного бывшими VB6ers, так что это что-то вроде больного места для меня:

  • Не используйте старые строковые функции: LEN(), REPLACE(), TRIM() и т. Д.
  • Венгерские бородавки больше не рекомендуются. oMyObject и sMyString не кошерные. Если они не верят, покажите им ссылку в Рекомендациях Microsoft по дизайну ты.
  • Убедитесь, что они узнали о новых _8 _ / _ 9_ логических операторах.
  • ПАРАМЕТРИЗОВАННЫЕ ЗАПРОСЫ и современный ADO.Net. Не могу этого достаточно подчеркнуть. Им больше никогда не придется звонить CreateObject().
  • Область видимости работает в .Net по-другому (и это более важно), чем в VB6. В VB.Net все еще есть модули, но теперь они больше похожи на статический класс. Важно понимать, чем отличается разработка в реальной объектно-ориентированной среде, в отличие от частичной поддержки ООП, предоставляемой VB6. Больше нет веской причины позволять методам работать до безбожной длины.
  • Убедитесь, что они получили введение в Generics и Interfaces (включая IEnumeralbe(Of T)), и узнают, почему они никогда не должны снова использовать ArrayList.

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

person Joel Coehoorn    schedule 21.10.2008
comment
«У каждого Dim и Function должен быть объявлен явный тип, соответствующий им». - Нет! Option Infer On на помощь (правда, только для Dims). - person Konrad Rudolph; 21.10.2008
comment
Хороший момент: я все еще застрял в .Net 2.0. Вы можете нарушить это правило для таких вещей, как выражения LINQ в более поздних версиях. - person Joel Coehoorn; 21.10.2008
comment
Кроме того, ваше первое обоснование неверно: среда выполнения VB6 не вызывается! Звонки могут быть избыточными и плохого стиля (непоследовательными), но определенно не злыми. Некоторые даже имеют ощутимые преимущества (например, MsgBox). - person Konrad Rudolph; 21.10.2008
comment
Я пошел искать, пытаясь найти, где я читал о вызове MS.VB.dll в старую среду выполнения, и я не смог его найти, поэтому я просто полностью удалил ссылку. - person Joel Coehoorn; 21.10.2008
comment
Хорошие моменты! Да, моя самая большая проблема в этом классе действительно состоит в том, чтобы научить их, прежде всего, концепциям объектно-ориентированного программирования. Тот факт, что они могут сохранить тот же синтаксис языка, к которому они привыкли, является незначительной роскошью. - person Enrico Campidoglio; 21.10.2008
comment
Вместо того, чтобы говорить им не использовать функции совместимости, попросите их удалить глобальный импорт Microsoft.VisualBasic. Они по-прежнему могут использовать старые функции, вводя полное пространство имен, но это отнимает много времени и уродливо. Хороший способ удешевить использование старых вещей. - person Craig Gidney; 12.04.2010
comment
На мой взгляд, не совсем ответил на вопрос. Без option strict компилятор выполнит преобразования за вас, так зачем вообще добавлять их явно и везде нужно добавлять около 5% дополнительного кода? Это то, что необходимо для языков C-типа, но для VB.net я действительно не вижу преимущества. Явной опции должно быть достаточно, чтобы обратиться к вам с указанием объявления типов. - person yu_ominae; 18.12.2012

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

person Ilya Kochetov    schedule 21.10.2008
comment
Я согласен. Но разве нельзя снизить этот риск, грамотно используя модульное тестирование, например, для динамических языков? - person Enrico Campidoglio; 21.10.2008
comment
Возможно, но эти люди переходят с VB6 - вы действительно хотите одновременно провести модульное тестирование? - person Carl; 21.10.2008

Option Strict очевидно, не может заменить хорошее модульное тестирование - но не наоборот. Хотя модульное тестирование может обнаруживать те же ошибки, что и Option Strict, это означает, что в модульных тестах нет ошибок, что модульное тестирование выполняется часто и рано и т. Д.

Написание хороших модульных тестов не всегда тривиально и требует времени. Однако компилятор уже реализует некоторые тесты - в виде проверки типов. По крайней мере, это экономит время. Скорее всего, это сэкономит много времени и денег (по крайней мере, иногда), потому что ваши тесты были ошибочными / не охватывали все случаи / забыли учесть изменения в коде.

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

Подведем еще один итог: Да, Option Strict On, безусловно, лучшая практика. На самом деле, я годами работал в онлайн-сообществах, подобных этому. Когда кому-то требовалась помощь по коду, для которого явно не было Option Strict включено, мы вежливо указывали на это и отказывались оказывать дальнейшую помощь, пока это не будет исправлено. Это экономит так много времени. Часто после этого проблема исчезла. Это в некоторой степени аналогично использованию правильного HTML при обращении за помощью на форуме поддержки HTML: недопустимый HTML может работать, но опять же, он может не работать и быть причиной проблем. Поэтому многие профессионалы отказываются от помощи.

person Konrad Rudolph    schedule 21.10.2008
comment
Отличный ответ. Единственное, что я хотел бы добавить, это установить предупреждения, которые будут обрабатываться как ошибки во время компиляции. Кроме того, при разработке веб-сайтов я установил наиболее строгий уровень совместимости (в настоящее время - doctype XHTML 1.1) по той же причине. - person Rob Allen; 21.10.2008
comment
Согласованный. Излишняя многословность кода из-за явного приведения переменных несравнима с огромным количеством времени, сэкономленным за счет предоставления компилятору возможности выполнять свою работу. Спасибо за отличный ответ! - person Enrico Campidoglio; 21.10.2008

ДА!!!!

На мой взгляд, и как разработчик, и как преподаватель ДА.

Лучше всего с самого начала выработать хорошие привычки, это значительно упрощает весь процесс, и Option Strict - один из тех элементов, которые, на мой взгляд, НЕОБХОДИМЫ.

добавлено

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

person Mitchel Sellers    schedule 21.10.2008

Помните, что здесь два уровня.

Параметр Явный Параметр Строгий

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

Я использую VB с версии 1.0, и, хотя я понимаю суть этого, я думаю, что Strict особенно усердно работает с объектами, которые реализовали или унаследовали разные интерфейсы и классы.

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

За годы работы с VB я в значительной степени использовал Double для всех переменных с плавающей запятой. Таким образом вы избежите многих проблем с округлением и потерей точности. В VB6 я использовал до тех пор, пока это было 32-битное целое число, но Integer работает в .NET так же хорошо, как и с Int32. Я также рекомендую использовать Int32, Int16 и т. Д. Вместо Integer, Long и т. Д. На случай, если Microsoft когда-либо решит переопределить эти ключевые слова.

person RS Conley    schedule 21.10.2008

Я собираюсь не согласиться с RS Conley (очень необычно). Мои любимые гуру VB6 - Франческо Балена, Дэн Эпплман - всем не нравилось автоматическое преобразование VB6, и они в пользу Option Strict в .NET. Многие опытные программисты VB6 знают автоматическое преобразование как «принуждение злого типа» (pdf) и будет рад включить Option Strict.

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

person MarkJ    schedule 09.06.2009

Учитывая представление Боэма о том, что устранение проблемы на более раннем этапе цикла разработки требует наименьших затрат ресурсов, я поклонник любого инструмента, который помогает разработчикам «сделать все правильно» как можно раньше. По этой причине я сторонник таких вещей, как IntelliSense, который является одновременно средством повышения эффективности и инструментом, который помогает вам реализовать рабочий код на более ранних этапах цикла. (Работает, но не обязательно правильно.)

По этой причине я также поддерживаю использование Option Strict как способ помочь избежать ошибок и последующих исправлений «во время разработки».

person adengle    schedule 12.04.2010

Если вы привыкли проверять свои типы, то, вероятно, захотите, чтобы опция была строго включена. ее отключение может иметь преимущества, но если ваш мозг не настроен на обнаружение ошибок, на которые компилятор обычно жалуется, то я бы посоветовал оставить его включенным. Я много работал с VB.Net, и должен сказать, что, хотя большую часть времени я работаю со строгим отключением параметров, я видел множество ситуаций, когда его включение предотвратило бы довольно много ошибки.

person Kibbee    schedule 21.10.2008
comment
Хммм - может, стоит подумать о включении Option Strict?!? - person MarkJ; 09.06.2009
comment
Да, я бы стал, но в моем текущем проекте исправление всех ошибок путем строгого включения параметров, вероятно, займет месяцы. - person Kibbee; 10.06.2009