ТГУ СУиР – Лабораторные работы – Новые технологии в программировании

1 Лабораторная работа № 1. Бизнес-логика
Целью данной работы является реализация простого проекта в IDE
Visual Studio 2013 на языке C#.
1.1 Integrated development environment
Когда программирование только зарождалось и им еще занималась
не программисты, а научные работники, не было никаких средств для эф-
фективного написания кода, программы писались в примитивных тексто-
вых редакторах и компилировались из командной строки. Такой подход не
вызывает сложностей при написании небольших программ. При разработ-
ке крупных программных проектов он становится затруднительным. По-
этому со временем стали появляться специализированные среды разработ-
ки, позволяющие по возможности автоматизировать часть задач и упро-
стить написание кода, такие среды называются IDE.
IDE (Integrated development environment, интегрированная среда раз-
работки) — система программных средств, используемая программистами
для разработки программного обеспечения. В базовом виде IDE включают
в себя текстовый редактор, компилятор, средства автоматизации сборки,
отладчик. Однако современные IDE включают в себя большое количество
дополнительных инструментов, позволяющих значительно облегчить про-
цесс написания кода, например:
1. Подсветка синтаксиса.
2. Статические анализаторы, которые проверяют ошибки в про-
грамме прямо во время написания (а не на этапе компиляции).
3. Инструменты для эффективного рефакторинга.
4. Фреймворки для генерации и написания модульных тестов и др.
Существует множество различных IDE, которые поддерживают как
несколько языков (Microsoft Visual Studio, IntelliJ IDEA, NetBeans), так и
7
всего один (PyCharm, Delphi). Одной из лучших IDE для разработки при-
ложений для Windows является Microsoft Visual Studio. Кроме того, что
Microsoft Visual Studio позволяет эффективно разрабатывать на популяр-
ных языках (С++, С#, VB.NET), значительным преимуществом является
возможность ее расширения различными плагинами, начиная от продвину-
той подсветки синтаксиса и интеграции систем контроля версий до под-
ключения дополнительных языков программирования. На сайте Microsoft
можно скачать бесплатную версию Visual Studio Express 2013, которая по-
надобится для выполнения лабораторных работ.
1.2 Знакомство с Microsoft Visual Studio
После установки и запуска Microsoft Visual Studio Express 2013 (да-
лее MSVS) запустится стартовое окно программы. Для того чтобы создать
проект, необходимо нажать Create Project на стартовой странице либо вы-
брать FILE->Create->Project, после чего появится окно создания проекта.
В лабораторных работах будут использоваться 3 вида проектов:
1. Class library — библиотека классов — проект такого типа компи-
лируется в файл формата *.dll. Используется для описания бизнес-
логики приложения.
2. Console application — консольное приложение — компилируется
в *.exe. Позволяет создать приложение с которым можно взаимо-
действовать через консоль.
3. Windows forms application — оконное приложение — компилиру-
ется в *.exe. Позволяет создавать оконные приложения для Windows,
используя технологию WinForms.
После создания проекта MSVS создает Solution (Решение), в котором
находится созданный проект. Решение содержит элементы, необходимые
для создания приложения. Решение может включать один или несколько
проектов, а также файлы и метаданные, необходимые для определения ре-
8
шения в целом. Решение необходимо для того, чтобы хранить все проекты,
которые относятся к одному приложению, а также для отслеживания их
взаимодействий. MSVS хранит определение решения в двух файлах: *.sln
и *.suo. Файл решения (*.sln) содержит метаданные, которые определяют
решение, в том числе:
1. Проекты, связанные с решением.
2. Элементы, которые не связаны с определенным проектом (тексто-
вые файлы, картинки и т. д.).
3. Конфигурации сборки, определяющие, какие конфигурации про-
екта применяются в каждом типе сборки.
Для добавления файлов в проект необходимо вызвать контекстное
меню решения (нажать правой кнопкой на корневом узле в Обозревателе
решения (Solution Explorer)), после чего выбрать пункт Добавить (Add).
Таким образом, в решение можно добавить новые проекты или различные
файлы (Create element…).
Project (Проект) MSVS служит контейнером для файлов с исходным
кодом, подключенным библиотекам и файлам. Управление проектом так-
же осуществляется через контекстное меню, которое можно вызвать через
Обозреватель решения. Через контекстное меню можно добавлять файлы с
исходным кодом в проект (Add->Create element…).
Важно!!! После установки MSVS файлы с расширением *.cs ассо-
циируются с ней. То есть такие файлы будут открываться в MSVS. Следу-
ет понимать, что открытые таким образом файлы не добавляются в проект
или решение и они не могут быть скомпилированы. Чтобы добавить суще-
ствующий файл в проект, необходимо вызвать контекстное меню проекта
и в пункте Добавить выбрать существующий проект (Add->Exiting
element…).
Часто один проект должен использовать некоторые типы данных,
определенные в другом проекте. Для этого необходимо в основной проект
добавить ссылку на зависимый проект. Для этого необходимо вызвать кон-
текстное меню элемента References основного проекта и выбрать пункт
Добавить ссылку (Add Reference…). После этого появится окно, изобра-
женное на рис. 1.1. Зависимость можно добавить как на проекты, находя-
щиеся в том же решении (для этого надо выбрать пункт Решение), так и на
существующие сборки, входящие в .NET Framework, или дополнительно
установленные библиотеки (пункт Сборки). После выбора необходимой
библиотеки необходимо установить флаг слева от названия в положение
«используется» и нажать ОК. После этого можно использовать типы дан-
ных, определенные в выбранной библиотеке в вашем проекте.
Может быть интересно
1.3 Первое приложение на C#
Во всех учебниках по программированию в качестве первой про-
граммы всегда используется «Hello, World». Единственная функция этой
программы — выводить в консоль строку «Hello, World!».
В первую очередь необходимо создать новое консольное приложе-
ние. Назовем его «HelloWorld». После создания MSVS сгенерирует Реше-
ние HelloWorld и проект HelloWorld. Будет сгенерирован единственный
файл с кодом Program.cs. Ниже следует его содержимое.
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
}
}
}
Рассмотрим листинг подробнее. На первой строке находится объяв-
ление пространства имен, название которого по умолчанию совпадает с
именем проекта.
Затем идет объявление класса Program. Ввиду того, что С# — полно-
стью объектно-ориентированный язык, в нем не может быть функций, ко-
торые не принадлежат какому-либо классу, в данном случае класс Program
необходим для определения метода Main. Класс Program является обыч-
ным классам, и с ним можно делать все то же, что и с другими, созданны-
ми пользователем, классами. Например, его можно переименовать.
Далее идет объявление функции Main. Любое консольное приложе-
ние должно содержать метод Main. Метод Main — точка входа в програм-
му, начало ее выполнения. В случае отсутствия этого метода будет ошибка
при компиляции, потому что компилятор не будет знать, где начинается
ваша программа. Соответственно, этот метод нельзя переименовывать и
перегружать.
11
Вообще существует несколько вариантов сигнатуры этого метода:
static void Main(string[] args)
static int Main(string[] args)
static void Main()
static int Main()
Эти функции будут отличаться типом возвращаемого значения и на-
личием входных параметров. Рассмотрим подробнее: в первом случае из
программы не возвращается никаких значений (void) и программа прини-
мает на вход параметры. Строка string[] args содержит в себе список пара-
метров, которые пользователь может передать в программу при вызове из
командной строки. Во втором случае программа возвращает в консоль це-
лое число, обычно это делается, чтобы после окончания выполнения про-
граммы пользователь мог узнать, корректно она завершилась или нет, если
корректно, то возвращается 0, в противном случае 1 либо код произошед-
шей ошибки. В третьем и четвёртом случаях отсутствуют входные аргу-
менты программы. Читатель, знающий С++, может провести прямую ана-
логию с функцией Main.
Теперь необходимо добавить в функцию Main код, который будет
выводить необходимую строку. Сделать это можно следующим образом:
System.Console.Write(“Hello, World!”);
или
System.Console.WriteLine(“Hello, World!”);
Отличия этих двух способов в том, что в первом случае каретка ос-
танется на той же строке, а во втором передвинется на следующую строч-
ку. То есть если у нас будет несколько вызовов System.Console.Write под-
ряд, то аргументы функции будут выводиться на одной строке, а если бу-
дет несколько вызовов System.Console.WriteLine, каждый аргумент будет
выводиться на новой строчке.
12
Для того чтобы запустить приложение, необходимо либо на верхней
панели нажать кнопку Запуск (Start), либо через главное меню — Отладка
(Debug)-> Начать отладку (Start debugging), также можно нажать клавишу F5.
При первом запуске скорее всего вы увидите, как мелькнет окно кон-
соли и тут же пропадет. Это не ошибка, просто программа очень быстро
выполнилась и закрылась. Чтобы посмотреть результаты выполнения, не-
обходимо остановить выполнение программы. Для этого, например, можно
заставить программу ждать, пока не будет нажата какая-нибудь клавиша
клавиатуры. Для этого необходимо в конец программы добавить строку:
System.Console.Read();
Если запустить программу теперь, то на экране появится окно консо-
ли с текстом “Hello, World!”. Чтобы окно пропало, надо нажать произволь-
ную клавишу.
В итоге ваша программа должна выглядеть следующим образом:
namespace HelloWorld
{
class Program
{
static void Main()
{
System.Console.WriteLine(“Hello, World!”);
System.Console.Read();
}
}
}
1.4 Ввод/вывод на языке С#
В общем случае, когда говорят о программах, будь то консольное
приложение или оконное, подразумевается, что пользователю необходимо
с ней взаимодействовать. Программа должна сообщить пользователю о
процессе или результатах выполнения, а также работать с данными, кото-
13
рые пользователь ей подает. Поэтому в данной части речь пойдет о опера-
торах ввода и вывода на C#.
Для получения данных с клавиатуры можно использовать следую-
щий метод:
string str = Console.ReadLine();
Как видно, этот метод возвращает строку и не существует его пере-
грузок или других методов, чтобы считывать целочисленные, символьные
и другие типы переменных. Соответственно, для того чтобы ввести с кла-
виатуры, необходимо получить строковое значение, а затем сконвертиро-
вать его в необходимый нам тип данных. Для этого можно использовать
класс Convert. В нем определено множество статических методов конвер-
тирования строк в иные типы данных. Далее следуют примеры использо-
вания класса Convert.
int intValue = Convert.ToInt32(Console.ReadLine());
double doubleValue = Convert.ToDouble(Console.ReadLine());
bool boolValue = Convert.ToBoolean(Console.ReadLine());
long longValue = Convert.ToInt64(Console.ReadLine());
При этом надо следить, чтобы типы вводимых значений совпадали с
типами указанных переменных, потому что в противном случае возникнет
исключение. Например, если ввести строку 123.456 и попытаться сконвер-
тировать в целочисленное значение, то сгенерируется исключение.
Для более корректной работы программы, если программа ожидает от
пользователя какое-то определенное значение, то лучше ему об этом сказать.
Необходимо придерживаться правила: перед тем как считывать что-либо с
консоли, необходимо сообщить пользователю, что именно он должен ввести:
смысл вводимой информации, тип данных, максимальное и минимальное до-
пустимые значения и т. п. Примером таких запросов могут служить:
«Введите имя пользователя (не больше 20 знаков)»
«Введите возраст, целочисленное значение, от 1 до 100»
14
«Введите пол, 0 — мужской, 1 — женский»
Для вывода текста на экран можно использовать команды, про кото-
рые говорилось в предыдущей главе: Console.Write или Console.WriteLine.
Далее идут примеры использования этих команд.
Console.WriteLine(s);// переменная
Console.WriteLine(55.3);// константа
Console.WriteLine(y*3+7);// выражение
Console.Write(z);// переменная
Console.Write(-5.3);// константа
Console.Write(i*3+7/j);// выражение
Очень часто в процессе работы необходимо выводить осмысленные
предложения с результатами выполнения программы. Например, «Через
насос X было перекачано Y литров воды, температура насоса Z градусов»,
где в различные моменты выполнения программы X, Y, Z могут быть раз-
личными значениями. Конечно, можно использовать следующий подход:
Console.WriteLine(«Через насос » + X + «, было перекачано » + Y +
« литров воды, температура насоса » + Z + « градусов»);
Однако такой подход слишком громоздкий, и с ним возникает масса
трудностей, например при необходимости добавить дополнительные дан-
ные, даже читать такую запись достаточно затруднительно. Поэтому при-
нято использовать подход с использованием форматной строки. Сама
строка формата содержит большую часть отображаемого текста, но всякий
раз, когда в нее должно быть вставлено значение переменной, в фигурных
скобках указывается индекс. В фигурные скобки может быть включена и
другая информация, относящаяся к формату данного элемента, например
та, что описана ниже:
• Количество символов, которое займет представление элемента,
снабженное префиксом-запятой. Отрицательное число указывает,
что элемент должен быть выровнен по левой границе, а положи-
тельное — по правой. Если элемент на самом деле занимает
15
больше символов, чем ему отведено форматом, он отображается
полностью.
• Спецификатор формата предваряется двоеточием. Это указывает,
каким образом необходимо отформатировать элемент. Например,
можно указать, должно ли число быть форматировано как денеж-
ное значение либо его следует отобразить в научной нотации, в
степенном виде, либо шестнадцатиричном.
Console.WriteLine(«Через насос {0} было перекачано {1} литров воды,
температура насоса {2} градусов», X, Y, Z);
1.5 Задание на лабораторную работу
1. Создайте проект на языке C# в среде Microsoft Visual Studio. Назо-
вите его в соответствии с вашим вариантом задания, в качестве исходного
проекта выберите проект динамической библиотеки (*.dll). Назовите его
либо согласно вашему варианту, либо просто Model. Данный проект будет
содержать в себе бизнес-логику приложения, т. е. ключевые структуры
данных и способы их взаимодействия.
2. Создайте сущность-интерфейс согласно вашему варианту. Опиши-
те ключевые свойства и методы интерфейса. Не забудьте о правильном
именовании типов данных согласно RSDN. Подумайте, какие свойства и
методы будут являться общими (будут в интерфейсе), а какие должны
быть реализованы в конкретных классах.
3. Создайте 2 или более класса, реализующих данный интерфейс.
Классы обязательно должны иметь различные реализации методов интер-
фейса. При этом дочерние классы не должны иметь никаких ссылок друг на
друга, так же как и интерфейс не должен ничего знать о дочерних классах.
4. Реализуйте проверку правильности передаваемых свойствам дан-
ных (валидацию свойств) с помощью механизма обработки исключений —
если на вход приходят некорректные данные, выходящие за допустимые
16
пределы, свойство должно сгенерировать исключение соответствующего
типа с описанием ошибки. Например, если свойству Возраст пытаются
присвоить отрицательное значение, необходимо сгенерировать экземпляр
исключения IncorrectArgumentException. Внимательно продумайте все воз-
можные некорректные варианты входных данных, в том числе ссылки на
null. В случае если механизмы валидации у всех свойств одинаковы, изме-
ните архитектуру: вместо реализации интерфейса используйте наследова-
ние от абстрактного класса, в котором будут реализованы механизмы ва-
лидации.
5. Добавьте в решение еще один проект, на этот раз консольное при-
ложение, и назовите его «ConsoleLoader». В этом проекте будет прово-
диться первичное тестирование бизнес-логики приложения.
ПРИМЕЧАНИЕ: данный проект является временным и впоследствии
будет заменён на проект графического интерфейса Windows (WinForms
Application). Однако если вы уже можете продемонстрировать работу биз-
нес-логики на оконном пользовательском интерфейсе, можете сразу соз-
дать необходимый проект.
6. Продемонстрируйте корректную работу бизнес-логики. Создайте
переменную-ссылку на интерфейс и присваивайте в нее экземпляры реали-
зуемых классов. Продемонстрируйте разную реализацию интерфейсных
свойств и методов. Для этого необходимо реализовать ввод с клавиатуры
значений, которыми будут инициализированы поля классов-наследников.
Варианты заданий
1. Геометрические фигуры с различными реализациями расчета
площади фигуры: круг, прямоугольник, треугольник.
2. Трехмерные фигуры с различными реализациями расчета объема:
шар, пирамида, параллелепипед.
3. Работники фирмы с различными способами начисления зарплаты:
почасовая оплата, оплата по окладу и ставке.
4. Транспортные средства с различными реализациями расчета за-
траченного топлива: машина, машина-гибрид, вертолет.
5. Система скидок с различными реализациями расчета скидок: про-
центная, по сертификату.
6. Система библиотечных карточек для разных изданий: книга, жур-
нал, сборник, диссертация. Каждое издание характеризуется различным
набором полей, перегружаемый метод возвращает информацию об изда-
нии в виде строки, оформленной по ГОСТу [3].
7. Различные пассивные элементы электрических схем: резистор,
конденсатор, индуктивность. Перегружаемый метод — расчет комплекс-
ного сопротивления элемента.
8. Расчет координаты для различных видов движения: равномерное,
равноускоренное, колебательное.
18
9. Расчет затраченных калорий в зависимости от вида упражнений:
бег (интенсивность, расстояние), плавание (стиль, расстояние), жим штан-
ги (вес, количество повторений).
Лабораторная работа № 2. Пользовательский
интерфейс
Целью данной работы является знакомство с разработкой оконных
приложений в среде Microsoft Visual Studio.
2.1 Создание оконного приложения
Для создания оконного приложения на основе уже существующей
логики (решения) необходимо добавить в него новый проект WinForms
(WinForms Application Project). Это можно сделать через контекстное меню
решения в Обозревателе решений либо через главное меню (File->Add->
->Create Project…). После нажатия на кнопку OK на форме добавления
проекта новый проект добавится в ваше решение.
Рассмотрим подробнее содержимое нового проекта. По-прежнему в
нем есть узел References и Properties. К этому добавился файл App.config,
Program.cs, Form1.cs.
• App.config — данный файл позволяет создавать конфигурации
приложения, что позволить менять некоторые параметры прило-
жения без его перекомпиляции, в лабораторных работах тема
конфигураций рассматриваться не будет.
• Program.cs — файл, содержащий метод Main. Именно отсюда за-
пускается главная форма приложения с помощью строки
Application.Run(new Form1());
• Form1.cs — файл в котором хранится код формы. Вообще для
описания логики формы используется 2 файла: Form1.cs, где
пользователь описывает логику взаимодействия элементов на
форме, и Form1.Designer.cs, который генерирует MSVS, когда
пользователь изменяет форму через дизайнер.
Для того, чтобы открыть дизайнер формы, необходимо дважды
кликнуть на узел формы в Обозревателе решений, чтобы открыть код с
пользовательской логикой к форме, необходимо либо выбрать форму в
Обозревателе решений и нажать F7, либо в контекстном меню выбрать
пункт Перейти к коду.
2.2 Дизайнер форм
При запуске дизайнера форм вы увидите окно, изображенное на
рис. 2.1.
Рисунок 2.1 — Окно дизайнера форм
Для эффективной работы с дизайнером окон, помимо самого дизай-
нера, необходимы окна Панель элементов (Toolbox) и Свойства
(Properties). В случае если эти окна не появились, можно настроить их ото-
бражение, используя Главное меню->Вид->Панель элементов и Главное
меню->Вид->Окно свойств.
21
На Панели инструментов находятся все доступные для использова-
ния элементы управления. Для добавления того или иного элемента на
форму его необходимо перетащить с панели инструментов.
В окне Свойства отображаются свойства выбранного элемента
управления (чтобы выбрать элемент, необходимо кликнуть на него в ди-
зайнере). Через это окно можно изменять основные свойства элементов,
например имя, по которому можно обратиться к этому элементу в коде, на-
звание элемента, читаемое для пользователя (например, Главная форма,
вместо Form1), размеры элемента, также можно задать его начальное зна-
чение. При размещении новых элементов пользовательского интерфейса
на форме Visual Studio генерирует их имена автоматически, например
gridControl1, button3 и т. д. Однако такие имена не отражают назначения
элемента и усложняют понимание кода. Необходимо переименовывать
элементы управления согласно нотации RSDN, это будет оцениваться в
лабораторных работах. В верхней части окна Свойства, можно перейти в
режим События, здесь отображаются все доступные события элемента и
их обработчики, также здесь можно назначить новый обработчик для лю-
бого события.
2.3 Валидация данных
При разработке интерфейса программы важнейшей задачей для про-
граммиста является обеспечение правильности вводимых пользователем
данных. В идеале, программист должен так спроектировать и запрограм-
мировать интерфейс, чтобы пользователь НЕ МОГ совершить ошибку, да-
же если бы захотел.
Для этого обязательно после ввода данных проводится проверка их
корректности. Реализовать проверку можно несколькими способами:
• при нажатии на определенную кнопку (например, Добавить объ-
ект) происходит проверка всех данных на форме и в случае обна-
22
ружения некорректных пользователю выводится сообщение с
ошибкой;
• при изменении конкретного поля. В данном случае проверки реа-
лизуются за счет событий. У любого элемента управления, кото-
рый позволяет вводить произвольные данные, существует собы-
тие, позволяющее проводить проверку корректности, например
это событие Validating у элемента TextBox или событие CellValidating
у элемента DataGridView. Данные события срабатывают,
когда текущий элемент управления теряет фокус, то есть когда
пользователь переключается на любой другой элемент, например
другое поле ввода или кнопку. Преимущество использования это-
го подхода в том, что в случае ввода некорректных данных поль-
зователь СРАЗУ видит, в каком поле ошибка и может оперативно
её поправить, в то время как при использовании первого подхода
ошибка проявляется после того, как все данные введены, при
этом пользователю придется разбираться в чем ошибка и искать
необходимое поле;
• третий подход заключается в том, что пользователь не может
ввести то, чего быть не должно. Для этого используются более
сложные пользовательские элементы, например поля ввода с
проверкой на основе регулярных выражений [1, 2, 3]. Такой под-
ход самый лучший, потому что пользователь просто не может
написать неправильно. Например, ясно, что в имени не может
быть цифр, тогда полю, которое отвечает за ввод имени, присваи-
вается соответствующее регулярное выражение, и при нажатии
цифр элемент управления сверяется со своим регулярным выра-
жением и просто игнорирует некорректные данные, введенные
пользователем. Простым случаем такого элемента управления
может служить MaskedTextBox. MaskedTextBox — аналог обыч-
23
ного TextBox, однако позволяет использовать специальные маски
ввода, запрещающие вводить в поле цифры или, наоборот, сим-
волы. Именно его рекомендуется использовать при реализации
заданий лабораторной работы.
При этом стоит отметить, что нельзя полагаться только на один под-
ход, в любом случае необходимо комбинировать эти подходы для обеспе-
чения большей безопасности ввода данных.
Также следует отметить, что все предупреждения об ошибках долж-
ны нести явный смысл, они должны сообщать, где произошла ошибка и в
чем конкретно ошибка. То есть сообщение типа «Age error» абсолютно не-
корректно, потому что непонятно, в чем именно ошибка возраста. Лучше
использовать сообщения типа «Age value must be greater than zero.», в этом
сообщении ясно видно, в чем именно заключается ошибка.
В случае появления ошибки необходимо сообщить о ней пользовате-
лю, для этого можно использовать класс MessageBox. Пример использова-
ния приведен ниже.
MessageBox.Show(errorText, errorWindowCaption, MessageBoxButtons.OK,
MessageBoxIcon.Error);
В данном случае errorText — текст ошибка, errorWindowCaption —
название окна ошибки. MessageBox очень удобный класс для обеспечения
взаимодействия с пользователем, потому что легко настраивается за счет
параметров, например изменением третьего параметра можно добавить
окошку кнопок, а четвертого — изменить картинку на форме таким обра-
зом, что окошко будет не сигнализировать об ошибке, а предлагать допол-
нительную информацию или спрашивать пользователя о некоторых неоче-
видных действиях (например, следует ли сохранить несохраненный проект
при закрытии программы).
24
2.4 Условная компиляция
Иногда у разработчика возникает необходимость откомпилировать
код так, чтобы для разных конфигураций одни участки кода компилирова-
лись, а другие — нет. Для этого используются директивы препроцессора и
механизм под названием «условная компиляция».
В С# существуют следующие директивы: #define, #if, #else, #endif.
Их смысл в общем-то ясен. Рассмотрим пример условной компиляции.
#define PARAM1
#if PARAM1
Console.Write(“Defined PARAM1”);
#else
Console.Write(“Not defined PARAM1″);
#endif
В таком виде скомилированный код при вызове программы выведет
на экран строку: «Defined PARAM1», если же закомментировать первую
строку в листинге и заново скомпилировать приложение и запустить, то
выведется строка «Not defined PARAM1». То есть на основе одного и того
же кода, путем задания констант с помощью директивы #define можно по-
лучать программы с различной функциональностью. Чаще всего это ис-
пользуется, когда необходимо использовать в универсальном приложении
платформозависимые вещи, например запись на диск в мобильном прило-
жении, для платформ Android и iOS, в этом случае код может выглядеть
следующим образом:
#define ANDROID
#if ANDROID
//используем API ОС Android
#else
//используем API ОС iOS
#endif
Очень часто при написании приложения версия Debug, используемая
разработчиками для отладки, отличается от версии Release, которая по-
ставляется конечному пользователю. Переключиться между ними можно
25
на панели инструментов, находящейся вверху в центре экрана. Эти версии
отличаются обычно тем, что в Debug больше разнообразных проверок на
корректность данных и, возможно, есть элементы управления, которые
нужны исключительно для отладки, но ненужные конечному пользовате-
лю. И чтобы не удалять их всякий раз, когда компилируешь программу в
Release, используется условная компиляция. Для этого в MSVS существует
константа DEBUG, автоматически определяемая в соответствующем ре-
жиме. Используя этот механизм, можно, например, спрятать кнопку, кото-
рая генерирует отладочную информацию, следующим образом:
public class AddObjectForm : Form
{
…
public AddObjectForm()
{
InitializeComponent();
…
#if !DEBUG
CreateRandomDataButton.Visible = false;
#endif
}
…
}
В этом коде мы используем директивы препроцессора #if, указывая
тот код, который будет скомпилирован только для сборки Release. В на-
шем случае, мы устанавливаем для созданной кнопки CreateRandomDataButton
поле Visible в состояние false.
2.5 Сериализация
Сериализация представляет собой процесс преобразования объекта в
поток байтов для хранения объекта или передачи его в память, базу дан-
ных или файл. Ее основное назначение — сохранить состояние объекта
для того, чтобы иметь возможность воссоздать его при необходимо-
сти. Обратный процесс называется десериализацией. С помощью сериали-
зации разработчик может выполнять такие действия, как отправка объекта
26
удаленному приложению посредством веб-службы, передача объекта из
одного домена в другой, передача объекта через брандмауэр в виде XML-
строки и хранение информации о безопасности или конкретном пользова-
теле, используемой несколькими приложениями.
Сериализация бывает нескольких видов:
• Двоичная сериализация. При двоичной сериализации использует-
ся двоичная кодировка, обеспечивающая компактную сериализа-
цию объекта для хранения или передачи в сетевых потоках на ос-
нове сокетов.
• XML-сериализация. При XML-сериализации открытые поля и
свойства объекта или параметры и возвращаемые значения мето-
дов сериализуются в XML-поток. XML-сериализация приводит к
образованию строго типизированных классов с открытыми свой-
ствами и полями, которые преобразуются в формат XML. Для
управления процессом сериализации или десериализации можно
применять атрибуты к классам и членам класса.
• SOAP-сериализация. XML-сериализация может также использо-
ваться для сериализации объектов в потоки XML, которые соот-
ветствуют спецификации SOAP. SOAP — это протокол, основан-
ный на XML и созданный специально для передачи вызовов про-
цедур с использованием XML. Как и в обычной XML-
сериализации, атрибуты можно использовать для управления
формой SOAP-сообщений в литеральном стиле, генерируемых
веб-службой XML.
Рассмотрим пример сериализации объекта класса Person на примере
XML-сериализация. Класс Person описан ниже.
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
27
public int Age { get; set; }
}
Для того чтобы сериализовать данный объект, можно воспользовать-
ся следующим кодом:
var writer = new
System.Xml.Serialization.XmlSerializer(typeof(Person));
using (var file = System.IO.File.Create(_filePath)
{
writer.Serialize(file, _person);
file.Close();
}
В данном примере данные, которые хранятся в объекте _person, со-
храняются в файл с именем _filePath. Адрес файл должен служить пара-
метром метода для сериализации, потому что пользователь должен иметь
возможность выбирать, куда именно и под каким именем данные должны
быть сохранены.
Для десериализации можно воспользоваться следующим кодом:
var reader = new
System.Xml.Serialization.XmlSerializer(typeof(Person));
var file = new System.IO.StreamReader(_filePath);
_person = (Person)reader.Deserialize(file);
В данном случае, данные загружаются из файла с именем _filePath и
присваиваются объекту _person.
При этом в процессе сериализации в той директории, которую ука-
жет пользователь, появится файл с именем, которое хранилось в перемен-
ной _filePath. Этот файл можно открыть с помощью блокнота, и он может
выглядеть следующим образом:
<?xml version=”1.0”?>
<Person>
<Name>Jonh</Name>
<Surname>Connor</Surname>
<Age>16</Age>
</Person>
28
Хорошо видно, что xml-сериализация точно повторяет структуру со-
храняемого объекта и представляет его в удобном для чтения виде.
2.6 Задание на лабораторную работу
1. Создайте в решении новый проект WinForms (WinForms
Application Project) и задайте ему соответствующее имя. Если проект биз-
нес-логики назван как Model, для проекта пользовательского интерфейса
логично дать название View. Данный подход в проектировании архитекту-
ры приложения называется Model-View: когда бизнес-логика и пользова-
тельский интерфейс разделены на разные сборки. В дальнейшем такой
подход облегчает ориентирование в рамках проекта. Обратите внимание,
что теперь данный проект должен быть стартовым, для этого установите
его запускаемым проектом по умолчанию.
ПРИМЕЧАНИЕ: ранее созданный проект ConsoleLoader теперь мож-
но удалить. Удаление проекта из решения не приводит к его физическому
удалению с носителя, в отличие от классов проекта. Помните об этом при
удалении каких-либо компонентов проекта.
2. Добавьте в проект View новую форму. Название формы должно
отражать назначение формы и оканчиваться словом Form. Как и имена
других классов, имя формы оформляется в стиле Pascal.
3. Добавьте на форму элемент GridControl из панели инструментов.
Для повышения удобства пользовательского интерфейса лучше сначала
разместить на форме элемент GroupBox, в который поместить GridControl.
Это позволит поместить в заголовок GroupBox фразу, поясняющую назна-
чение GridControl. Под GridControl разместите две кнопки Button. Назовите
кнопки Add Object и Remove Object, где вместо Object подставьте название
того объекта, который реализован в вашей бизнес-логике.
29
4. Создайте внутри формы поле, хранящее список (List) сущностей,
соответствующих вашему варианту. Список должен иметь возможность
хранения в себе всех дочерних классов вашей сущности (все виды геомет-
рических фигур, все типы работников, все виды скидок и т. д.).
5. Необходимо реализовать следующую логику формы: GridControl
должен отображать (без возможности редактирования) все объекты соз-
данного списка. Кнопка Add Object должна добавлять новый объект в
GridControl и в список объектов. Кнопка Remove Object должна удалять
выбранный в GridControl объект и удалять его из списка объектов.
6. Для добавления новых объектов в программу нужно разработать
специальную форму, которая вызывалась бы по нажатию клавиши Add
Object. В форме должна присутствовать возможность заполнения полей,
общих для всех дочерних классов, выбор в виде ComboBox или
RadioButton типа объекта и, в зависимости от типа объекта, должна появ-
ляться возможность заполнения полей данного типа объекта. Например,
если создается новый работник, то в форме обязательно есть поля ФИО и
даты принятия на работу, но в зависимости от RadioButton с типом оплаты
должны появляться поля либо почасовой оплаты, либо оплаты по ставке.
7. На форме создания нового объекта должны присутствовать кнопки
Ok и Cancel. Если пользователь нажмет кнопку Ok — в главной форме дол-
жен быть добавлен созданный объект. Если пользователь нажмет Cancel —
должна быть выполнена отмена добавления.
8. Форма создания нового объекта должна учитывать ограничения на
значения полей объекта (например, неотрицательный размер стороны гео-
метрической фигуры). Фактически, здесь должна производиться обработка
исключений при попытке ввода неправильных значений.
9. Особое внимание обратите на визуальную аккуратность создавае-
мых вами пользовательских интерфейсов. Старайтесь выравнивать эле-
менты по левому краю относительно друг друга, делать одинаковые отсту-
30
пы между элементами, правильно подписывать элементы, кнопки и заго-
ловки. Грамотно рассчитывайте размеры элементов — если в TextBox
должно вводиться целое число со значением до 100, не имеет смысла де-
лать его длиннее 50 пикселей. Также поля для фамилии должны быть под-
ходящего размера, чтобы корректно отображать обычную фамилию, — не
слишком длинные, но и не слишком короткие. Аккуратность и удобство
пользовательского интерфейса может стать решающим фактором в выборе
именно вашей программы конечным пользователем.
10. При тестировании и отладке программы не очень удобно вручную
добавлять новые объекты — необходимость каждый раз вводить данные для
10 объектов может сильно пошатнуть психическое состояние разработчика
(или вашего преподавателя). Чтобы облегчить тестирование программы, а
значит, и собственную разработку, добавьте на форму создания нового объ-
екта кнопку Create Random Data. По нажатию данной кнопки все поля будут
заполняться случайными правильными данными для объекта. Пользователю
останется только нажать кнопку Ok для добавления нового объекта на глав-
ную форму.
11. Кнопка Create Random Data является отладочной, и в версии, кото-
рая будет поставляться конечному пользователю, этой кнопки быть не долж-
но — не будет же бухгалтерия создавать «случайных» работников со «слу-
чайными» зарплатами! Удалять же и заново создавать эту кнопку при необ-
ходимости нового установщика опять же не очень удобно — вы можете про-
сто забыть это сделать. Используйте механизм условной компиляции.
12. Добавьте форму, на которой можно будет провести поиск объек-
та по каждому из полей общих для всех дочерних классов. Помните, что
результатом поиска может быть не один объект. Добавьте на главную
форму кнопку для вызова формы поиска.
13. Добавьте возможность сохранения и загрузки введенных пользо-
вателем данных, используя любой механизм сериализации, на ваше усмот-
31
рение. Сохранять данные необходимо в файл с расширением, которое бу-
дет характерно только для вашей программы (не надо использовать из-
вестные форматы, например *.doc, *.txt или *.xml).
2.7 Список используемых источников
1. Регулярные выражения. Википедия, свободная энциклопедия
[Электронный ресурс]. — URL: https://ru.wikipedia.org/wiki/Регуляр-
ные_выражения (дата обращения 29.12.2014).
2. Элементы языка регулярных выражений — краткий справочник.
Microsoft Software Developer Network [Электронный ресурс]. — URL:
http://msdn.microsoft.com/ru-ru/library/az24scfc(v=vs.110).aspx (дата обра-
щения 29.12.2014).
3. Регулярные выражения в .NET Framework. Microsoft Software Developer
Network [Электронный ресурс]. — URL:
http://msdn.microsoft.com/ru-ru/library/hs600312(v=vs.110).aspx (дата обра-
щения 29.12.2014).
Здравствуйте. Скажите пожалуйста, планирую поступать в магистратуру на факультет Психологии « Психология личности»в РГГУ скажите пожалуйста, есть ли у вас, ответы на вступительные экзамены? так как, планирую, сделать акцент на бюджет. Спасибо.
Арсений, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Дистанционная помощь в защите ВКР
Анастасия, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте. Нужна срочно практическая часть вкр, третья глава. Скину похожие работы, на которые можно ориентироваться
Александр, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
вкр по теме: экологический туризм России : анализ состояния, проблемы и перспективы
Людмила, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте вы защищаете ВКР?
Ольга, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать магистерскую ВКР на тему «Совершенствование логистических бизнес-процессов на примере торговой компании». Не менее 100 страниц.
Миша, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Здравствуйте нужна работа Вкр
Лена, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.
Написать ВКР 3 раздела Тема строительство строительство жилого дома с применением каркасно-монолитных технологий Антиплагиат от 75% ПЗ и чертежи
Владимир, здравствуйте! Прошу Вас прислать всю необходимую информацию на почту info@otlichnici.ru и написать что необходимо выполнить. Я посмотрю описание к заданиям и подскажу вам по стоимости и срокам выполнения.