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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
23
0
4 159
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

Enrico Campidoglio 21.10.2008 19:57

Возможно, но эти люди переходят с VB6 - вы действительно хотите одновременно провести модульное тестирование?

Carl 21.10.2008 19:59

ДА!!!!

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

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

добавлен

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

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

Хммм - может, стоит подумать о включении Option Strict?!?

MarkJ 09.06.2009 18:25

Да, я бы стал, но в моем текущем проекте исправление всех ошибок путем строгого включения параметров, вероятно, займет месяцы.

Kibbee 10.06.2009 02:55

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

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

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

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

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

Rob Allen 21.10.2008 20:26

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

Enrico Campidoglio 21.10.2008 22:30
Ответ принят как подходящий

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

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

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

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

«У каждого Dim и Function должен быть объявлен явный тип, соответствующий им». - Нет! На помощь приходит Option Infer On (правда, только для Dim).

Konrad Rudolph 21.10.2008 20:26

Хороший момент: я все еще застрял в .Net 2.0. Вы можете нарушить это правило для таких вещей, как выражения LINQ в более поздних версиях.

Joel Coehoorn 21.10.2008 20:28

Кроме того, ваше первое обоснование неверно: среда выполнения VB6 не вызывается! Звонки могут быть избыточными и плохого стиля (непоследовательными), но определенно не злыми. У некоторых даже есть ощутимые преимущества (например, MsgBox).

Konrad Rudolph 21.10.2008 20:28

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

Joel Coehoorn 21.10.2008 20:39

Хорошие моменты! Да, моя самая большая проблема в этом классе действительно состоит в том, чтобы научить их, прежде всего, концепциям объектно-ориентированного программирования. Тот факт, что они могут сохранить тот же синтаксис языка, к которому они привыкли, является незначительной роскошью.

Enrico Campidoglio 21.10.2008 22:43

Вместо того, чтобы говорить им не использовать функции совместимости, попросите их удалить глобальный импорт Microsoft.VisualBasic. Они по-прежнему могут использовать старые функции, вводя полное пространство имен, но это отнимает много времени и уродливо. Хороший способ сделать использование старых вещей дорогостоящим.

Craig Gidney 12.04.2010 18:15

На мой взгляд, не совсем ответил на вопрос. Без option strict компилятор выполнит преобразования за вас, так зачем вообще добавлять их явно и везде нужно добавлять около 5% дополнительного кода? Это то, что необходимо для языков C-типа, но для VB.net я действительно не вижу преимущества. Явной опции должно быть достаточно, чтобы обратиться к вам с указанием объявления типов.

yu_ominae 18.12.2012 06:39

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

Вариант Явный Вариант Строгий

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

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

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

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

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

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

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

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

Другие вопросы по теме