Этап 1. Анализ и проектирование ИС¶
Назначение анализа¶
Анализ нужен, чтобы до написания кода понять, какие данные хранит система, кто с ними работает и какие ограничения должны выполняться. Для настольной ИС важно заранее определить не только таблицы, но и окна приложения: вход, регистрацию, главное меню, справочники, операции и административные разделы.
Например, в предметной области «Библиотека» нельзя начать с формы BooksForm, пока не определено, что книга связана с автором, имеет инвентарный номер и может быть выдана читателю.
Роли и права¶
Роль определяет, какие окна и действия доступны пользователю. Роль хранится в базе данных, а интерфейс приложения при запуске скрывает или блокирует недоступные элементы.
| Роль | Возможности |
|---|---|
admin |
управление пользователями, просмотр журнала входов, полный CRUD |
operator |
работа с основными данными без управления пользователями |
user |
просмотр или ограниченные действия по варианту |
В разных предметных областях роли можно переименовать по смыслу: библиотекарь, врач, мастер, менеджер, кладовщик, кассир.
Функциональные и нефункциональные требования¶
Функциональные требования описывают, что делает система. Нефункциональные требования описывают, как именно она должна работать.
| Тип требования | Пример для настольной ИС |
|---|---|
| Функциональное | пользователь может зарегистрироваться |
| Функциональное | оператор может добавить запись предметной области |
| Функциональное | администратор может открыть журнал входов |
| Нефункциональное | пароль хранится только в виде хэша |
| Нефункциональное | форма входа показывает понятное сообщение об ошибке |
| Нефункциональное | таблицы не теряют данные после перезапуска приложения |
Требование должно быть проверяемым. Формулировка «сделать удобный интерфейс» слишком общая. Лучше: «в главном окне есть меню перехода к основным разделам, а в списках есть поиск по названию или ФИО».
Сущности и операции¶
Сущность — объект предметной области, который хранится в отдельной таблице. Операция — действие пользователя с сущностью.
Для библиотеки:
| Сущность | Операции |
|---|---|
| Автор | добавить, изменить, удалить, найти |
| Книга | добавить, изменить, отметить доступность |
| Читатель | зарегистрировать, изменить контакты |
| Выдача книги | оформить выдачу, отметить возврат |
Переход от предметной области к окнам¶
После выбора сущностей нужно понять, какие окна потребуются. Обычно одна справочная сущность превращается в форму списка и форму редактирования. Операционная сущность требует больше проверок.
| Сущность | Окно списка | Окно редактирования | Особенность |
|---|---|---|---|
| Автор | AuthorsForm |
ФИО, страна | простая справочная таблица |
| Книга | BooksForm |
название, автор, год, номер | проверка уникального номера |
| Читатель | ReadersForm |
ФИО, телефон, номер карты | проверка номера карты |
| Выдача | BookIssuesForm |
книга, читатель, даты | нельзя выдать недоступную книгу |
Такой переход помогает не потерять связь между анализом и будущим кодом.
Связь между проектированием и кодом удобно показать на модели. Если в таблице Books есть название, автор, год и инвентарный номер, то в приложении появляется такой класс:
public class Book
{
public int Id { get; set; }
public string Title { get; set; } = "";
public int AuthorId { get; set; }
public string AuthorName { get; set; } = "";
public int? Year { get; set; }
public string InventoryNumber { get; set; } = "";
public bool IsAvailable { get; set; }
}
Ограничение «книгу нельзя выдать, если она недоступна» затем превращается в проверку перед сохранением операции:
if (!selectedBook.IsAvailable)
{
MessageBox.Show("Эту книгу нельзя выдать: она уже недоступна.");
return;
}
Границы системы¶
В проект не нужно включать все возможные функции предметной области. Достаточно выбрать завершенный фрагмент: справочники, одну основную операцию и системный модуль входа.
Граница примера для библиотеки:
- входит: книги, авторы, читатели, выдачи, пользователи;
- не входит: интеграция со сканером штрихкодов, печать актов, онлайн-каталог.
Жизненный цикл пользователя¶
В системах с авторизацией полезно описывать путь пользователя:
- Пользователь открывает приложение.
- Приложение показывает форму входа.
- Новый пользователь переходит к регистрации.
- После успешного входа открывается главное окно.
- Главное окно настраивает меню по роли.
- Пользователь работает с доступными разделами.
- При выходе приложение возвращается к форме входа или закрывается.
Если этот сценарий описан заранее, проще реализовать переходы между формами и не открыть предметные разделы до авторизации.
В главном окне роль пользователя влияет на видимость разделов:
usersMenuItem.Visible = currentUser.RoleName == "admin";
loginAttemptsMenuItem.Visible = currentUser.RoleName == "admin";
booksMenuItem.Visible = currentUser.RoleName is "admin" or "operator";
Ошибки проектирования¶
Типичные ошибки:
- хранить роль пользователя текстом в каждой форме, а не в таблице ролей;
- хранить пароль открытым текстом;
- делать одну таблицу
Dataдля разных сущностей; - не задавать уникальность логина и инвентарного номера;
- создавать формы без связи с бизнес-сценариями.