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





Время, потраченное на разработку с включением Option Strict, в дальнейшем значительно сэкономит вам время на отладку.
Возможно, но эти люди переходят с VB6 - вы действительно хотите одновременно провести модульное тестирование?
ДА!!!!
На мой взгляд, и как разработчик, и как преподаватель ДА.
Лучше всего с самого начала выработать хорошие привычки, это значительно упрощает весь процесс, и Option Strict - один из тех элементов, которые, на мой взгляд, НЕОБХОДИМЫ.
добавлен
Существует буквально масса причин, по которым можно было бы перечислить почему, но главное в том, что это лучшая практика, а при обучении новому языку важно обучать этим лучшим практикам с самого начала.
Если вы привыкли проверять свои типы, то вам, вероятно, захочется, чтобы опция была строго включена. ее отключение может иметь преимущества, но если ваш мозг не настроен на обнаружение ошибок, на которые компилятор обычно жалуется, то я бы посоветовал оставить его включенным. Я много работал в VB.Net, и должен сказать, что, хотя большую часть времени я работаю со строгим отключением параметров, я видел множество ситуаций, когда его включение предотвратило бы довольно много ошибки.
Хммм - может, стоит подумать о включении Option Strict?!?
Да, я бы стал, но в моем текущем проекте исправление всех ошибок путем строгого включения параметров, вероятно, займет месяцы.
Очевидно, что Option Strict не может заменить хорошее модульное тестирование - но не наоборот. Хотя модульное тестирование может обнаруживает те же ошибки, что и Option Strict, это означает, что в модульных тестах нет ошибок, что модульное тестирование выполняется часто и раньше и т. д.
Написание хороших модульных тестов не всегда тривиально и требует времени. Однако компилятор уже реализует некоторые тесты - в виде проверки типов. По крайней мере, это экономит время. Скорее всего, это сэкономит много время и деньги (по крайней мере, иногда), потому что ваши тесты были ошибочными / не охватывали все случаи / забыли учесть изменения в коде.
Подводя итог, нет никакой гарантии, что ваши модульные тесты верны. С другой стороны, есть надежная гарантия, что проверка типов, выполняемая компилятором, правильная или, по крайней мере, что его сбои (непроверенная ковариация массива, ошибки с циклическими ссылками…) хорошо известны и хорошо задокументированы.
Еще один итог: Да, Option Strict On определенно лучший вариант. На самом деле, я годами работал в онлайн-сообществах, подобных этому. Всякий раз, когда кому-то требовалась помощь по коду, который явно не включал Option Strict, мы вежливо указывали на это и отказывались оказывать дальнейшую помощь, пока это не будет исправлено. Это экономит так много времени. Часто после этого проблема исчезла. Это в некоторой степени аналогично использованию правильного HTML при обращении за помощью на форуме поддержки HTML: недопустимый HTML может работать, но опять же, он может и не быть причиной проблем. Поэтому многие профессионалы отказываются помогать.
Отличный ответ. Единственное, что я хотел бы добавить, это установить предупреждения, которые будут обрабатываться как ошибки во время компиляции. Кроме того, при разработке веб-сайтов я установил наиболее строгий уровень совместимости (в настоящее время - doctype XHTML 1.1) по той же причине.
Согласовано. Дополнительная многословность в коде из-за явного приведения переменных несравнима с огромным количеством времени, сэкономленным за счет того, что компилятор сделает свою работу. Спасибо за отличный ответ!
Да! Option Strict определенно является лучшей практикой для .Net. Подчеркните, что .Net по своей сути является строго типизированной платформой и будет оставаться до тех пор, пока DLR не будет полностью поддерживаться. За некоторыми исключениями, для каждого Dim и Function должен быть объявлен явный тип, соответствующий им. Такие вещи, как LINQ или Boo и JScript, являются исключениями, подтверждающими правило.
Вот еще несколько моментов, на которые стоит обратить внимание. Я уверен, что вы хорошо обо всем этом знаете, но мне приходилось работать и поддерживать много кода VB.Net, написанного бывшими VB6ers, и поэтому это что-то вроде больного места для меня:
LEN(), REPLACE(), TRIM() и т. д.oMyObject и sMyString не кошерные. Покажите им ссылку в Рекомендации Microsoft по дизайну, если они вам не верят.AndAlso / OrElse.CreateObject().IEnumeralbe(Of T)), и узнают, почему они никогда не должны снова использовать ArrayList.Я мог бы продолжить, но я просто укажу вам на вопрос Скрытые возможности VB.Net, чтобы завершить эту тираду.
«У каждого Dim и Function должен быть объявлен явный тип, соответствующий им». - Нет! На помощь приходит Option Infer On (правда, только для Dim).
Хороший момент: я все еще застрял в .Net 2.0. Вы можете нарушить это правило для таких вещей, как выражения LINQ в более поздних версиях.
Кроме того, ваше первое обоснование неверно: среда выполнения VB6 не вызывается! Звонки могут быть избыточными и плохого стиля (непоследовательными), но определенно не злыми. У некоторых даже есть ощутимые преимущества (например, MsgBox).
Я пошел искать, пытаясь найти, где я читал о вызове MS.VB.dll в старую среду выполнения, и я не смог его найти, поэтому я просто полностью удалил ссылку.
Хорошие моменты! Да, моя самая большая проблема в этом классе действительно состоит в том, чтобы научить их, прежде всего, концепциям объектно-ориентированного программирования. Тот факт, что они могут сохранить тот же синтаксис языка, к которому они привыкли, является незначительной роскошью.
Вместо того, чтобы говорить им не использовать функции совместимости, попросите их удалить глобальный импорт Microsoft.VisualBasic. Они по-прежнему могут использовать старые функции, вводя полное пространство имен, но это отнимает много времени и уродливо. Хороший способ сделать использование старых вещей дорогостоящим.
На мой взгляд, не совсем ответил на вопрос. Без option strict компилятор выполнит преобразования за вас, так зачем вообще добавлять их явно и везде нужно добавлять около 5% дополнительного кода? Это то, что необходимо для языков C-типа, но для VB.net я действительно не вижу преимущества. Явной опции должно быть достаточно, чтобы обратиться к вам с указанием объявления типов.
Помните, что здесь два уровня.
Вариант Явный Вариант Строгий
Основное различие между ними заключается в том, что 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 как способ помочь избежать ошибок и последующих исправлений глубоко «во время разработки».
Я согласен. Но разве нельзя снизить этот риск, грамотно используя модульное тестирование, например, для динамических языков?