Поможет ли «Эффективная работа с устаревшим кодом» кому-нибудь, работающему с приложением, перенесенным с VB6 на VB.NET?

Я хочу провести рефакторинг большого устаревшего приложения, изначально написанного на Visual Basic 6.0 и впоследствии перенесенного в .NET. Чтобы сделать это с уверенностью, я хочу иметь модульные тесты для существующего кода, чтобы я мог сравнить до и после. Какой самый простой и эффективный способ сделать это?

Есть книга под названием "Эффективная работа с устаревшим кодом", похоже, это может мне помочь. Однако похоже, что он имеет дело только с объектно-ориентированными языками, а Visual Basic 6.0 не обязательно является объектно-ориентированным. Может ли эта книга мне еще помочь? Я надеюсь, что кто-то, кто читал это, может поручиться за это.

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

Как я уже сказал, этот проект был портирован на VB.NET. Однако он портирован только в том смысле, что компилируется в Visual Studio 2008. Все концепции кодирования соответствуют Visual Basic 6.0.


person Community    schedule 22.06.2009    source источник


Ответы (7)


Он касается не только объектно-ориентированных (ОО) языков. Большие разделы посвящены тому, как работать с унаследованным кодом на C.

Так что да, покупайте!


Есть целая глава (Глава 19) под названием:

Мой проект не объектно-ориентированный. Как внести безопасные изменения?

Также есть vbUnit, xUnit, которая может помочь вам использовать TDD с Visual Basic 6.0.

На самом деле, я неправильно понял вопрос и подумал, что вы собираетесь портировать, а не то, что вы уже портировали. В этом случае у вас есть тонна «устаревшего» кода VB.NET, который это полностью книга для вас. Вы можете воспользоваться преимуществами объектно-ориентированных возможностей VB.NET и прочесть оставшуюся часть книги.

Я действительно не могу больше рекомендовать эту книгу.

person Johnno Nolan    schedule 22.06.2009
comment
+1. Одна крошечная придирка, хотя. В вопросе говорится, что приложение было перенесено на VB.NET, поэтому vbunit не будет иметь значения. - person MarkJ; 23.06.2009
comment
Спасибо, это то, что мне нужно было знать. Я возьму книгу. Кроме того, спасибо MarkJ за ваши различные комментарии - они точны. - person ; 23.06.2009

Да; концепции книги великолепны и сильны и выходят за рамки ООП. И VB6 может быть объектно-ориентированным, хотя это не такой полностью объектно-ориентированный язык, как некоторые.

Среди самых мощных концепций в книге есть «швы», по сути, места, где вы можете разбить свой код, внедрить тесты или изолировать или абстрагировать части функциональности. Это лишь одна из концепций, применимых даже к процедурному коду.

person Carl Manaster    schedule 22.06.2009

Вы можете сделать вопросы более конкретными.

Хотя VB6 не является чисто объектно-ориентированным языком как таковым, в нем достаточно элементов объектно-ориентированного программирования, которые должны быть вам знакомы; Кроме того, для VB6 IDE существует ряд подключаемых модулей для модульного тестирования.

Но давайте рассмотрим некоторые высокоуровневые компоненты VB6:

  • Формы ЯВЛЯЮТСЯ объектами (вы можете создавать новые экземпляры).
  • Модули ведут себя как классы только со статическими методами.
  • Классы и пользовательские элементы управления максимально приближены к объектам. Отсутствие конструктора усложняет задачу, но, надеюсь, первоначальный разработчик остался с Initialize или написал последовательную подпрограмму Init.
  • События в VB нечетны; это также то, что, вероятно, больше всего сбивает вас с толку. Скрытый код с сохранением состояния, зависящий от определенного порядка событий, несомненно, разбросан повсюду.
  • Страницы свойств. Что ж, это то, что есть.

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

person hythlodayr    schedule 22.06.2009
comment
Справедливо. Я отредактирую свой вопрос, чтобы подчеркнуть свои опасения. - person ; 23.06.2009

У вас определенно есть какая-то работа, но вот стратегия, которую следует рассмотреть, прежде чем приступать к ЛЮБОЙ работе с .NET.

Переместите как можно больше базового кода FORM в класс: для начала один файл класса на форму. По сути, обработчики событий формы не должны ничего делать, кроме прокси-вызовов методов в базовом экземпляре класса; все пользовательские методы, очевидно, могут быть перенесены в файл класса.

После прочтения руководств по передовым практикам (и т. д.) от Microsoft и других, которые помогут вам подготовиться к миграции .NET, вы в основном готовы к тому, что вам придется перекодировать/рефакторинг: такие раздражающие факторы, как обработка ошибок, порядок событий, объекты/варианты с поздней привязкой, коллекции и т. д.

Несколько слов о коде с обработкой ошибок: особенно трудно дублировать спагетти при ошибках, особенно потому, что среднестатистический кодировщик Visual Basic плохо умеет использовать его в качестве логики управления потоком. Практически стоит разбить каждый блок On Error на отдельные подпрограммы, если в подпрограмме их больше двух.

После того, как код будет очищен, вы также можете рассмотреть вопрос о рефакторинге кода Visual Basic в разумные абстракции (например, один класс адаптера данных и соединение и т. д.), но лучше об этом судить вам.

Вам может не понравиться такой подход, поэтому обязательно попробуйте одну форму.

person hythlodayr    schedule 23.06.2009
comment
Разумный совет, но проведение модульных тестов, вероятно, должно быть самой первой задачей (как в исходном вопросе). - person MarkJ; 23.06.2009
comment
Модульное тестирование FORM (как написано) сложно. Более управляемо создавать классы, которые захватывают логику событий/отслеживания состояния формы во всей ее красе и имитируют события в модульном тесте. Но ты прав. Остальные советы следует давать ПОСЛЕ написания модульных тестов. - person hythlodayr; 24.06.2009
comment
Вы правы насчет форм модульного тестирования. RS Conley написал несколько интересных ответов в другом месте на Stackoverflow об использовании форм, которые представляют собой тонкие оболочки, делегирующие классу, что, по его словам, имеет много преимуществ, включая возможность тестирования. Он называет это подходом пассивного экрана (в честь Мартина Фаулера). - person MarkJ; 24.06.2009

У меня есть копия, которую я купил, чтобы попытаться контролировать наш проект C/C++. Поскольку я пропустил функциональность, которую C#/.NET может предложить.

Книги очень похожи на C/C++, но, как сказал Джон, есть глава о работе без объектов.

Но если, как вы говорите, ваш код портирован на .NET, это уже не код Visual Basic 6.0. В .NET есть множество способов Visual Basic/C#, позволяющих подключиться к коду и протестировать его. Но, тем не менее, книга даст вам хороший обзор различных способов, которыми вы можете подключиться к приложению, и стратегий для получения контроля над большим старым проектом.

person Simeon Pilgrim    schedule 23.06.2009

Я бы посоветовал взглянуть на Рефакторинг: улучшение дизайна существующего кода, обязательное к прочтению.

Возможно, вы ищете что-то вроде Профессиональный рефакторинг в визуальном Базовый. Я не читал, но похоже применимо.

person Jacob    schedule 22.06.2009
comment
Я прочитал книгу Мартина Фаулера «Рефакторинг», которая заставила меня понять, что мне нужны тесты для моего унаследованного кода. Вы правы, это отличный must-read. - person ; 23.06.2009

Я думаю, что наиболее полезными для вас будут характеризационные тесты. Они должны быть автоматизированы. Без характеризационных тестов вам придется тестировать ваше приложение/код вручную, фактически запуская его. При добавлении нового кода очень легко пропустить тестирование критической функциональности. Это исходит из моего собственного опыта.

Sprout Method и Sprout Class важны при добавлении нового кода.

person Gutzofter    schedule 23.06.2009