VB6 имеет неисправную систему - на самом деле он имеет две системы типов, которые не полностью совместимы. Архитектурно, VB4-6 представляют собой довольно тонкую оболочку поверх COM и используют систему типа COM. Предыдущие версии VB имели собственную систему типов, которая была своего рода перекрестком между традиционными BASIC и C. Эти два не могут быть свободно перемешаны и сопоставлены.
Наследование отсутствует и нет реальной обработки исключений, поэтому ожидайте написать много шаблонов кода для обработки ошибок и повторения функций базовой формы снова и снова. Именно здесь VB получает свою репутацию в области разработки программного обеспечения для вырезания и вставки.
Некоторые из типов, которые вы можете объявить в VB, не являются «совместимыми с автоматизацией», что означает, что они не могут быть сериализованы по границе COM или сохранены в варианте (подробнее об этом позже). Эти типы относятся к периодам до VB4-6, когда VB не поддерживает COM. Один из этих типов - это запись (типа c struct), чье имя ускользает от меня, поэтому расширяемая коллекция или ассоциативный массив структур (что естественно, что можно сделать) невозможно. Определение класса (см. Ниже) возможно, но несколько неуклюжие.
VB не поддерживает многопоточность, и обходные пути для этого имеют много ошибок. Первый из них потенциально может вас укусить, если вы делаете 3-уровневое развитие с использованием MTS или COM +. Создание модуля VB фактически создает одиночный COM-объект за кулисами. Это будет жить в собственной однопоточной квартире. Квартиры - это, по сути, облегченные серверы COM с механизмом сериализации/десериализации (называемым Message Pump), где вызовы становятся сериализованными и поставленными в очередь для одного потока. Если вы сделаете (на его поверхности) разумную вещь и попытаетесь модулизовать свой код, вы создадите горячие точки в вашем среднем ярусе. Решение: больше вырезать и вставить.
Второй основной вопрос заключается в том, что сборка мусора COM является довольно простой - простой механизм подсчета ссылок. Это означает, что COM-компоненты, которые сбой или по какой-то причине не убирают после себя утечку памяти. Помните, как VB6 представляет собой тонкий слой поверх COM? Эта жесткая связь означает, что вы должны быть достаточно осторожны при использовании кода управления UI, который содержит ссылки на элементы управления, автоматизацию OLE для внешних приложений (например, Excel) или что-то еще, что устанавливает ссылки. VB неплохо делает скрытые вещи за вашей спиной и не знает, когда убираться после себя. Он также является источником круговых ссылок, созданных за кулисами.Получите это неправильно, и это приведет к утечке ресурсов - вам нужно быть осторожным.
Другой важный вариант - варианты. Лучшее описание, которое я видел для типа Variant, - это «таблица электронных таблиц». Это может вызвать довольно много вреда, особенно Variant Arrays. Многие API будут работать только с вариантами или иметь случайные части, которые используют варианты (Excel делает это много), поэтому вы не всегда сможете их избежать. Если вы сериализуете содержимое через границы COM (например, несколько отключенных наборов записей), вы скоро научитесь ненавидеть Variant Arrays.
Возможно, вы обнаружите, что система типа VB настолько сломана, что самый простой способ поддерживать нетривиально сложную структуру данных - это делать библиотеку, которая кодирует ее в строке и, по существу, сериализует и де-сериализует ее. Сложные структуры данных в приложении VB6 почти не запускаются.
Наконец, после использования инструментария GUI для VB6 вы узнаете, насколько команда WinForms узнала о ошибках команды VB6.
Несмотря на то, что он был прост в использовании и прост в использовании, создание нетривиального приложения в VB без создания беспорядка было намного сложнее, чем казалось из-за всех архитектурных недостатков и небольших ошибок. Это довольно хороший пример Law of Leaky Abstractions. Спольского.
Appleman's Developing COM/ActiveX Components in Visual BASIC 6 имеет неплохую обработку входов и выходов взаимодействия COM с VB6. Он также неплохо поступил на Win32 and VB programming..
P.S. (спасибо, что напомнил мне Даок), если вы обнаружите, что кто-то использовал On Error Resume Next
, у вас есть мое разрешение на head-butt.
Я действительно хочу ответить на это, потому что я провел первые 6 лет моей карьеры в VB до того, как .NET вышел. Это было так долго, хотя с тех пор как я работал в VB6, я ничего не могу запомнить. Я чувствую к вам хотя и надеюсь, что вам не придется работать в нем очень долго. – 2008-11-11 21:25:37
Отличная книга о том, как сделать vb6 хорошо: http://www.amazon.com/Programming-Distributed-Applications-Microsoft-Visual/dp/073561010X – 2010-04-07 19:08:44