Архитектура ИС (на примере Qt, Django)

Архитектура информационной системы – концепция, определяющая модель, структуру, выполняемые функции и взаимосвязь компонентов информационной системы.
N|Solid

MVC для веб приложений

N|Solid

🕮 История создания MVC

Идеи MVC сформулировал Трюгве Реенскауг (Trygve Reenskaug) во время работы в Xerox PARC над языком программирования «Smalltalk» в конце 70-х годов.

✅ Задача, которую Реенскауг решал совместно с группой разработчиков, заключалась в том, чтобы упростить взаимодействие рядового пользователя с компьютером. Необходимо было создать средства, которые с одной стороны были бы предельно простыми, а с другой — давали бы возможность управлять компьютером и сложными приложениями.
N|SolidN|Solid

Позже, Стив Бурбек реализовал шаблон в Smalltalk-80. Окончательная версия концепции MVC была опубликована лишь в 1988 году в журнале Technology Object

Идея шаблона MVC: чётко разделять ответственность за различное функционирование в приложениях:

N|Solid

💠 Контроллер (Controller)

Контроллер управляет запросами пользователя (получаемые в виде запросов HTTP GET или POST, когда пользователь нажимает на элементы интерфейса для выполнения различных действий). Его основная функция — вызывать и координировать действие необходимых ресурсов и объектов, нужных для выполнения действий, задаваемых пользователем. Обычно контроллер вызывает соответствующую модель для задачи и выбирает подходящий вид.

💠 Модель (Model)

Модель - это правила, которые используются для работы с данными, которые представляют концепцию управления приложением. В любом приложении вся структура моделируется как данные, которые обрабатываются определённым образом. Например, дата не может указывать в будущее, e-mail должен быть в определённом формате, имя не может быть длиннее Х символов, и так далее. Модель содержит наиболее важную часть логики приложения.

💠 Вид (View)

Вид обеспечивает различные способы представления данных, которые получены из модели. Он может быть шаблоном, который заполняется данными. Может быть несколько различных видов, и контроллер выбирает, какой подходит наилучшим образом для текущей ситуации.

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

Использование паттерна MVC для разработки десктопных приложений

Пример - проверка наличия книги в магазине

N|Solid
Представление - это форма, на которой есть поле, куда пользователь будет вводить вопрос. Представление этот вопрос посылает контроллеру. Контроллер посылает запрос модели. После получения результата, контроллер дает ответ представлению. Уже в самом представлении пользователь увидит ответ.
N|Solid

1️⃣ Представление:

namespace MVC  
{  
    public partial class View : Form  
    {  
        // создаем объект класса Controller  
        Controller controller = new Controller();   
        public View()  
        {  
            InitializeComponent();  
        }  
  
        private void button1_Click(object sender, EventArgs e)  
        {  
            if (textBox1.Text != "")  
                // выводим результат  
                MessageBox.Show(controller.Question(textBox1.Text));  
        }  
    }  
}  

2️⃣ Контроллер:

namespace MVC  
{  
    class Controller  
    {  
        public string Question(string msg)//msg - то что ищем  
        {   
            Model model =  new Model();  
            return "На даный момент у нас товар "  
                + model.GetAnser(msg);   
        }  
    }  
}  

3️⃣ Модель:

namespace MVC  
{  
    class Model  
    {  
        //question - то что ищем  
        public string GetAnser(string question)  
        {  
            return DataBase.GetAnser(question);  
        }  
    }  
}  

4️⃣ Класс помощник. Умеет общаться с базой данных:

namespace MVC  
{  
    static class DataBase  
    {  
        //question - то что ищем  
        public static string GetAnser(string question)  
        {  
            string path = "D:\\shop.txt";// путь к базе даных ):  
              
            // создаем обьект (читатель)  
            using (StreamReader sr =  
                new StreamReader(path, Encoding.Default))  
            {  
                string str = null;  
                while (true)  
                {  
                    //если пустая то это конец  
                    str = sr.ReadLine();  
                    if (str != null)  
                    {  
                        //если считаная строчка   
                        //равна строке для поиска  
                        if (str == question)  
                            return "есть в наличие.";  
                    }  
                    else  
                        return "нет в наличие.";  
                }  
            }  
        }  
    }  
}  

❗ Результат:

N|Solid
N|Solid

Model-View-Presenter (MVP)

Model-View-Presenter (MVP) — шаблон проектирования, производный от MVC, который используется в основном для построения пользовательского интерфейса.
N|Solid
Элемент Presenter в данном шаблоне берёт на себя функциональность посредника (аналогично контроллеру в MVC) и отвечает за управление событиями пользовательского интерфейса (например, использование мыши) так же, как в других шаблонах обычно отвечает представление.

Пример:

public class MyModel
{
    private int _state = 0;
    public MyModel(initState)
    {
        _state = initState;
    }
    public getState(){
        return _state;
    }
}
public class MyView: IView
{
    private IPresenter _presenter;
 
    public MyView()
    {
        _presenter = new MyPresenter(this);
    }
}

public class MyPresenter: IPresenter
{
    private IView _view;
    private MyModel _myModel;
 
    public MyPresenter(IView view)
    {
        _view = view;
        _myModel= new MyModel(1);
    }
}

Qt - кроссплатформенный фреймворк для разработки приложений от компании Trolltech

N|Solid
Фреймворк предоставляет API на языке C++. Qt часто используется разработчиками для разработки кроссплатформенных приложений.

При помощи Qt можно разрабатывать:
При помощи Qt можно
Qt может работать на Linux, Mac OS, Windows, Meego, встраиваемых Linux-системах и Symbian.
Архитектура Qt

N|Solid
На верхнем уровне находится код программы на языке C++. Уровнем ниже расположены классы Qt для создания графического интерфейса, взаимодействия с WebKit, работы с базами данных и.т.д., а еще ниже расположен уровень поддержки различных операционных систем.

Django (Джанго) — свободный фреймворк для веб-приложений на языке Python, использующий шаблон проектирования MVC.

N|Solid
Проект поддерживается организацией Django Software Foundation.
Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других.

Один из основных принципов фреймворка — DRY (англ. Don’t repeat yourself)

Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.

Архитектура Django

Архитектура Django похожа на «Модель-Представление-Контроллер» (MVC). Контроллер классической модели MVC примерно соответствует уровню, который в Django называется представление (англ. View), а презентационная логика представления реализуется в Django уровнем Шаблонов (англ. Template). Из-за этого уровневую архитектуру Django часто называют «Модель-Шаблон-Представление» (MTV).
N|Solid

Архитектура Django состоит из четырех основных компонентов:

  1. Модель - это важнейшая часть приложения, которое постоянно обращается к данным при любом запросе из любой сессии. Любая модель является стандартным Python классом. ORM обеспечивает таким классам доступ непосредственно к базам данных. Модель обеспечивает облегченный механизм доступа к слою данных, инкапсулирует бизнес-логику, не зависит от конкретного приложения.

  2. Представление выполняет разнообразные функции, в том числе контролирует запросы пользователя, выдаёт контекст в зависимости от его роли. View - это обычная функция, которая вызывается в ответ на запрос какого-то адреса (URL) и возвращает контекст.

  3. Шаблоны являются формой представления данных, имеют свой собственный простой метаязык и являются одним из основных средств вывода на экран;

  4. URL механизм внешнего доступа к представлениям (view). Встроенные в URL регулярные выражения делают механизм достаточно гибким. При этом одно представление может быть сконфигурировано к нескольким URL, предоставляя доступ различным приложениям. Здесь поддерживается философия закладок: URL становятся самодостаточными и начинают жить независимо от представления.

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

Представления в значительной степени формируют логику приложений на платформе Django. Их определение выглядит обманчиво просто, функции на языке Python, связанные с одним или более адресами URL и возвращающие объекты ответов HTTP.

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

ORM – Object Relational Mapping (Объектно-реляционное отображение)

N|Solid
Это такая методика или техника программирования, предназначенная для преобразования между несовместимыми типами данных в объектно-ориентированных языках программирования. Cоздается некая абстракция - “виртуальная объектная база”, запросы к которой, преобразуются в SQL команды, т.е. больше не нужно писать SQL-запросы к базе данных вручную.

ORM фреймворк может быть написан на каком-либо объектно-ориентированном языке ( PHP, Python, Ruby ) и представлять обертку над некой реляционной базой данных. Классы будут соответствовать таблицам в базе, а экземпляры этих классов – конкретным строкам таблицы.

Принцип работы ORM

Ключевой особенностью ORM является отображение, которое используется для привязки объекта к его данным в БД. ORM как бы создает «виртуальную» схему базы данных в памяти и позволяет манипулировать данными уже на уровне объектов. Отображение показывает как объект и его свойства связанны с одной или несколькими таблицами и их полями в базе данных. ORM использует информацию этого отображения для управления процессом преобразования данных между базой и формами объектов, а также для создания SQL-запросов для вставки, обновления и удаления данных в ответ на изменения, которые приложение вносит в эти объекты.

Преимущества

✅ Независимость от вида базы данных

Это, пожалуй, главнейшая особенность использования ORM в приложении. Так как нет необходимости писать специфический код под конкретный вид базы данных. Поэтому, вы можете начать проект с использования SQLite, затем можете поменять ее на MySQL или PostgreSQL. Всё это делается редактированием пары строчек кода в настройках адаптера базы данных.

✅ Моделирование предметной области

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

✅ Меньше кода и больше эффективности

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

✅ Развитый интерфейс запросов к базе

В ORM предусмотрен богатый интерфейс, освобождающий разработчика от сложной семантики SQL.

✅ Управление зависимостями

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

✅ Параллелизм, кэширование и транзакции

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

Недостатки

❎ Накладные расходы

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

❎ Кривая изучения

Применение ORM в PHP приложении предполагает, что у разработчика есть опыт работы с каким либо PHP фреймворком.

❎ Производительность

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

CRUD-модель

CRUD — акроним, обозначающий четыре базовые функции, используемые при работе с базами данных: создание (англ. create), чтение (read), модификация (update), удаление (delete).
N|Solid

Операции CRUD в Django

Пример: сделать сайт платформой, на которой пользователь может добавлять, редактировать и удалять свои любимые фильмы.
  1. Создайте новый проект, выполнив следующую команду:
    django-admin startproject CRUD, где CRUD - это название проекта
  2. Запустите приложение CRUD_FBVs:
    python manage.py startapp CRUD_FBVs
  3. Добавьте новое приложение в установленное приложение.
INSTALLED_APPS = [  
'django.contrib.admin',  
'django.contrib.auth',  
'django.contrib.contenttypes',  
'django.contrib.sessions',  
'django.contrib.messages',  
'django.contrib.staticfiles',  
'CRUD_FBVs',  
]  
  1. Cоздание модели фильма. Откройте CRUD_FBVs / models.py и добавьте в него следующий код:
from django.db import models  
from django.urls import reverse  
from django.contrib.auth.models import User  
  
class Movies(models.Model):  
  
'''''by specifying user as Foreign Key, we're using the builtin User model of django.'''  
  
   user = models.ForeignKey(User, on_delete=models.CASCADE)  
   title = models.CharField(max_length=200)  
   genre = models.CharField(max_length=200)  
  
   def __unicode__(self):  
     return self.title  
  
   def get_absolute_url(self):  
     return reverse('CRUD_FBVs:movies_edit', kwargs={'pk': self.pk})  
  1. Введите python manage.py makemigrations и
    python manage.py migrate
  2. Зарегистрируем нашу модель в интерфейсе администратора. Измените файл CRUD_FBVs / admin.py следующим образом:
from django.contrib import admin  
from .models import Movies  
 admin.site.register(Movies)  
  1. Нам также необходимо создать простую форму для выполнения операций CRUD. Создайте новый файл Python внутри вашего приложения и назовите его forms.py. Добавьте следующий код к нему:
from django import forms  
from .models import Movies  
class MoviesForm(forms.ModelForm):  
    class Meta:  
        model = Movies  
        fields = ['title', 'genre']  
  1. Используем декораторы для достижения специальной функциональности:
from django.contrib.auth.decorators import login_required  
from django.shortcuts import render, get_object_or_404, redirect  
from .forms import MoviesForm  
from CRUD_FBVs.models import Movies  
 
 
@login_required  
def movies_list(request):  
    if request.user.is_superuser:  
        movies = Movies.objects.all()  
    else:  
        movies = Movies.objects.filter(user=request.user)  
    return render(request, 'movies_list.html', {  
        'object_list': movies  
    })  
 
 
@login_required  
def movies_create(request):  
    form = MoviesForm(request.POST or None)  
  
    if form.is_valid():  
        movies = form.save(commit=False)  
        movies.user = request.user  
        movies.save()  
        return redirect('CRUD_FBVs:movies_list')  
    return render(request, 'movies_form.html', {'form': form})  
 
 
@login_required  
def movies_update(request, pk):  
    if request.user.is_superuser:  
        movies = get_object_or_404(Movies, pk=pk)  
    else:  
        movies = get_object_or_404(Movies, pk=pk, user=request.user)  
    form = MoviesForm(request.POST or None, instance=movies)  
    if form.is_valid():  
        form.save()  
        return redirect('CRUD_FBVs:movies_list')  
    return render(request, 'movies_form.html', {'form': form})  
 
 
@login_required  
def movies_delete(request, pk):  
    if request.user.is_superuser:  
        movies = get_object_or_404(Movies, pk=pk)  
    else:  
        movies = get_object_or_404(Movies, pk=pk, user=request.user)  
    if request.method == 'POST':  
        movies.delete()  
        return redirect('CRUD_FBVs:movies_list')  
    return render(request, 'confirm_delete.html', {'object': movies})  

Мы импортировали декоратор @login_required, который ограничит функциональность операций CRUD зарегистрированным пользователям.

  1. Создайте папку шаблонов в вашем приложении и создайте HTML-файлы следующим образом:
# movie_list.html  

<h1>CRUD Function Based View Example</h1>  
<ul>  
    {% for movies in object_list %}  
    <li>{{ movies.title }}  {{ movies.genre }}  
    <a href="{% url 'CRUD_FBVs:movies_edit' movies.id %}">edit</a>  
    <a href="{% url 'CRUD_FBVs:movies_delete' movies.id %}">delete</a>  
    </li>  
    {% endfor %}  
</ul>  
  
<a href="{% url 'CRUD_FBVs:movies_new' %}">Add</a>  
# movies_form.html  
  
<h1> CRUD Function Based View Example</ h1>  
<form method = "post" >  
    {% csrf_token%}  
    {{form.as_p}}  
    <input type = "submit"  value = "Submit"  />  
 </form> 
#confirm_delete.html  
 
<h1>CRUD Function Based View Example</h1>  
<form method="post">  
   {% csrf_token %}  
    Are you sure you want to delete "{{ object }}" ?  
    <input type="submit" value="Submit" />  
</form> 
  1. Укажите URL-адреса. Добавьте следующий код в urls.py:
from django.conf.urls import url  
from django.contrib import admin  
from CRUD_FBVs import views  
  
app_name = 'CRUD_FBVs'  
  
urlpatterns = [  
    url('admin/', admin.site.urls),  
    url(r'^$', views.movies_list, name='movies_list'),  
    url(r'^new$', views.movies_create, name='movies_new'),  
    url(r'^edit/(?P<pk>\d+)$', views.movies_update, name='movies_edit'),  
    url(r'^delete/(?P<pk>\d+)$', views.movies_delete, name='movies_delete'),  
]  
  1. Приложение готово к работе. Запустите ваш сервер, выполнив следующую команду:
    python manage.py runserver

Полезные материалы

✔️ Rus-linux.net
✔️ Studbooks.net
✔️ ИНТУИС
✔️ Концепция MVC
✔️ Model-View-Presenter
✔️ C# - Паттерн MVC
✔️ ORM
✔️ CRUD Operations In Django