Ознакомление с принципами моделирования, проектирования, реализации, рефакторинга, тестирования и сопровождения проектов в Visual Studio 2013.
Одна из наиболее важных возможностей интегрированной среды Visual Studio 2013 - поддержка всех этапов жизненного цикла разработки программного проекта, которую мы рассмотрим в данной лекции.
В лекции 5 рассмотрен пример разработки, отладки и профилирования в среде VS 2013 простого консольного приложения на языке C#, что можно считать отправной точкой нашего изложения.
Однако, разумеется, концепция жизненного цикла разработки намного шире. Согласно классической водопадной модели жизненного цикла программы, он состоит из следующих этапов:
Один из важнейших вопросов при разработке - организация работы команды программистов проекта. Поддержка командной разработки в Visual Studio 2013 рассмотрена в лекции 9.
В Visual Studio 2013, как и во многих других современных интегрированных средах, имеется поддержка моделирования структуры программы на языке UML [22]. Данный язык моделирования может быть использован на ранних этапах разработки проекта, например, при проектировании иерархии классов.
Язык UML позволяет спроектировать иерархию классов в абстрактных терминах, представить ее в виде модели, а модель - в виде диаграммы. Затем по диаграмме может быть сгенерирован код на выбранном языке (например, на C#). Таким образом, использование языка UML позволяет перейти от этапа моделирования и проектирования к этапу реализации. Сгенерированный код может быть затем использован как основа для последующей реализации проекта.
Наоборот, по уже разработанному коду может быть сгенерирована модель этого кода на языке UML.
В качестве примера рассмотрим генерацию простой UML-модели из двух взаимосвязанных классов, визуализацию этой модели и генерацию по ней кода на языке C#.
Для создания UML-моделей используется специальный вид проекта Modeling Project.
Создадим проект для моделирования. В среде VS 2013 выберем в главном меню ).
(рис 8.1) Создание проекта для построения UML-модели
Для добавления к проекту новой UML-диаграммы выберем пункт меню ).
(рис 8.2) Выбор вида новой UML-диаграммы
По умолчанию это новая диаграмма классов (UML Class Diagram), как наиболее часто используемая. Однако отметим, что, в соответствии с новой версией языка UML, в этом пункте меню могут быть созданы и другие виды диаграмм:
Создаем новую диаграмму классов, пока - пустую (рис 8.3):
(рис 8.3) Создание новой диаграммы классов
Для добавления к диаграмме класса выбираем в контекстном меню пункты ):
(рис 8.4) Добавление к диаграмме нового класса
Класс добавляется с именем ).
(рис 8.5) Класс с атрибутами и операциями
Изменим имя класса в модели на ). Для добавления атрибутов и операций используется контекстное меню и пункт Add:
(рис 8.6) Определение атрибута Size класса Stack и операций класса Push и Pop
Добавим еще один класс - ):
(рис 8.7) Добавление класса MyStack с атибутом Default и операцией Iterate
Теперь наша задача - представить на диаграмме информацию о том, что класс ).
(рис 8.8) Выбор связи вида Inheritance между двумя классами
Добавляем связи вида наследование к диаграмме: находясь на имени класса ).
(рис 8.9) Связывание классов дугой наследования
Теперь можно сгенерировать код, который используем при дальнейшей разработке. В контекстном меню выбираем пункт ):
(рис 8.10) Генерация кода по UML-диаграмме
Генератор кода просит уточнить, по какому шаблону будет происходить генерация. Выбираем шаблон кода для класса (рис 8.11):
(рис 8.11) Выбор шаблона кода для класса при генерации кода по UML-диаграмме
После генерации кода в Solution Explorer появляются два новых пункта - файлы на языке C# ):
(рис 8.12) Завершение генерации кода по UML-диаграмме: генерация двух файлов на C#
Откроем теперь новые файлы .
(рис 8.13) Сгенерированный файл Stack.cs
Атрибут Size реализован в виде свойства (property) с методами get и set. Заглушки методов - в виде виртуальных методов с реализацией в виде генерации исключения, например:
public virtual void Push()
{
throw new System.NotImplementedException();
}
Фрагмент файла :
(рис 8.14) Сгенерированный файл MyStack.cs
Как видно из рисунка, в исходном коде отображено наследование классов (MyStack - потомок класса Stack).
Теперь сгенерированные файлы можно использовать при последующей разработке.
Созданная модель играет весьма важную роль: это отражение в проекте результата раннего этапа разработки - моделирования и проектирования. При необходимости изменить проект, изменения могут быть сделаны в UML-диаграммах, по которым исходные коды генерируются автоматически.
Возможны и "обратные" действия, называемые в современной практике разработки reverse engineering: по уже реализованным классам сгенерировать UML-диаграмму.
Основы разработки кода и соответствующей поддержки среды рассмотрены в лекции 5. Код разрабатывается по выбранному виду проекта и соответствующему шаблону кода, поставляемому средой. При этом обеспечивается проверка правильности синтаксиса вводимого кода, автоматическое завершение кода, а также навигация по коду (например, переход к определению некоторой сущности от ее использования пунктом контекстного меню Go to definition). Все это существенно увеличивает производительность работы программистов.
Особое место при разработке и модификации кода занимает рефакторинг [23] - систематическая модификация и улучшение существующего кода, без коренного изменения его семантики, с помощью автоматических преобразований, осуществляемых средой.
Типичный пример - изменение имени метода. Задача состоит в том, чтобы изменить имя метода и в его определении, и во всех его использованиях. В общем случае, если проект достаточно велик, вручную выполнять решение подобной задачи весьма неудобно. Почти наверняка при этом какие-либо использования метода будут забыты, и к ним придется возвращаться уже после получения ошибок при компиляции (сборке) проекта.
Рассмотрим рефакторинг в среде на примере простого консольного приложения (рис 8.15):
(рис 8.15) Простое консольное приложение
В программе определен класс Program, статический метод Main и метод экземпляра K с аргументом X.
Пусть необходимо изменить имя метода K на M (естественно, не только в определении, но и во всех его использованиях).
Текущую позицию в редакторе текста устанавливаем на первую строчку определения метода ):
(рис 8.16) Выбор действия по рефакторингу для метода K
Далее выделяем имя метода - :
(рис 8.17) Выбор действия замены имени метода K
В окне рис 8.17 задаем новое имя метода - .
(рис 8.18) Предварительный просмотр планируемых изменений в коде
Поскольку все предлагаемые изменения нас устраивают, нажимаем Apply.
На рис 8.19 показан результат рефакторинга.
(рис 8.19) Результат рефакторинга - имя метода изменено
Чтобы убедиться в правильности выполненных средой преобразований, рекомендуем сделать сборку проекта. В окне Refactor (внизу) дана информация о том, какие преобразования произведены.
Среда VS 2013 предоставляет следующие виды рефакторинга:
Rename - замена имени сущности;Extract Method - извлечь метод: преобразовать выделенный фрагмент кода в метод с заданным именем;Encapsulate Field - инкапсулировать поле, сделав его приватным, но добавить public-свойство для доступа к нему;Extract Interface - извлечь интерфейс: выделить текст класса и автоматически сформировать для него соответствующий интерфейс (если это возможно);Remove parameters - удалить часть параметров метода;Reorder parameters - изменить порядок параметров метода.Перечень преобразований весьма впечатляющий, однако, как обычно, хотелось бы большего - например, рефакторинга с целью улучшить надежность и безопасность кода, Уверен, что это - дело ближайшего будущего и будет реализовано в новых версиях Visual Studio.
Заметим, что большие возможности преобразований типа рефакторинга предоставляет аспектно-ориентированное программирование [9], так как оно направлено именно на систематические трансформации программ.
Среда VS 2013 предоставляет значительную поддержку и на этапе тестирования программ. К среде может быть дополнительно инсталлирован генератор unit-тестов (тестов для конкретных методов), - например, классический генератор тестов NUint или относительно новый генератор тестов MSUnit, разработанный Microsoft. В среде, в пункте главного меню Test, имеются возможности создания списка прогоняемых тестов, прогона тестов (полностью или выборочно), анализа тестового покрытия, конфигурирования генератора тестов и др. Практически на примерах мы рассмотрим поддержку тестирования в лабораторных работах.
При сопровождении программ особенно важной задачей является четкая фиксация изменений и исправлений кода, для чего служат многочисленные системы управления исходным кодом (source code control systems), фиксирующие и нумерующие версии каждого файла исходного кода при каждом его изменении. Среда VS 2013 предоставляет инструмент интеграции разрабатываемого проекта с одной из систем управления исходным кодом. Наиболее популярными из них в настоящее время являются Git, Subversion, CVS. Среда Visual Studio имеет также собственную систему управления исходным кодом - Microsoft Visual SourceSafe.
Поддержка этапов жизненного цикла разработки программы в среде Visual Studio весьма удобна и разнообразна. Поддержаны почти все этапы жизненного цикла, а также коллективная разработка программ. Особенно удобными являются генерация UML-моделей и автоматическая генерация исходного кода по ним, рефакторинг, а также всевозможные подсказки, подсветки и элементы контроля при вводе исходного кода. Как специалист, работавший еще на mainframe-компьютерах 1970-х гг., могу сказать, что старшему поколению программистов подобная поддержка даже и "не снилась". Но всегда хочется большего. Прежде всего, хотелось бы, чтобы активнее развивалась поддержка trustworthy computing - проектирования и разработки "только правильного", надежного и безопасного кода. Уверен, что это - дело ближайшего будущего.
| - проверка корректности разработки программы в виде тестирования (прогона набора тестов) или в виде формального доказательства корректности программы (т.е. соответствия ее реализации ее спецификации). | |
| - классическая модель разработки программы в виде совокупности этапов, выполняемых последовательно. | |
| - последовательность этапов, из которых состоит разработка программы: выработка требований, спецификация, проектирование, реализация, верифакация (тестирование), сопровождение, выпуск программного продукта. | |
| - разработка формальной модели программы, выполняемая, как правило, на языке Unified Modeling Language (UML). | |
| - систематические автоматизированные преобразования программного кода с целью улучшения его структуры, без коренных изменений в его семантике. | |
| - язык моделирования для построения формальных моделей программ и процессов их разработки. |
Поддержка этапов жизненного цикла разработки программы в среде Visual Studio весьма удобна и разнообразна. Поддержаны почти все этапы жизненного цикла, а также коллективная разработка программ. Особенно удобными являются генерация UML-моделей и автоматическая генерация исходного кода по ним, рефакторинг, а также всевозможные подсказки, подсветки и элементы контроля при вводе исходного кода. В лекции рассмотрены этапы моделирования программ и рефакторинга кода, кратко рассмотрена схема жизненного цикла программы и поддержка всех этапов жизненного цикла в среде Visual Studio 2013.
Презентация к данной лекции: VS_2013_Course_8.pptx.
Ознакомление с принципами моделирования, проектирования, реализации, рефакторинга, тестирования и сопровождения проектов в Visual Studio 2013.
Одна из наиболее важных возможностей интегрированной среды Visual Studio 2013 - поддержка всех этапов жизненного цикла разработки программного проекта, которую мы рассмотрим в данной лекции.
В лекции 5 рассмотрен пример разработки, отладки и профилирования в среде VS 2013 простого консольного приложения на языке C#, что можно считать отправной точкой нашего изложения.
Однако, разумеется, концепция жизненного цикла разработки намного шире. Согласно классической водопадной модели жизненного цикла программы, он состоит из следующих этапов:
Один из важнейших вопросов при разработке - организация работы команды программистов проекта. Поддержка командной разработки в Visual Studio 2013 рассмотрена в лекции 9.
В Visual Studio 2013, как и во многих других современных интегрированных средах, имеется поддержка моделирования структуры программы на языке UML [22]. Данный язык моделирования может быть использован на ранних этапах разработки проекта, например, при проектировании иерархии классов.
Язык UML позволяет спроектировать иерархию классов в абстрактных терминах, представить ее в виде модели, а модель - в виде диаграммы. Затем по диаграмме может быть сгенерирован код на выбранном языке (например, на C#). Таким образом, использование языка UML позволяет перейти от этапа моделирования и проектирования к этапу реализации. Сгенерированный код может быть затем использован как основа для последующей реализации проекта.
Наоборот, по уже разработанному коду может быть сгенерирована модель этого кода на языке UML.
В качестве примера рассмотрим генерацию простой UML-модели из двух взаимосвязанных классов, визуализацию этой модели и генерацию по ней кода на языке C#.
Для создания UML-моделей используется специальный вид проекта Modeling Project.
Создадим проект для моделирования. В среде VS 2013 выберем в главном меню ).
(рис 8.1) Создание проекта для построения UML-модели
Для добавления к проекту новой UML-диаграммы выберем пункт меню ).
(рис 8.2) Выбор вида новой UML-диаграммы
По умолчанию это новая диаграмма классов (UML Class Diagram), как наиболее часто используемая. Однако отметим, что, в соответствии с новой версией языка UML, в этом пункте меню могут быть созданы и другие виды диаграмм:
Создаем новую диаграмму классов, пока - пустую (рис 8.3):
(рис 8.3) Создание новой диаграммы классов
Для добавления к диаграмме класса выбираем в контекстном меню пункты ):
(рис 8.4) Добавление к диаграмме нового класса
Класс добавляется с именем ).
(рис 8.5) Класс с атрибутами и операциями
Изменим имя класса в модели на ). Для добавления атрибутов и операций используется контекстное меню и пункт Add:
(рис 8.6) Определение атрибута Size класса Stack и операций класса Push и Pop
Добавим еще один класс - ):
(рис 8.7) Добавление класса MyStack с атибутом Default и операцией Iterate
Теперь наша задача - представить на диаграмме информацию о том, что класс ).
(рис 8.8) Выбор связи вида Inheritance между двумя классами
Добавляем связи вида наследование к диаграмме: находясь на имени класса ).
(рис 8.9) Связывание классов дугой наследования
Теперь можно сгенерировать код, который используем при дальнейшей разработке. В контекстном меню выбираем пункт ):
(рис 8.10) Генерация кода по UML-диаграмме
Генератор кода просит уточнить, по какому шаблону будет происходить генерация. Выбираем шаблон кода для класса (рис 8.11):
(рис 8.11) Выбор шаблона кода для класса при генерации кода по UML-диаграмме
После генерации кода в Solution Explorer появляются два новых пункта - файлы на языке C# ):
(рис 8.12) Завершение генерации кода по UML-диаграмме: генерация двух файлов на C#
Откроем теперь новые файлы .
(рис 8.13) Сгенерированный файл Stack.cs
Атрибут Size реализован в виде свойства (property) с методами get и set. Заглушки методов - в виде виртуальных методов с реализацией в виде генерации исключения, например:
public virtual void Push()
{
throw new System.NotImplementedException();
}
Фрагмент файла :
(рис 8.14) Сгенерированный файл MyStack.cs
Как видно из рисунка, в исходном коде отображено наследование классов (MyStack - потомок класса Stack).
Теперь сгенерированные файлы можно использовать при последующей разработке.
Созданная модель играет весьма важную роль: это отражение в проекте результата раннего этапа разработки - моделирования и проектирования. При необходимости изменить проект, изменения могут быть сделаны в UML-диаграммах, по которым исходные коды генерируются автоматически.
Возможны и "обратные" действия, называемые в современной практике разработки reverse engineering: по уже реализованным классам сгенерировать UML-диаграмму.
Основы разработки кода и соответствующей поддержки среды рассмотрены в лекции 5. Код разрабатывается по выбранному виду проекта и соответствующему шаблону кода, поставляемому средой. При этом обеспечивается проверка правильности синтаксиса вводимого кода, автоматическое завершение кода, а также навигация по коду (например, переход к определению некоторой сущности от ее использования пунктом контекстного меню Go to definition). Все это существенно увеличивает производительность работы программистов.
Особое место при разработке и модификации кода занимает рефакторинг [23] - систематическая модификация и улучшение существующего кода, без коренного изменения его семантики, с помощью автоматических преобразований, осуществляемых средой.
Типичный пример - изменение имени метода. Задача состоит в том, чтобы изменить имя метода и в его определении, и во всех его использованиях. В общем случае, если проект достаточно велик, вручную выполнять решение подобной задачи весьма неудобно. Почти наверняка при этом какие-либо использования метода будут забыты, и к ним придется возвращаться уже после получения ошибок при компиляции (сборке) проекта.
Рассмотрим рефакторинг в среде на примере простого консольного приложения (рис 8.15):
(рис 8.15) Простое консольное приложение
В программе определен класс Program, статический метод Main и метод экземпляра K с аргументом X.
Пусть необходимо изменить имя метода K на M (естественно, не только в определении, но и во всех его использованиях).
Текущую позицию в редакторе текста устанавливаем на первую строчку определения метода ):
(рис 8.16) Выбор действия по рефакторингу для метода K
Далее выделяем имя метода - :
(рис 8.17) Выбор действия замены имени метода K
В окне рис 8.17 задаем новое имя метода - .
(рис 8.18) Предварительный просмотр планируемых изменений в коде
Поскольку все предлагаемые изменения нас устраивают, нажимаем Apply.
На рис 8.19 показан результат рефакторинга.
(рис 8.19) Результат рефакторинга - имя метода изменено
Чтобы убедиться в правильности выполненных средой преобразований, рекомендуем сделать сборку проекта. В окне Refactor (внизу) дана информация о том, какие преобразования произведены.
Среда VS 2013 предоставляет следующие виды рефакторинга:
Rename - замена имени сущности;Extract Method - извлечь метод: преобразовать выделенный фрагмент кода в метод с заданным именем;Encapsulate Field - инкапсулировать поле, сделав его приватным, но добавить public-свойство для доступа к нему;Extract Interface - извлечь интерфейс: выделить текст класса и автоматически сформировать для него соответствующий интерфейс (если это возможно);Remove parameters - удалить часть параметров метода;Reorder parameters - изменить порядок параметров метода.Перечень преобразований весьма впечатляющий, однако, как обычно, хотелось бы большего - например, рефакторинга с целью улучшить надежность и безопасность кода, Уверен, что это - дело ближайшего будущего и будет реализовано в новых версиях Visual Studio.
Заметим, что большие возможности преобразований типа рефакторинга предоставляет аспектно-ориентированное программирование [9], так как оно направлено именно на систематические трансформации программ.
Среда VS 2013 предоставляет значительную поддержку и на этапе тестирования программ. К среде может быть дополнительно инсталлирован генератор unit-тестов (тестов для конкретных методов), - например, классический генератор тестов NUint или относительно новый генератор тестов MSUnit, разработанный Microsoft. В среде, в пункте главного меню Test, имеются возможности создания списка прогоняемых тестов, прогона тестов (полностью или выборочно), анализа тестового покрытия, конфигурирования генератора тестов и др. Практически на примерах мы рассмотрим поддержку тестирования в лабораторных работах.
При сопровождении программ особенно важной задачей является четкая фиксация изменений и исправлений кода, для чего служат многочисленные системы управления исходным кодом (source code control systems), фиксирующие и нумерующие версии каждого файла исходного кода при каждом его изменении. Среда VS 2013 предоставляет инструмент интеграции разрабатываемого проекта с одной из систем управления исходным кодом. Наиболее популярными из них в настоящее время являются Git, Subversion, CVS. Среда Visual Studio имеет также собственную систему управления исходным кодом - Microsoft Visual SourceSafe.
Поддержка этапов жизненного цикла разработки программы в среде Visual Studio весьма удобна и разнообразна. Поддержаны почти все этапы жизненного цикла, а также коллективная разработка программ. Особенно удобными являются генерация UML-моделей и автоматическая генерация исходного кода по ним, рефакторинг, а также всевозможные подсказки, подсветки и элементы контроля при вводе исходного кода. Как специалист, работавший еще на mainframe-компьютерах 1970-х гг., могу сказать, что старшему поколению программистов подобная поддержка даже и "не снилась". Но всегда хочется большего. Прежде всего, хотелось бы, чтобы активнее развивалась поддержка trustworthy computing - проектирования и разработки "только правильного", надежного и безопасного кода. Уверен, что это - дело ближайшего будущего.
| - проверка корректности разработки программы в виде тестирования (прогона набора тестов) или в виде формального доказательства корректности программы (т.е. соответствия ее реализации ее спецификации). | |
| - классическая модель разработки программы в виде совокупности этапов, выполняемых последовательно. | |
| - последовательность этапов, из которых состоит разработка программы: выработка требований, спецификация, проектирование, реализация, верифакация (тестирование), сопровождение, выпуск программного продукта. | |
| - разработка формальной модели программы, выполняемая, как правило, на языке Unified Modeling Language (UML). | |
| - систематические автоматизированные преобразования программного кода с целью улучшения его структуры, без коренных изменений в его семантике. | |
| - язык моделирования для построения формальных моделей программ и процессов их разработки. |
Поддержка этапов жизненного цикла разработки программы в среде Visual Studio весьма удобна и разнообразна. Поддержаны почти все этапы жизненного цикла, а также коллективная разработка программ. Особенно удобными являются генерация UML-моделей и автоматическая генерация исходного кода по ним, рефакторинг, а также всевозможные подсказки, подсветки и элементы контроля при вводе исходного кода. В лекции рассмотрены этапы моделирования программ и рефакторинга кода, кратко рассмотрена схема жизненного цикла программы и поддержка всех этапов жизненного цикла в среде Visual Studio 2013.
Презентация к данной лекции: VS_2013_Course_8.pptx.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.