Характеристика предприятия 1 правила техники безопасности


ЗАДАНИЕ № 4: Разработка. Отладка модулей программного проекта


Download 1.81 Mb.
bet9/14
Sana08.03.2023
Hajmi1.81 Mb.
#1250233
1   ...   6   7   8   9   10   11   12   13   14
Bog'liq
1663227409051 Отчет

ЗАДАНИЕ № 4: Разработка. Отладка модулей программного проекта.

Итак, наш первый проект, который мы создадим, будет называться Autoshop.BL. Проект будет создан с помощью Библиотеки классов. Созданный по умолчанию класс мы удаляем, он нам не нужен. В проекте создаем папку Models и наш первый класс. Первый класс, который мы создадим это класс для хранения данных.


Этим непонятным описанием называется в нашем случае класс – Сотрудник. Наше будущее приложение должно выполнять какие-либо действия над этим объектом. Поскольку действия, совершаемые над объектом, мы ранее уже назвали «бизнес-процессом», то и сам объект с не меньшим удовольствием назовем «бизнес-объектом».
Данный объект позволяет в себе хранить данные из «бизнес-логики» для передачи их в часть программы, отображающую содержимое этого объекта, и обратно. Ведь мы знаем, что объект – это контейнер для данных. Тут появляется и иное название этого объекта – объект для передачи данных.
Код нашего класса будет выглядеть так, как показано ниже.

Листинг класса ProductDto
namespace Autoshop.BL.Models
{
///
/// Класс - товар
///

public class ProductDto
{
///
/// id товара
///

public int Id { get; set; }
///
/// Наименование товара
///

public string Name { get; set; }
///
/// Покупатель
///

public string Customer { get; set; }
///
/// Дата заказа
///

public int OrderDate { get; set; }
///
/// Дата продажи
///

public int? SaleDate { get; set; }
///
/// Категория
///

public string Category { get; set; }
}
}



Теперь нам необходимо выполнить декларацию операций.


Для этого в нашем проекте создадим новую папку Interfaces и интерфейс IProductProcess.cs. В нем мы опишем все те действия, что будут выполняться над объектом - Товар .
В данном контексте интерфейс — это шаблон проектирования, являющийся общим методом для структурирования компьютерных программ для того, чтобы их было проще понять. В общем случае, интерфейс — это абстрактный тип, не содержащий данные или код, но определяющий поведение через объявление сигнатуры методов. Интерфейс обеспечивает программисту простой или более программно-специфический способ доступа к другим классам. У нас получился следующий код интерфейса:

Листинг кода интерфейса IProductProcess
using System.Collections.Generic;
using Autoshop.BL.Models;

namespace Autoshop.BL.Interfaces


{
///
/// Декларация действий по работе с товаром
///

public interface IProductProcess
{
///
/// Возвращает список товаров
///

/// список товаров
IList
GetList();
///
/// Возвращает товар по его id
///

///
name="id">id товара

/// Товар


ProductDto Get(int id);
///
/// Добавляет товар
///

///
name="product">

void Add(ProductDto product);


///
/// Обновляет данные о товаре
///

///
Товар, изменения которого надо сохранить
void Update(ProductDto product);
///
/// Удаляет товар
///

///
id товара, который надо удалить
void Delete(int id);
}
}



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


Для этих целей в проектt Autoshop.BL в папку Models добавим новый класс ProductProcess.cs и унаследуем его от нашего интерфейса IProductProcess.cs который создали раннее. Для хранения списка нагрузок будем использовать коллекцию IDictionary. Ее использование позволит быстро получать доступ к объекту по его id. Добавим соответствующую строку в самое начало созданного класса. Коллекция будет статичной (static), что означает единственность экземпляра для всего приложения. У нас получился следующий код класса ProductProcess:

Листинг класса ProductProcess
using System.Collections.Generic;
using System.Linq;
using Autoshop.BL.Interfaces;

namespace Autoshop.BL.Models


{
public class ProductProcess : IProductProcess
{
private static readonly IDictionary Products = new Dictionary();

public IList


GetList()
{
return new List
(Products.Values);
}

public ProductDto Get(int id)


{
return Products.ContainsKey(id) ? Products[id] : null;
}

public void Add(ProductDto product)


{
int max = Products.Keys.Count == 0 ? 1 : Products.Keys.Max(p => p) + 1;

product.Id = max;


Products.Add(max, product);
}

public void Update(ProductDto product)


{
if(Products.ContainsKey(product.Id))
Products[product.Id] = product;
}

public void Delete(int id)


{
if(Products.ContainsKey(id))
Products.Remove(id);
}
}
}



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


Можно позволить напрямую создавать экземпляры класса ProductProcess. Но так обычно не делают, потому что создание такого объекта может требовать дополнительную инициализацию, которую нет возможности поместить в конструктор. Не рекомендуется, чтобы другие модули знали конкретные классы реализации.
Если позже потребуется заменить реализацию интерфейса IProductProcess с нынешнего варианта ProductProcess на ProductProcessDb, то замене будет подлежать весь код, который явно знает о классе ProductProcess.
Чтобы этого избежать, позволим сторонним модулям знать только об интерфейсе IProductProcess.
Также зададим единственное место, в котором все сторонние модули будут получать объект реализации интерфейса IProductProcess. Это место называется фабрикой классов (паттерн).
Добавим в проект Autoshop.BL новый класс ProcessFactory, код которого представлен ниже:

Листинг класса ProcessFactory
using Autoshop.BL.Interfaces;

namespace Autoshop.BL.Models


{
///
/// Фабрика классов бизнес логики
///

public class ProcessFactory
{
///
/// Возвращает объект, реализующий
///

///
public static IProductProcess GetProductProcess()
{
return new ProductProcessDb();
}
}
}



Создадим новый класс Product, который будет отражать данные в базе, согласно таблице Products. Поместим класс в папку Entity проекта Autoshop.BL. Добавим поля в наш класс согласно полям в базе данных.



Листинг класса Product
namespace Autoshop.BL.Entity
{
public class Product
{
public int ProductId;
public string Name;
public string Customer;
public int OrderDate;
public int? SaleDate;
public string Category;
}
}

Добавим в проект Autoshop.BL ссылку System.Configuration и интерфейс IProductDao с описанием необходимых нам действий и строку: using Autoshop.BL.Entity. Код созданного интерфейса представлен ниже.



Листинг интерфейса IProductDao
using System.Collections.Generic;
using Autoshop.BL.Entity;

namespace Autoshop.BL.Interfaces


{
///
/// Описание действий с объектом товар в базе
///

public interface IProductDao
{
///
/// Получить товар по id
///

///
name="id">id товара

/// товар


Product Get(int id);
///
/// Получить список всех товаров в базе
///

/// список всех товаров в базе
IList
GetAll();
///
/// Добавить товар в базу
///

///
name="product">новый товар

void Add(Product product);


///
/// Обновить товар
///

///
name="product">обновленный товар

void Update(Product product);


///
/// Удалить товар
///

///
name="id">id удаляемого товара

void Delete(int id);


}
}



Добавим класс ProductDao, реализующий созданный ранее интерфейс IProductDao и строки:
using System.Configuration;
using System.Data.SqlClient;
using Autoshop.BL.Entity;

По аналогии с классом ProcessFactory, создадим фабрику классов DaoFactory. Её будет использовать слой “бизнес-логики” вместо работы с коллекцией. Код данного класса представлен ниже.



Листинг класса DaoFactory
using Autoshop.BL.Interfaces;

namespace Autoshop.BL.Models


{
public class DaoFactory
{
public static IProductDao GetProductDao()
{
return new ProductDao();
}
}
}



Вернемся к исходному коду класса ProductDao. Есть два объекта, которые нам понадобятся в каждом из методов этого класса. Первый объект – это строка подключения, чтобы знать, к какой базе подключаться. Второй – сам объект подключения к базе данных. Добавим статичные методы, возвращающие эти объекты, в конец класса ProductDao. Перейдем к реализации оставшихся методов класса. Полный код класса вынесен в приложения.


Теперь перед нами встала довольно интересная задача. Нам надо как-то преобразовывать объекты типа Load в объекты типа ProductDto, и обратно. Чтобы не делать это каждый раз, где только потребуется, добавим специальный класс DtoConverter в проекте Autoshop.BL и поместим его в папку Models этого проекта. Код данного класса вынесен в приложения.
Теперь создадим новый класс ProductProcessDb. Код класса вынесем в приложения.
Данный класс будет реализован от того же интерфейса, что и класс ProductProcess – IProductProcess. Осталось лишь сделать замену в классе ProcessFactory.
Диаграмма классов демонстрирующая логику приложения будет вынесена в приложения.
Для реализации пользовательского интерфейса мы используем тип проекта WPF. Для создания нового проекта, в обозревателе решений кликаем по решению – Добавить – Создать проект (рисунок 5). Выбираем проект WPF (NET Framework) и жмем Далее. Дадим имя проекту Autoshop.UI – интерфейс пользователя, жмём далее и ждем пока не будет создан проект.

Рисунок 5 – Создание пользовательского интерфейса

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





Листинг App.config



For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->





























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



Рисунок 6 – Схема работы с приложением

Реализация пользовательского интерфейса происходит в два этапа: реализация интерфейса на языке XMAL и реализация логики, код пишется на C#. На рисунке 7 представлен внешний вид главного окна программы. Код интерфейса главного окна представлен ниже.



Рисунок 7– Внешний вид главного окна



Листинг
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Autoshop.UI"
mc:Ignorable="d"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
Title="Учет продаж" Height="450" Width="800">









HorizontalAlignment="Left" Height="304" Margin="96,41,0,0" VerticalAlignment="Top" Width="630">









Теперь нам необходимо реализовать логику работы главного окна. Код представлен ниже.





Листинг
using System.Windows;
using Autoshop.BL.Models;

namespace Autoshop.UI


{
///
/// Логика взаимодействия для ProductWindow.xaml
///

public partial class ProductWindow : Window
{
public ProductWindow()
{
InitializeComponent();
}

private void BtnAdd_Click(object sender, RoutedEventArgs e)


{
AddProductWindow addProduct = new AddProductWindow();
addProduct.ShowDialog();

//Получаем список товаров и передаем его на отображение таблице


dgProduct.ItemsSource = ProcessFactory.GetProductProcess().GetList();
}

private void BtnRefresh_Click(object sender, RoutedEventArgs e)


{
//Получаем список товаров и передаем его на отображение таблице
dgProduct.ItemsSource = ProcessFactory.GetProductProcess().GetList();
}

private void BtnDelete_Click(object sender, RoutedEventArgs e)


{
// Получаем выделенную строку с объектом товар
ProductDto item = dgProduct.SelectedItem as ProductDto;
// если там не товар или пользователь ничего не выбрал сообщаем об этом
if (item == null)
{
MessageBox.Show("Выберите запись для удаления", "Удаление товара");
}
// Просим подтвердить удаление
MessageBoxResult result = MessageBox.Show("Удалить товар " + item.Name + "?",
"Удаление товара", MessageBoxButton.YesNo, MessageBoxImage.Warning);
// Если пользователь не подтвердил, выходим
if (result != MessageBoxResult.Yes)
{
return;
}
// Если все проверки пройдены и подтверждение получено, удаляем товар
ProcessFactory.GetProductProcess().Delete(item.Id);
// И перезагружаем список товаров
BtnRefresh_Click(sender, e);
}

private void BtnEdit_Click(object sender, RoutedEventArgs e)


{
// Получаем выделенную строку с объектом товар
ProductDto item = dgProduct.SelectedItem as ProductDto;
// если там не товар или пользователь ничего не выбрал сообщаем об этом
if(item == null)
{
MessageBox.Show("Выберите запись для редактирования", "Редактирование");
}

// Создаем окно


AddProductWindow window = new AddProductWindow();
// отправляем объект на редактирование
window.Load(item);
// Отображаем окно с данными
window.ShowDialog();
// Перезагружаем список объектов
BtnRefresh_Click(sender, e);
}

private void BtnReg_Click(object sender, RoutedEventArgs e)


{
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
Hide();
}

private void Exit_Click(object sender, RoutedEventArgs e)


{
Close();
}

private void About_Click(object sender, RoutedEventArgs e)


{
//Справка
MessageBox.Show("Автор программы Автомагазин: ., \nДата релиза: 11.09.2022 г. Внимание!!");
}
}
}



После того, как было реализовано основное окно приложения(программы) необходимо реализовать окно для добавления данных.


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

Листинг
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Autoshop.UI"
mc:Ignorable="d"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
Title="Добавление товаров" Height="348" Width="535">


Внешний вид окна добавления данных представлен на рисунке 8.



Рисунок 8 – Внешний вид окна добавления данных
Код логики окна добавления данных мы вынесем в приложения так как он очень большой.
После того, как была реализована основная часть интерфейса приложения, необходимо позаботиться о безопасности, чтобы никто, посторонний не имел доступа к программе.
Для этих целей мы реализуем три окна: окно регистрации, окно авторизации и кабинет пользователя, из которого можно будет попасть в основную часть программы – это главное окно и окно добавления данных.

Рисунок 9 – Окно регистрации

Как уже было сказано раннее, для хранения учетных данных будет использоваться база Sqlite. Создадим эту базу. ниже на рисунке 10 представлена созданная база данных.



Рисунок 10 – Окно базы данных с созданной таблицей

Прежде чем мы добавим код интерфейса и логики тех окон, что мы создаем, мы реализуем классы, которые будут отвечать за их работу. Первый класс, который мы реализуем – User.cs. Код данного класса представлен ниже.



Листинг класса User
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EmployeeUI


{
public class User
{
public int id { get; set; }
private string login, pass, email;

public string Login


{
get { return login; }
set { login = value; }
}

public string Pass


{
get { return pass; }
set { pass = value; }
}

public string Email


{
get { return email; }
set { email = value; }
}
public User() { }
public User(string login, string pass, string email)
{
this.login = login;
this.pass = pass;
this.email = email;
}
}
}



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



Листинг кода AppContext
using System.Data.Entity;

namespace EmployeeUI


{
class AppContext : DbContext
{
public AppContext() : base("DefaultConnection") { }
public DbSet Users { get; set; }
}
}

Теперь мы можем перейти к коду описывающему интерфейс окна регистрации. Листинг данного кода представлен ниже.



Листинг
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Autoshop.UI"
mc:Ignorable="d"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
Title="Приложение для пользователей" Height="450" Width="700">









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


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

Download 1.81 Mb.

Do'stlaringiz bilan baham:
1   ...   6   7   8   9   10   11   12   13   14




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling