Архитектура информационной системы – концепция, определяющая модель, структуру, выполняемые функции и взаимосвязь компонентов информационной системы.
Идеи MVC сформулировал Трюгве Реенскауг (Trygve Reenskaug) во время работы в Xerox PARC над языком программирования «Smalltalk» в конце 70-х годов.
✅ Задача, которую Реенскауг решал совместно с группой разработчиков, заключалась в том, чтобы упростить взаимодействие рядового пользователя с компьютером. Необходимо было создать средства, которые с одной стороны были бы предельно простыми, а с другой — давали бы возможность управлять компьютером и сложными приложениями.
Позже, Стив Бурбек реализовал шаблон в Smalltalk-80. Окончательная версия концепции MVC была опубликована лишь в 1988 году в журнале Technology Object
Контроллер управляет запросами пользователя (получаемые в виде запросов HTTP GET или POST, когда пользователь нажимает на элементы интерфейса для выполнения различных действий). Его основная функция — вызывать и координировать действие необходимых ресурсов и объектов, нужных для выполнения действий, задаваемых пользователем. Обычно контроллер вызывает соответствующую модель для задачи и выбирает подходящий вид.
Модель - это правила, которые используются для работы с данными, которые представляют концепцию управления приложением. В любом приложении вся структура моделируется как данные, которые обрабатываются определённым образом. Например, дата не может указывать в будущее, e-mail должен быть в определённом формате, имя не может быть длиннее Х символов, и так далее. Модель содержит наиболее важную часть логики приложения.
Вид обеспечивает различные способы представления данных, которые получены из модели. Он может быть шаблоном, который заполняется данными. Может быть несколько различных видов, и контроллер выбирает, какой подходит наилучшим образом для текущей ситуации.
Веб приложение обычно состоит из набора контроллеров, моделей и видов. Контроллер может быть устроен как основной, который получает все запросы и вызывает другие контроллеры для выполнения действий в зависимости от ситуации.
Представление - это форма, на которой есть поле, куда пользователь будет вводить вопрос. Представление этот вопрос посылает контроллеру. Контроллер посылает запрос модели. После получения результата, контроллер дает ответ представлению. Уже в самом представлении пользователь увидит ответ.
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));
}
}
}
namespace MVC
{
class Controller
{
public string Question(string msg)//msg - то что ищем
{
Model model = new Model();
return "На даный момент у нас товар "
+ model.GetAnser(msg);
}
}
}
namespace MVC
{
class Model
{
//question - то что ищем
public string GetAnser(string question)
{
return DataBase.GetAnser(question);
}
}
}
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 "нет в наличие.";
}
}
}
}
}
Model-View-Presenter (MVP) — шаблон проектирования, производный от MVC, который используется в основном для построения пользовательского интерфейса.
Элемент 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);
}
}
Фреймворк предоставляет API на языке C++. Qt часто используется разработчиками для разработки кроссплатформенных приложений.
На верхнем уровне находится код программы на языке C++. Уровнем ниже расположены классы Qt для создания графического интерфейса, взаимодействия с WebKit, работы с базами данных и.т.д., а еще ниже расположен уровень поддержки различных операционных систем.
Проект поддерживается организацией Django Software Foundation.
Сайт на Django строится из одного или нескольких приложений, которые рекомендуется делать отчуждаемыми и подключаемыми. Это одно из существенных архитектурных отличий этого фреймворка от некоторых других.
Также, в отличие от других фреймворков, обработчики URL в Django конфигурируются явно при помощи регулярных выражений.Для работы с базой данных Django использует собственный ORM, в котором модель данных описывается классами Python, и по ней генерируется схема базы данных.
Архитектура Django похожа на «Модель-Представление-Контроллер» (MVC). Контроллер классической модели MVC примерно соответствует уровню, который в Django называется представление (англ. View), а презентационная логика представления реализуется в Django уровнем Шаблонов (англ. Template). Из-за этого уровневую архитектуру Django часто называют «Модель-Шаблон-Представление» (MTV).
Модель - это важнейшая часть приложения, которое постоянно обращается к данным при любом запросе из любой сессии. Любая модель является стандартным Python классом. ORM обеспечивает таким классам доступ непосредственно к базам данных. Модель обеспечивает облегченный механизм доступа к слою данных, инкапсулирует бизнес-логику, не зависит от конкретного приложения.
Представление выполняет разнообразные функции, в том числе контролирует запросы пользователя, выдаёт контекст в зависимости от его роли. View - это обычная функция, которая вызывается в ответ на запрос какого-то адреса (URL) и возвращает контекст.
Шаблоны являются формой представления данных, имеют свой собственный простой метаязык и являются одним из основных средств вывода на экран;
URL механизм внешнего доступа к представлениям (view). Встроенные в URL регулярные выражения делают механизм достаточно гибким. При этом одно представление может быть сконфигурировано к нескольким URL, предоставляя доступ различным приложениям. Здесь поддерживается философия закладок: URL становятся самодостаточными и начинают жить независимо от представления.
С точки зрения многоуровневой архитектуры приложения, модель является самым нижним уровнем, или фундаментом. Представления и шаблоны могут добавляться и удаляться, изменять порядок ввода/вывода данных и их представления, но модель остается практически неизменной.
Представления в значительной степени формируют логику приложений на платформе Django. Их определение выглядит обманчиво просто, функции на языке Python, связанные с одним или более адресами URL и возвращающие объекты ответов HTTP.
Для отображения результатов в разметку HTML, которая часто является конечным результатом работы приложения, большинство разработчиков приложений на платформе Django используют язык шаблонов. Шаблоны, по сути, являются текстовыми документами в формате HTML, со специальным форматированием там, куда выводятся значения, получаемые динамически, поддерживающие возможность использовать простые логические конструкции, такие как циклы и другие.
Это такая методика или техника программирования, предназначенная для преобразования между несовместимыми типами данных в объектно-ориентированных языках программирования. Cоздается некая абстракция - “виртуальная объектная база”, запросы к которой, преобразуются в SQL команды, т.е. больше не нужно писать SQL-запросы к базе данных вручную.
ORM фреймворк может быть написан на каком-либо объектно-ориентированном языке ( PHP, Python, Ruby ) и представлять обертку над некой реляционной базой данных. Классы будут соответствовать таблицам в базе, а экземпляры этих классов – конкретным строкам таблицы.
Ключевой особенностью ORM является отображение, которое используется для привязки объекта к его данным в БД. ORM как бы создает «виртуальную» схему базы данных в памяти и позволяет манипулировать данными уже на уровне объектов. Отображение показывает как объект и его свойства связанны с одной или несколькими таблицами и их полями в базе данных. ORM использует информацию этого отображения для управления процессом преобразования данных между базой и формами объектов, а также для создания SQL-запросов для вставки, обновления и удаления данных в ответ на изменения, которые приложение вносит в эти объекты.
Это, пожалуй, главнейшая особенность использования ORM в приложении. Так как нет необходимости писать специфический код под конкретный вид базы данных. Поэтому, вы можете начать проект с использования SQLite, затем можете поменять ее на MySQL или PostgreSQL. Всё это делается редактированием пары строчек кода в настройках адаптера базы данных.
При использовании ORM для построения приложения, бизнес-логика приложения работает с объектами языка, а не с самой структурой базы данных. Это возможно благодаря соответствию между бизнес-моделью и самой базой данных.
ORM добавляет дополнительный слой абстракции, который позволяет разработчикам сконцентрироваться на их бизнес-логике, не отвлекаясь на создание сложных запросов к базе данных. Это приводит к сокращению количества необходимого для написания кода и увеличивает продуктивность разработчика.
В ORM предусмотрен богатый интерфейс, освобождающий разработчика от сложной семантики SQL.
ORM предоставляет свободное управление зависимостями в базе данных. Связанные объекты загружаются автоматически, когда вызов методов преобразуется в соответствующий SQL запрос.
ORM поддерживает возможность параллельной работы, позволяя нескольким пользователям одновременно изменять один и тот же объект.
Другая особенность – объекты могут быть сохранены в кэше, сокращая нагрузку на базу и вцелом увеличивая скорость работы приложения.
Изменения, вносимые в объект могут быть ограничены в рамках данной транзакции, которая может быть сохранена или возвращена обратно в первоначальное состояние. В каждый момент времени могут быть активными множество транзакций, но все эти транзакции изолированы друг от друга.
ORM фреймворк добавляет слой абстракции, ускоряющий процесс разработки и снижающий сложность создания конечного продукта. Однако приложение начинает потреблять больше памяти и нагрузка на процессор также увеличивается.
Применение ORM в PHP приложении предполагает, что у разработчика есть опыт работы с каким либо PHP фреймворком.
Некоторые операции, такие как массовая вставка, обновление, удаление и т.д., медленнее, когда выполняются посредством ORM. Поэтому, в таких случаях лучше использовать чистый SQL.
CRUD — акроним, обозначающий четыре базовые функции, используемые при работе с базами данных: создание (англ. create), чтение (read), модификация (update), удаление (delete).
django-admin startproject CRUD
, где CRUD - это название проектаpython manage.py startapp CRUD_FBVs
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'CRUD_FBVs',
]
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})
python manage.py makemigrations
иpython manage.py migrate
from django.contrib import admin
from .models import Movies
admin.site.register(Movies)
from django import forms
from .models import Movies
class MoviesForm(forms.ModelForm):
class Meta:
model = Movies
fields = ['title', 'genre']
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 зарегистрированным пользователям.
# 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>
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'),
]
python manage.py runserver
✔️ Rus-linux.net
✔️ Studbooks.net
✔️ ИНТУИС
✔️ Концепция MVC
✔️ Model-View-Presenter
✔️ C# - Паттерн MVC
✔️ ORM
✔️ CRUD Operations In Django