maran program engineering (Маран Программная инженерия), страница 14
Описание файла
PDF-файл из архива "Маран Программная инженерия", который расположен в категории "". Всё это находится в предмете "программная инженерия" из 4 семестр, которые можно найти в файловом архиве НИУ «МЭИ» . Не смотря на прямую связь этого архива с НИУ «МЭИ» , его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 14 страницы из PDF
В качестве типаданных пишем double, поля имя, видимость, стереотип выберем как раньше, нообратим внимание на свойство кратность. По умолчанию оно равно единице.Можем дать там, в принципе, любое значение больше единицы (это — количество элементов) или писать знак *, что означает, что количество элементов неопределено. Такому компоненту класса в программе соответствует стандартный интерфейс IEnumerable.Приступаем к добавлению функций. Добавим в класс Dan функцию вычисления индекса массы тела funMI. Тип возвращаемого значения double, параметров она не имеет, стереотип метод C#.
Свойства имя и видимость нам ужезнакомы. У всех функций имеются свойства постусловия и предусловия, о нихмы говорили выше в разделе о языке OCL. Можно заполнить и эти свойства, ноони не влияют на генерацию программ и поэтому могут рассматриваться каккомментарии.Добавим в класс MyClass функцию fun1, у которой нет возвращаемогозначения, но она имеет формальные параметры:• массив arr типа double;• n типа int, исходное значение для функции (передача по значению);• w типа double, значение будет получено в функции;• t типа double, значение которой должна быть задано при обращении кфункции, но она может там измениться.69Добавим функцию fun1, определим ее свойства: имя, видимость, стереотип, возвращаемое значение, как было описано выше.
Имеется свойство параметры, имеющее диалоговое окно для их определения. Откроем это окно. Видим там кнопки Добавить (Add) и Удалить (Remove). Нажмем на кнопку Добавить, в результате появится новый параметр с именем Parameter1. Справа имеется окно свойств параметра.Имя arr. Тип данных double[]. Остальные значения можем оставить поумолчанию.Имя n, тип данных int.
Остальные значения можем оставить по умолчанию.Имя w, тип данных double. Направление out, что означат, что его значениебудет определено в функции и не должно быть определено при обращении. Каквы заметили, по умолчанию это свойство имеет значение in, что и требовалосьв предыдущих случаях.Имя t тип данных double. Направление inout, что означает, что этот параметр должен иметь значение при обращении к функции, но функция может егоизменить.Рассмотрим использование отношений между классами. Отношениеобобщения означает наследование. Кроме него на диаграмме классов проектирования рекомендуется использовать только отношение агрегации (композиции) и избегать мощности «многие ко многим», как это делать — см. выше.Добавим на нашу диаграмму 3 класса для показа названных отношений.
Обратите внимание на то, что у класса ClassA кратность отошения равна 1, а у класса ClassB задана *.Результат представлен на рис. 4.9.Рис. 4.9Поставим курсор мыши на имя диаграммы UML Class Diagram1, нажмемна правую клавишу и выберем пункт Создать код (Generate Code). В обозревателе решения появится новый раздел Mod48Lib (Modlib — имя созданного намипроекта проектирования), где и появятся сгенерированные классы:public class Dan70{public object Fam;public object Imya;public object Rost = 0;public object Ves;public virtual double MasInd{get;set;}public virtual double funMI(){throw new System.NotImplementedException();}}//---------------------------------------------public class MyClass : ClassX//наследование{public double[] mas; // обычный массивpublic List<Dan> lst1; // список из элементов класса Danpublic IEnumerable<double> collect;//коллекция, кратность>1public ClassA x{get;set;}public virtual IEnumerable<ClassB>ClB// свойство типа класс, кратность>1// генерируется автоматически{get;set;}public virtual void fun1(double[] arr1, int n,out double w, ref double t)// заголовок функции по правилам C#{throw new System.NotImplementedException();} }71При внесении изменений в диаграмму классов и повторной генерацииизменения будут учтены.
Однако при внесении изменений в тексты программони не могут быть перенесены в диаграммы.Таким образом, целесообразно создать первоначальную диаграмму классов проектирования. После генерации кода можно перейти к другой разновидности диаграммы классов, где возможности для работы с ними заметно шире.Для этого поставим курсор мыши на имя сгенерированного класса, нажмем направую клавишу и выберем Перейти к диаграмме классов (Show ClassDiagram).
Результат показан на рис. 4.10, внесенные в диаграмму изменения автоматически передаются в текст программы и наоборот. Если на этой диаграмме классов поставить курсор мыши на символ класса и нажать на правую клавишу, то в контекстном меню предлагается добавить в класс поля, методы,свойства, конструктор, деструктор и т. д. Кроме того, там появился новыйпункт «Сведения о классе» (Class Details) при выборе которого появится окно,приведенное на рис. 4.11. Как видно из рисунка, там подробно представленывсе компоненты класса и их характеристики. Там можно их изменить, и эти изменения автоматически передаются на диаграмму классов и сами тексты сгенерированных программ.
Обратите внимание на запись «Добавить …(Add)»: нажав на нее можно увеличить количество всех составных частей. На самой диаграмме классов (рис. 4.10) можно также менять состав классов и их компонентов, как это было описано выше.Рассмотрим создание диаграммы последовательностей. На диаграммеклассов, приведенной на рис. 4.9 и 4.10, мы главное внимание уделили составукласса. Для рассмотрения диаграммы последовательностей нам потребуется несколько классов с функциями.
Поэтому составим вспомогательную диаграммуклассов, представленную на рис. 4.12. Обратите внимание, что между классамиClass1 и Class2 имеется отношение наследования.Рис. 4.1072Рис. 4.11Рис. 4.12Для создания этой диаграммы, как обычно, поставим курсор на имя проекта, нажмем на правую клавишу, выберем по очереди добавить — новый элемент — диаграмма последовательностей. Для первоначального заполнениятолько что созданной диаграммы имеются две возможности.Можно поставить на диаграмме классов курсор мыши на класс и выбратьиз контекстного меню пункт «Создать линию жизни», следует вопрос: на какуюдиаграмму линию жизни ставить, ответим на него.73Можно открыть пустую диаграмму последовательностей, из палитры инструментов перенести на нее компонент «Линия жизни» и заполнить свойстваИмя и Тип.
Тип можно выбрать из существующих классов.Конечный результат не зависит от способа создания. Текст Obj1:Class1означает, что это объект Obj1 класса Class1. Напомним, что на этой диаграммевремя течет сверху вниз, и все сообщения должны быть размещены в такой последовательности. Сообщению всегда должен соответствовать метод в классеадресате. Сообщения бывают синхронными (класс-отправитель ждет ответа откласса-адресата) и асинхронными (класс отправляет сообщение и продолжаетработу).
Сообщения наносим на диаграмму точно так, как мы и ранее наносиливсе связи: выберем нужную разновидность сообщения и протягиваем его от отправителя до адресата. Сообщениям будут присвоены имена Message1, …, которые можно менять. Сообщения имеют свойство «Операция» с выпадающимсписком, включающем функции класса-адресата (как собственные, так и наследованные). Диаграмма последовательностей считается корректной, если каждойлинии жизни (объекту) соответствует класс и каждому сообщению функция. Нанашей диаграмме сообщение Message1 синхронное, остальные — асинхронные.Сообщению Message1 соответствует функция fun1(), наследованная классомClass2 от класса Class1.
Составленная диаграмма представлена на рис. 4.13.Рис. 4.13При этом не следует забывать об одной тонкости: все объекты должныбыть созданы до того, когда им можно будет передавать сообщения. По сутиэто означает, что должен быть запушен конструктор класса и инициирован минимальный для работы набор его данных.
Кроме того, класс-отправитель должен иметь доступ к переменной типа класс-адресат. Можно рекомендовать дваспособа решения этой проблемы:74• первое сообщение запускает конструктор класса-адресата;• имеется «центральный» класс, из которого будут запущены конструкторывсех необходимых классов с последующей передачей полученных адресов объектов с учетом будущих передач сообщений.Пример можно найти в разделе создания многооконных интерейсов(п. 5.2.1 и 5.2.2): создание нового окна, определение его свойств и вызов методов.755. Реализация на языке C# в средеMicrosoft Visual Studio5.1. Простейший пример5.1.1. Постановка задачиВизуальное программирование похоже на рассмотренное выше составление диаграмм.
«Перетаскиваем» с палитры инструментов на создаваемую форму компоненты, уточним их свойства и определим связанные с ними события.Создаем в Microsoft Visual Studio проект Windows Forms для C#. Поставим перед собой цель — создать простейший пример, главная форма которого приведена на рис. 5.1.Рис. 5.1Для начала поменяем свойство формы Text на My first Example и увидим,что изменился заголовок формы. Ограничимся рассмотрением компонентовLabel, TextBox и Button.
Label (метка) предназначена для нанесения на формупояснительных текстов и вывода результатов. Во время работы приложения невозможно редактировать содержимое меток. TextBox (строка редактирования)предназначена для ввода/вывода, тип данных в нем — всегда string, и все преобразования должны выполняться программистом. Компоненту Button (командная кнопка) можно ставить в соответствие функцию, которая будет выполнена при нажатии на кнопку.