Разработка информационно-аналитической системы MCControl

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Курсовой проект

Разработка информационно-аналитической системы MCControl

Введение

Цель курсового проекта — изучить принципы разработки вышеописанного программного обеспечения, паттерны проектирования, разработать прототип информационно — аналитической системы.

Задачи курсового проекта:

· Получить навыки в работе с пакетом программ Microsoft Visual Studio 2012, Microsoft SQL Server 2012, VisualHG

· Получить навыки в работе с технологиями WPF, Entity Framework, ADO. NET.

· Изучить необходимые для разработки паттерны проектирования (такие как «Фабрика», «Синглтон», «MVVM») и получить навыки работы с ними

· Разработать прототип информационно — аналитической системы.

В первом разделе курсового проекта можно ознакомиться с технологиями, используемыми в ходе разработки приложения. Во втором разделе описываются приемы, подходы и паттерны проектирования, используемые в ходе разработки приложения, а также современное программное обеспечение для управления проектами. В последнем разделе описан прототип информационно — аналитической системы для поддержки процесса техобслуживания и ремонта дискретного производства малого производственного предприятия (ТОиР).

1. Технологии: WPF, Entity Framework, ADO. NET

программный информационный дискретный паттерн

Windows Presentation Foundation (WPF) -- система для построения клиентских приложений Windows с визуально привлекательными возможностями взаимодействия с пользователем, графическая (презентационная) подсистема в составе. NET Framework (начиная с версии 3. 0), использующая язык XAML.

WPF предустановлена в Windows Vista (. NET Framework 3. 0), Windows 7 (. NET Framework 3.5 SP1), Windows 8 (. NET Framework 4.0 и 4. 5). С помощью WPF можно создавать широкий спектр как автономных, так и запускаемых в браузере приложений.

Особенности технологии

В основе WPF лежит векторная система визуализации, не зависящая от разрешения устройства вывода и созданная с учётом возможностей современного графического оборудования. WPF предоставляет средства для создания визуального интерфейса, включая язык XAML (Extensible Application Markup Language), элементы управления, привязку данных, макеты, двухмерную и трёхмерную графику, анимацию, стили, шаблоны, документы, текст, мультимедиа и оформление.

Графической технологией, лежащей в основе WPF, является DirectX, в отличие от Windows Forms, где используется GDI/GDI+. Производительность WPF выше, чем у GDI+ за счёт использования аппаратного ускорения графики через DirectX.

Также существует урезанная версия CLR, называющаяся WPF/E, она же известна как Silverlight.

Использование разметки XAML

XAML представляет собой XML, в котором фактически реализованы классы. NET Framework. Также реализована модель разделения кода и дизайна, позволяющая кооперироваться программисту и дизайнеру. Кроме того, есть встроенная поддержка стилей элементов, а сами элементы легко разделить на элементы управления второго уровня, которые, в свою очередь, разделяются до уровня векторных фигур и свойств/действий. Это позволяет легко задать стиль для любого элемента, например, Button (кнопка).

Средства разработки

Для работы с WPF требуется любой. NET-совместимый язык. В этот список входит множество языков: C#, VB, C++, Ruby, Python, Delphi (Prism), Lua и многие другие. Для полноценной работы может быть использована как Visual Studio, так и Expression Blend. Первая ориентирована на программирование, а вторая -- на дизайн и позволяет делать многие вещи, не прибегая к ручному редактированию XAML. Примеры этому -- анимация, стилизация, состояния, создание элементов управления и так далее.

Возможности

WPF предоставляет широкий спектр возможностей по созданию интерактивных настольных приложений:

Привязка данных

Это гибкий механизм, который позволяет через расширения разметки XAML связывать различные данные (от значений свойств элементов управления до общедоступных свойств, реализующих поля базы данных через Entity Framework). Привязка данных представлена классом Binding, который в свою очередь унаследован от MarkupExtension, что позволяет использовать привязки не только в коде, но и в разметке:

< StackPanel Orientation="Horizontal">

< Slider x: Name="slider" Width="200″ Minimum="1″ Maximum="100″ Value="60"/>

< TextBox Text="{Binding ElementName=slider, Path=Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

< /StackPanel>

Помимо основного класса Binding в WPF реализовано еще несколько механизмов привязок:

MultiBinding — позволяет создавать множественные привязки, указывая несколько элементов

TemplateBinding — используется в шаблонах для связывания свойства элемента внутри шаблона со свойством элемента, к которому применен шаблон

PriorityBinding — ранжирует список привязок и выбирает из них свойство (согласно приоритету) к которому будет применена привязка. Если привязка, имеющая наивысший приоритет успешно возвращает значение, то нет необходимости обрабатывать другие привязки в списке.

Стили

Позволяют создавать стилевое оформление элементов и, как правило, используются только в разметке:

< Button>

< Button. Style>

< Style TargetType="Button">

< Setter Property="FontSize" Value="20"/>

< Setter Property="Foreground" Value="LimeGreen"/>

< /Style>

< /Button. Style>

< /Button>

Если стиль задается в ресурсах (например в словаре ресурсов), то можно использовать атрибут x: Key для указания уникального ключа. Затем в элементе управления, к которому необходимо применить стиль, нужно использовать расширение разметки StaticResource для связывания с этим стилем. Если использовать этот прием, то стили не будут нагромождать разметку.

Шаблоны элементов управления

Позволяют менять графическое оформление элементов и представлены классом ControlTemplate. В отличие от стилей, можно менять не только графическое представление элемента, но и его структуру. При этом шаблон элемента управления задается через свойство Template.

Простой пример круглой кнопки:

< Button Content="Hey!" Background="LimeGreen" Foreground="White">

< Button. Template>

< ControlTemplate TargetType="Button">

< Grid>

< Ellipse Fill="{TemplateBinding Background}" Stroke="{TemplateBinding BorderBrush}" Stretch="Fill"/>

< ContentPresenter VerticalAlignment="Center" HorizontalAlignment="Center"/>

< /Grid>

< /ControlTemplate>

< /Button. Template>

< /Button>

Шаблоны данных

В отличие от шаблонов элементов управления, задаются для определенного контекста данных (который в блочных элементах управления задается через свойство DataContext, а в списковых через ItemsSource). Сам шаблон данных представлен классом DataTemplate. Для обозначения типа данных, к которому необходимо применить шаблон, используется свойство DataType.

Ресурсы

Система ресурсов позволяет объединять шаблоны, стили, кисти, анимацию и многие другие интерактивные элементы, что существенно упрощает работу с ними. Ресурсы задаются в свойстве Resources класса FrameworkElement, от которого унаследованы все элементы управления, панели компоновки и даже класс Application. Это позволяет создавать многоуровневую систему ресурсов:

ресурсы внутри объекта — действительны только для этого объекта

ресурсы внутри панели компоновки (например Grid) — позволяет задать границу контекста ресурсов на уровне этой панели

ресурсы внутри окна Window — если в приложении используется несколько окон, то ресурсы одного окна не будут доступны ресурсам другого окна

< Window. Resources>

< SolidColorBrush x: Key="SampleBrush" Color="LimeGreen"/>

< /Window. Resources>

< Button Content="Hey!" Background="{StaticResource SampleBrush}" />

ресурсы приложения — доступны повсеместно (как правило задаются в отдельном словаре ресурсов).

ADO. NET Entity Framework (EF) -- объектно-ориентированная технология доступа к данным, является object-relational mapping (ORM) решением для. NET Framework от Microsoft. Предоставляет возможность взаимодействия с объектами как посредством LINQ в виде LINQ to Entities, так и с использованием Entity SQL. Для облегчения построения web-решений используется как ADO. NET Data Services (Astoria), так и связка из Windows Communication Foundation и Windows Presentation Foundation, позволяющая строить многоуровневые приложения, реализуя один из шаблонов проектирования MVC, MVP или MVVM.

История

Релиз ADO. NET Entity Framework состоялся 11 августа 2008 года в составе. NET Framework 3.5 Service Pack 1 и Visual Studio 2008 Service Pack 1. В VS 2008 вошёл EDM Wizard для реверс-инжиниринга существующих баз данных и EDM Designer для редактирования сгенерированных моделей или создания их с нуля.

23 июня 2008 года, ещё до релиза первой версии, на стадии финальной доводки Entity Framework V1, начался процесс разработки Entity Framework V2.0. По словам англ. Tim Mallalieu, программного менеджера LINQ to SQL и EF, в. NET Framework 4.0 именно Entity Framework станет рекомендуемой технологией доступа к реляционным СУБД посредством LINQ.

12 апреля 2010 года в составе релиза Visual Studio 2010 и. NET Framework 4.0 был представлена Entity Framework 4.0. Позже уже отдельно от фреймворка были представлены версии: 4.1 (апрель 2011), 4.2 (октябрь 2011), 4.3 (февраль 2012).

Entity SQL

Entity SQL представляет собой язык, подобный языку SQL, который позволяет выполнять запросы к концептуальным моделям в Entity Framework.

LINQ to Entities

Это альтернативный интерфейс LINQ API, используемый для обращения к базе данных. Он отделяет сущностную объектную модель данных от физической базы данных, вводя логическое отображение между ними. Так например, схемы реляционных баз данных не всегда подходят для построения объектно-ориентированных приложений и в результате мы имеем объектную модель приложения существенно отличающуюся от логической модели данных, в этом случае используется LINQ to Entities, который использует модель EDM (Entity Data Model). То есть, если вам нужно ослабить связь между вашей сущностной объектной моделью данных и физической моделью данных, например, если ваши сущностные объекты конструируются из нескольких таблиц или вам нужна большая гибкость в моделировании ваших сущностных объектов используйте LINQ to Entities.

ADO. NET -- это набор классов, предоставляющих службы доступа к данным программисту, работающему на платформе. NET Framework. ADO. NET имеет богатый набор компонентов для создания распределенных приложений, совместно использующих данные. Это неотъемлемая часть платформы. NET Framework, которая предоставляет доступ к реляционным данным, XML-данным и данным приложений. ADO. NET удовлетворяет различные потребности разработчиков, включая создание клиентских приложений баз данных, а также бизнес-объектов среднего уровня, используемых приложениями, средствами, языками и браузерам.

ADO. NET предоставляет согласованный доступ к таким источникам данных, как SQL Server и XML, а также к источникам данных, предоставляемым при помощи OLE DB и ODBC. Пользовательские приложения, использующие общие данные, могут использовать ADO. NET для соединения с этими источниками данных и для получения, обработки и обновления имеющихся в них данных.

ADO. NET разделят доступ к данным и обработку данных на дискретные компоненты, которые могут использоваться отдельно или совместно. ADO. NET включает поставщиков данных. NET Framework для соединения с базой данных, выполнения команд и получения результатов. Эти результаты, помещенные в объект ADO. NET DataSet, обрабатываются непосредственно, чтобы они могли быть предоставлены пользователю нерегламентированным образом, объединенные с данными из многих источников или передаваемые между уровнями. Объект DataSet также может независимо использоваться поставщиком данных. NET Framework для управления локальными для приложения данными или данными, источником которых является XML.

Классы ADO. NET имеются в System. Data. dll и интегрируются с классами XML, имеющимися в System. Xml. dll. Сведения об образце кода, который соединяется с базой данных, получает из нее данные, а затем отображает эти данные в консоли, см. в разделе Примеры кода ADO. NET.

Для разработчиков, которые пишут управляемый код, ADO. NET предоставляет функциональный набор, сходный с функциональным набором, который предоставляют объекты данных ActiveX (ADO) разработчикам моделей объектов собственных компонентов (COM). Для доступа к данным в приложении. NET мы рекомендуем использовать ADO. NET, а не ADO.

ADO. NET предоставляет самый прямой способ доступа к данным в. NET Framework. Сведения о более высоком уровне абстракции, который позволяет приложениям работать с концептуальной моделью, а не с базовой моделью хранения, см. в разделе Платформа ADO. NET Entity Framework.

2. Шаблоны проектирования и современные технологии для управления проектами

Шаблон проектирования или паттерн (англ. design pattern) в разработке программного обеспечения -- повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.

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

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

На наивысшем уровне существуют архитектурные шаблоны, они охватывают собой архитектуру всей программной системы.

Алгоритмы по своей сути также являются шаблонами, но не проектирования, а вычисления, так как решают вычислительные задачи.

Абстрактная фабрика(англ. Abstract factory) -- порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемыми объектами, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся наследники от него классы, реализующие этот интерфейс.

Назначение

Предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов.

Плюсы

изолирует конкретные классы;

упрощает замену семейств продуктов;

гарантирует сочетаемость продуктов.

Минусы

сложно добавить поддержку нового вида продуктов.

Применимость

Система не должна зависеть от того, как создаются, компонуются и представляются входящие в нее объекты.

Входящие в семейство взаимосвязанные объекты должны использоваться вместе и вам необходимо обеспечить выполнение этого ограничения.

Система должна конфигурироваться одним из семейств составляющих ее объектов.

Требуется предоставить библиотеку объектов, раскрывая только их интерфейсы, но не реализацию.

Одиночка (англ. Singleton) -- порождающий шаблон проектирования, гарантирующий что в однопоточном приложении будет единственный экземпляр класса с глобальной точкой доступа.

Цель

Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Существенно то, что можно пользоваться именно экземпляром класса, так как при этом во многих случаях становится доступной более широкая функциональность. Например, к описанным компонентам класса можно обращаться через интерфейс, если такая возможность поддерживается языком.

Плюсы

контролируемый доступ к единственному экземпляру.

Минусы

глобальные объекты могут быть вредны для объектного программирования, в некоторых случаях приводя к созданию немасштабируемого проекта;

усложняет написание модульных тестов и следование TDD.

Применение

должен быть ровно один экземпляр некоторого класса, легко доступный всем клиентам;

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

Примеры использования

Ведение отладочного файла для приложения.

Адаптер (англ. Adapter или англ. Wrapper -- Обёртка) -- структурный шаблон проектирования, предназначенный для организации использования функций объекта, недоступного для модификации, через специально созданный интерфейс.

Задача

Система поддерживает требуемые данные и поведение, но имеет неподходящий интерфейс.

Способ решения

Адаптер предусматривает создание класса-оболочки[1] с требуемым интерфейсом.

Участники

Класс Adapter приводит интерфейс класса Adaptee в соответствие с интерфейсом класса Target (наследником которого является Adapter). Это позволяет объекту Client использовать объект Adaptee (посредством адаптера Adapter) так, словно он является экземпляром класса Target.

Таким образом Client обращается к интерфейсу Target, реализованному в наследнике Adapter, который перенаправляет обращение к Adaptee.

Следствия

Шаблон Адаптер позволяет включать уже существующие объекты в новые объектные структуры, независимо от различий в их интерфейсах.

Замечания и комментарии

Шаблон Адаптер позволяет в процессе проектирования не принимать во внимание возможные различия в интерфейсах уже существующих классов. Если есть класс, обладающий требуемыми методами и свойствами (по крайней мере, концептуально), то при необходимости всегда можно воспользоваться шаблоном Адаптер для приведения его интерфейса к нужному виду.

Близким Адаптеру является шаблон Фасад, не всегда можно отличить один от другого.

Применение шаблона

Типичным примером использования шаблона Адаптер можно назвать создание классов, приводящих к единому интерфейсу функции языка PHP обеспечивающие доступ к различным СУБД.

Команда (англ. Command) -- поведенческий шаблон проектирования, используемый при объектно-ориентированном программировании, представляющий действие. Объект команды заключает в себе само действие и его параметры.

Цель

Создание структуры, в которой класс-отправитель и класс-получатель не зависят друг от друга напрямую. Организация обратного вызова к классу, который включает в себя класс-отправитель.

Описание

Паттерн поведения объектов, известен также под именем Action (действие).

Обеспечивает обработку команды в виде объекта, что позволяет сохранять её, передавать в качестве параметра методам, а также возвращать её в виде результата, как и любой другой объект.

Например, библиотека печати может иметь класс PrintJob. Для его использования можно создать объект PrintJob, установить необходимые параметры, и вызвать метод, непосредственно отсылающий задание на печать.

Шаблон Model-View-View-Model (MVVM) -- применяется при проектировании архитектуры приложения. Первоначально был представлен сообществу Джоном Госсманом (John Gossman) в 2005 году как модификация шаблона Presentation Model. MVVM ориентирован на современные платформы разработки, такие как Windows Presentation Foundation, Silverlight от компании Microsoft, ZK framework.

Назначение

MVVM используется для разделения модели и её представления, что необходимо для изменения их отдельно друг от друга. Например, разработчик задает логику работы с данными, а дизайнер соответственно работает с пользовательским интерфейсом.

Использование

MVVM удобно использовать вместо классического MVC и ему подобных в тех случаях, когда в платформе, на которой ведётся разработка, присутствует «связывание данных».

В шаблонах проектирования MVC/MVP изменения в пользовательском интерфейсе не влияют непосредственно на Mодель, а предварительно идут через Контроллер (англ. Controller) или Presenter. В таких технологиях как WPF и Silverlight есть концепция «связывания данных», позволяющая связывать данные с визуальными элементами в обе стороны. Следовательно, при использовании этого приема применение модели MVC становится крайне неудобным из-за того, что привязка данных к представлению напрямую не укладывается в концепцию MVC/MVP.

Описание

Шаблон MVVM делится на три части:

Модель (англ. Model), так же, как в классической MVC, Модель представляет собой фундаментальные данные, необходимые для работы приложения.

Представление (англ. View) -- это графический интерфейс, то есть окно, кнопки и.т.п. Представление является подписчиком на событие изменения значений свойств или команд, предоставляемых Моделью представления. В случае, если в Модели представления изменилось какое-либо свойство, то она оповещает всех подписчиков об этом, и Представление, в свою очередь, запрашивает обновленное значение свойства из Модели представления. В случае, если пользователь воздействует на какой-либо элемент интерфейса, Представление вызывает соответствующую команду, предоставленную Моделью представления.

Модель представления (англ. View Model) является, с одной стороны, абстракцией Представления, а с другой, предоставляет обёртку данных из Модели, которые подлежат связыванию. То есть, она содержит Модель, которая преобразована к Представлению, а также содержит в себе команды, которыми может пользоваться Представление, чтобы влиять на Модель.

Программное обеспечение для управления проектами -- определение для комплексного программного обеспечения, включающее в себя приложения для планирования задач, составления расписания, контроля цены и управления бюджетом, распределения ресурсов, совместной работы, общения, быстрого управления, документирования и администрирования системы, которое используются совместно для управления крупными проектами.

Задачи программного обеспечения для управления проектами:

Планирование

Одной из наиболее распространенных возможностей является возможность планирования событий и управления задачами. Требования могут различаться в зависимости от того, как используется инструмент. Наиболее распространенными являются:

планирование различных событий, зависящих друг от друга;

планирование расписания работы сотрудников и управление ресурсами;

расчет времени, необходимого на решение каждой из задач;

сортировка задач в зависимости от сроков их завершения;

управление нескольким проектами одновременно.

Расчёт критического пути

Управление данными и предоставление информации.

Программное обеспечение для управления проектами предоставляет большое количество требуемой информации, такой как:

список задач для сотрудников и информацию распределения ресурсов;

обзор информации о сроках выполнения задач;

ранние предупреждения о возможных рисках, связанных с проектом;

информации о рабочей нагрузке;

информация о ходе проекта, показатели и их прогнозирование.

Типы программного обеспечения для управления проектами

Desktop (Настольные)

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

Web-based (Веб-приложения)

Программное обеспечение является веб-приложением, доступ к которому осуществляется с помощью браузера.

Плюсы и минусы:

Доступ может быть осуществлен с любого компьютера, не требуется установка дополнительных приложений

Простой контроль доступа

Многопользовательность

Только одна программа, которая установлена на центральном сервере

Скорость работы ниже, чем у обычных приложений

Проблемы с доступом к серверу или его выход из строя ведут к полной недоступности информации

Персональные

Обычно используются для управлениями домашними проектами. Как правило, это однопользовательские системы с простым интерфейсом.

Однопользовательские[править | править исходный текст]

Однопользовательские системы могут использоваться в качестве персональных или для управления небольшими компаниями.

Многопользовательские предназначены для координации действий нескольких десятков или сотен пользователей. Обычно строятся по технологии клиент-сервер.

Система управления версиями (от англ. Version Control System, VCS или Revision Control System) -- программное обеспечение для облегчения работы с изменяющейся информацией. Система управления версиями позволяет хранить несколько версий одного и того же документа, при необходимости возвращаться к более ранним версиям, определять, кто и когда сделал то или иное изменение, и многое другое.

Такие системы наиболее широко используются при разработке программного обеспечения для хранения исходных кодов разрабатываемой программы. Однако они могут с успехом применяться и в других областях, в которых ведётся работа с большим количеством непрерывно изменяющихся электронных документов. В частности, системы управления версиями применяются в САПР, обычно в составе систем управления данными об изделии (PDM). Управление версиями используется в инструментах конфигурационного управления (Software Configuration Management Tools).

Программное обеспечение Википедии ведёт историю изменений для всех её статей, используя методы, аналогичные тем, которые применяются в системах управления версиями.

Общие сведения

Ситуация, в которой электронный документ за время своего существования претерпевает ряд изменений, достаточно типична. При этом часто бывает важно иметь не только последнюю версию, но и несколько предыдущих. В простейшем случае можно просто хранить несколько вариантов документа, нумеруя их соответствующим образом. Такой способ неэффективен (приходится хранить несколько практически идентичных копий), требует повышенного внимания и дисциплины и часто ведёт к ошибкам, поэтому были разработаны средства для автоматизации этой работы.

Традиционные системы управления версиями используют централизованную модель, когда имеется единое хранилище документов, управляемое специальным сервером, который и выполняет бомльшую часть функций по управлению версиями. Пользователь, работающий с документами, должен сначала получить нужную ему версию документа из хранилища; обычно создаётся локальная копия документа, т. н. «рабочая копия». Может быть получена последняя версия или любая из предыдущих, которая может быть выбрана по номеру версии или дате создания, иногда и по другим признакам. После того, как в документ внесены нужные изменения, новая версия помещается в хранилище. В отличие от простого сохранения файла, предыдущая версия не стирается, а тоже остаётся в хранилище и может быть оттуда получена в любое время. Сервер может использовать т. н. дельта-компрессию -- такой способ хранения документов, при котором сохраняются только изменения между последовательными версиями, что позволяет уменьшить объём хранимых данных. Поскольку обычно наиболее востребованной является последняя версия файла, система может при сохранении новой версии сохранять её целиком, заменяя в хранилище последнюю ранее сохранённую версию на разницу между этой и последней версией. Некоторые системы (например, ClearCase) поддерживают сохранение версий обоих видов: большинство версий сохраняется в виде дельт, но периодически (по специальной команде администратора) выполняется сохранение версий всех файлов в полном виде; такой подход обеспечивает максимально полное восстановление истории в случае повреждения репозитория.

Иногда создание новой версии выполняется незаметно для пользователя (прозрачно), либо прикладной программой, имеющей встроенную поддержку такой функции, либо за счёт использования специальной файловой системы. В этом случае пользователь просто работает с файлом, как обычно, и при сохранении файла автоматически создаётся новая версия.

Часто бывает, что над одним проектом одновременно работают несколько человек. Если два человека изменяют один и тот же файл, то один из них может случайно отменить изменения, сделанные другим. Системы управления версиями отслеживают такие конфликты и предлагают средства их решения. Большинство систем может автоматически объединить (слить) изменения, сделанные разными разработчиками. Однако такое автоматическое объединение изменений, обычно, возможно только для текстовых файлов и при условии, что изменялись разные (непересекающиеся) части этого файла. Такое ограничение связано с тем, что большинство систем управления версиями ориентированы на поддержку процесса разработки программного обеспечения, а исходные коды программ хранятся в текстовых файлах. Если автоматическое объединение выполнить не удалось, система может предложить решить проблему вручную.

Часто выполнить слияние невозможно ни в автоматическом, ни в ручном режиме, например, если формат файла неизвестен или слишком сложен. Некоторые системы управления версиями дают возможность заблокировать файл в хранилище. Блокировка не позволяет другим пользователям получить рабочую копию или препятствует изменению рабочей копии файла (например, средствами файловой системы) и обеспечивает, таким образом, исключительный доступ только тому пользователю, который работает с документом.

Многие системы управления версиями предоставляют ряд других возможностей:

Позволяют создавать разные варианты одного документа, т. н. ветки, с общей историей изменений до точки ветвления и с разными -- после неё.

Дают возможность узнать, кто и когда добавил или изменил конкретный набор строк в файле.

Ведут журнал изменений, в который пользователи могут записывать пояснения о том, что и почему они изменили в данной версии.

Контролируют права доступа пользователей, разрешая или запрещая чтение или изменение данных, в зависимости от того, кто запрашивает это действие.

3. Прототип информационно — аналитической системы MCControl для поддержки процесса техобслуживания и ремонта дискретного производства малого производственного предприятия (ТОиР)

1. Класс «Repository» управляющий объектами в базе данных

using System;

using System. Collections. Generic;

using System. Linq;

using BDE. Client. Shared. Common. Logic. Persistence;

using BDE. Shared. Common. Domain;

using BDE. Shared. Utils;

using Microsoft. Practices. Unity;

namespace BDE. Client. Shared. Common. Logic

{

public interface IRepository< T>: IReadRepository< T>, IAsyncDomainStore< T>

where T: DomainObject

{

T CreateNew ();

}

/// < summary>

/// Caching repository wrapping < see cref="IAsyncDomainStore{T}" />

/// < /summary>

public class Repository< T>: ReadOnlyBaseRepository< T>, IRepository< T>

where T: DomainObject

{

[Dependency]

public IAsyncDomainStore< T> WrappedStore

{

private get { return (IAsyncDomainStore< T>)Store; }

set { Store = value; }

}

public virtual T CreateNew ()

{

return ObjectCloneHelper. CreateProxy<T>();

}

#region IDomainPersistenceStore< T> Members

#region Async save methods

public virtual IAsyncResult BeginSaveObject (T obj, AsyncCallback saveCompletedCallback, object state)

{

T clone = ObjectCloneHelper. CloneReal (obj);

clone. TrimStringProperties ();

return WrappedStore. BeginSaveObject (clone, saveCompletedCallback, state);

}

public T EndSaveObject (IAsyncResult asyncResult)

{

T result = (T)ObjectCloneHelper. CloneProxy (WrappedStore. EndSaveObject (asyncResult));

var cachedResult = AddToCache (result);

OnSaveObjectCompleted (cachedResult);

return cachedResult;

}

protected virtual void OnSaveObjectCompleted (T obj)

{

}

/// < summary>

/// Begins asynchronous group save operation on set of object of type < typeparamref name="T" />

/// < /summary>

public virtual IAsyncResult BeginSaveObjects (IEnumerable< T> objs, AsyncCallback saveCompletedCallback, object state)

{

List< T> realObjs = objs

. Select (obj => (T)ObjectCloneHelper. CloneReal (obj))

. Do (obj => obj. TrimStringProperties ())

. ToList ();

return WrappedStore. BeginSaveObjects (realObjs, saveCompletedCallback, state);

}

/// < summary>

/// Ends initiated asynchronous group save operation

/// < /summary>

public IList< T> EndSaveObjects (IAsyncResult asyncResult)

{

IList< T> originalCollection = WrappedStore. EndSaveObjects (asyncResult);

foreach (T obj in originalCollection)

{

OnSaveObjectCompleted (obj);

}

return originalCollection. Select (obj => (T)ObjectCloneHelper. CloneProxy (obj)). Select (AddToCache). ToList ();

}

#endregion

#region Async delete methods

public IAsyncResult BeginDeleteObject (ObjectKey key, AsyncCallback deleteCompletedCallback, object state)

{

return WrappedStore. BeginDeleteObject (key, deleteCompletedCallback, state);

}

public ObjectKey EndDeleteObject (IAsyncResult asyncResult)

{

ObjectKey result = WrappedStore. EndDeleteObject (asyncResult);

RemoveFromCache (result);

return result;

}

public IAsyncResult BeginDeleteObjects (IEnumerable< ObjectKey> keys, AsyncCallback saveCompletedCallback, object state)

{

return WrappedStore. BeginDeleteObjects (keys, saveCompletedCallback, state);

}

public IList< ObjectKey> EndDeleteObjects (IAsyncResult asyncResult)

{

IList< ObjectKey> result = WrappedStore. EndDeleteObjects (asyncResult);

foreach (var key in result)

{

RemoveFromCache (key);

}

return result;

}

public IAsyncResult BeginDeleteObjectsByParamInfo (ParamInfoBase paramInfo, AsyncCallback deleteCompliteCallback, object state)

{

return WrappedStore. BeginDeleteObjectsByParamInfo (paramInfo, deleteCompliteCallback, state);

}

public IList< ObjectKey> EndDeleteObjectsByParamInfo (IAsyncResult asyncResult)

{

return WrappedStore. EndDeleteObjectsByParamInfo (asyncResult);

}

#endregion

#endregion

}

}

2. Основное окно приложения, описанное на языке разметки xaml.

< Window x: Class="BDE. Client. WPF. PROtool. View. MainWindow"

xmlns="http: //schemas. microsoft. com/winfx/2006/xaml/presentation"

xmlns: x="http://schemas. microsoft. com/winfx/2006/xaml"

Title="{Binding Title}"

Icon="/BDE. Client. WPF. PROtool. View;component/Resources/Images/PROtoolIcon. png"

xmlns: telerik="http://schemas. telerik. com/2008/xaml/presentation"

xmlns: helpers="clr-namespace:BDE. Client. WPF. PROtool. View. Helpers"

xmlns: viewModelMapping="http://schemas. dmdevelopment. ru/view/viewModelMapping/"

xmlns: viewBehavior="http://schemas. dmdevelopment. ru/view/behavior/"

xmlns: controls="http://schemas. dmdevelopment. ru/controls/"

xmlns: view="http://schemas. dmdevelopment. ru/view"

xmlns: i="http://schemas. microsoft. com/expression/2010/interactivity"

xmlns: controlsConvert="http://schemas. dmdevelopment. ru/controls/convert/"

>

< Window. Resources>

< helpers: ResourceHelper x: Key="ResourceHelper" />

< view: ViewModelContextTabConverter x: Key="ViewModelContextTabConverter" />

< controlsConvert: EnumerableToCollectionView x: Key="EnumerableToCollectionViewConverter" />

< view: RibbonButtonVisibilityConverter x: Key="RibbonButtonVisibilityConverter" />

< /Window. Resources>

< telerik: RadBusyIndicator IsBusy="{Binding IsAsyncOperationInProgress}" BusyContent="{Binding Resources. MainView_ServerOperationInProgressText, Source={StaticResource ResourceHelper}}">

< DockPanel>

< controls: ContextedRibbonBar x: Name="Ribbon" ApplicationButtonVisibility="Collapsed"

CollapseThresholdSize="Empty"

Context="{Binding TabViewModelManager. SelectedViewModel, Converter={StaticResource ViewModelContextTabConverter}}"

TitleBarVisibility="Collapsed" DockPanel. Dock="Top">

< controls: ContextedRibbonBar. TabStripAdditionalContent>

< StackPanel Orientation="Horizontal">

< TextBlock Margin="0,0,4,0″ Text="{Binding CurrentUserName}" VerticalAlignment="Center" />

< telerik: RadRibbonButton Content="{Binding Resources. MainView_LogoutText, Source={StaticResource ResourceHelper}}"

Command="{Binding LogoutCommand}" VerticalAlignment="Center"/>

< /StackPanel>

< /controls:ContextedRibbonBar. TabStripAdditionalContent>

< telerik: RadRibbonTab Header="{Binding Resources. MainView_MasterDataTabHeader, Source={StaticResource ResourceHelper}}">

< telerik: RadRibbonGroup Header="{Binding Resources. MainView_DataGroupHeader, Source={StaticResource ResourceHelper}}">

< telerik: RadRibbonButton Command="{Binding OpenCustomersGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_CustomersButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/CustomerIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenDocumentsGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_DocumentsButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/DocumentIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenToolsGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ToolsButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ToolIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenModelsGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ModelsButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ModelIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenToolMachinesGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ToolMachinesButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ToolMachineIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenMaintenancePlansGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_MaintenancePlansButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/MaintenancePlanIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenRepairsGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_RepairsButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/RepairIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenRepairGroundGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_RepairGroundsButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/RepairGroundIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenToolStatusGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ToolStatusesButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ToolStatusIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenToolmakerGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ToolmakersButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ToolmakerIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenItemGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ItemsButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ItemIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenPeripheryGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_PeripheriesButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/PeripheryIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< telerik: RadRibbonButton Command="{Binding OpenToolTypeGridTabCommand}" Size="Large" Text="{Binding Resources. MainView_ToolTypesButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. WPF. PROtool. View;component/Resources/Images/ToolTypeIcon. png"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. MasterDataRead' }" />

< i: Interaction. Behaviors>

< viewBehavior: RibbonGroupVisibilityBehavior />

< /i:Interaction. Behaviors>

< /telerik:RadRibbonGroup>

< telerik: RadRibbonGroup Header="{Binding Resources. MainView_HelpGroupHeader, Source={StaticResource ResourceHelper}}">

< !--<telerik:RadRibbonButton Command="{Binding OpenSystemInfoTabCommand}" Size="Large" Text="{Binding Resources. MainView_SystemInfoButtonText, Source={StaticResource ResourceHelper}}"

Visibility ="{Binding Converter={StaticResource RibbonButtonVisibilityConverter}, ConverterParameter ='Common. Administration' }"

LargeImage="/BDE. Client. Shared. Common. View;component/Resources/Images/Report2. png"/>-->

< telerik: RadRibbonButton Command="{Binding OpenAboutCommand}" Size="Large" Text="{Binding Resources. MainView_AboutButtonText, Source={StaticResource ResourceHelper}}"

LargeImage="/BDE. Client. Shared. Common. View;component/Resources/Images/Info001. png"/>

< i: Interaction. Behaviors>

< viewBehavior: RibbonGroupVisibilityBehavior />

< /i:Interaction. Behaviors>

< /telerik:RadRibbonGroup>

< /telerik:RadRibbonTab>

< /controls:ContextedRibbonBar>

< telerik: RadTabControl TabStripPlacement="Left" ItemsSource="{Binding TabViewModelManager. ViewModels}"

SelectedItem="{Binding TabViewModelManager. SelectedViewModel, Mode=TwoWay}" TabOrientation="Vertical">

< telerik: RadTabControl. ItemContainerStyle>

< Style TargetType="telerik: RadTabItem">

< Setter Property="ContentTemplate">

< Setter. Value>

< DataTemplate>

< viewModelMapping: ViewModelPresenter ViewModel="{Binding}" />

< /DataTemplate>

< /Setter. Value>

< /Setter>

< Setter Property="HeaderTemplate">

< Setter. Value>

< DataTemplate>

< Grid>

< Grid. ColumnDefinitions>

< ColumnDefinition Width="Auto" />

< ColumnDefinition Width="*" />

< /Grid. ColumnDefinitions>

< telerik: RadRibbonButton Command="{Binding CloseTabCommand}"

SmallImage="/BDE. Client. Shared. Common. View;component/Resources/Images/errorMessage. png"

Grid. Column="0″ />

< ContentPresenter Content="{Binding Title}" VerticalAlignment="Center" Grid. Column="1″ />

< /Grid>

< /DataTemplate>

< /Setter. Value>

< /Setter>

< Setter Property="HorizontalContentAlignment" Value="Stretch" />

< /Style>

< /telerik:RadTabControl. ItemContainerStyle>

< /telerik:RadTabControl>

< /DockPanel>

< /telerik:RadBusyIndicator>

< /Window>

3. Окно входа в программу.

Заключение

В ходе курсового проектирования были сформированы умения и получены навыки разработки программного обеспечения, работы с паттернами проектирования.

Были выполнены все задания курсового проектирования:

— получены навыки работы в программных пакетах Microsoft Visual Studio 2012, Microsoft SQL Server 2012, VisualHG;

— получены навыки работы с некоторыми шаблонами проектирования;

— разработан прототип информационно-аналитической системы;

— оформлена пояснительная записка и документация по курсовому проекту.

Список использованных источников

1 Э. Гамма, Р. Хелм, Р. Джонсон, Дж. Влиссидес Приемы объектно-ориентированного проектирования. Паттерны проектирования. — СПб: «Питер», 2007. -- С. 366. -- ISBN 978−5-469−1 136−1

2 Стив Макконнелл Совершенный код. -- СПб.: Питер, 2005. -- С. 896. -- ISBN 5−7502−0064−7

3 http: //ru. wikipedia. org/

4 http: //msdn. microsoft. com/

ПоказатьСвернуть
Заполнить форму текущей работой