Научная статья на тему 'Формальное описание прикладных предметных областей в понятиях унифицированной метамодели объектно-ориентированных приложений баз данных'

Формальное описание прикладных предметных областей в понятиях унифицированной метамодели объектно-ориентированных приложений баз данных Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
370
62
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ / ОБЪЕКТНО-ОРИЕНТИРОВАННЫЕ БАЗЫ ДАННЫХ / МЕТАМОДЕЛЬ ОБЪЕКТНОЙ СИСТЕМЫ / ФОРМАЛЬНОЕ ОПИСАНИЕ ОБЪЕКТНЫХ МОДЕЛЕЙ

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Олейник П. П.

В данной статье представлено формальное описание объектных моделей в понятиях унифицированной метамодели объектно-ориентированных приложений баз данных, разрабатываемой автором и независящей от предметной области. Описанная метамодель реализована автором в собственной среде разработки SharpArchitect RAD Studio. В качестве формального аппарата используется теория множеств. В общем виде описанный подход может быть представлен как: DMFM = (DC, HC, QC, MPC, EC) где: DC (DomainClass) - непустое множество классов предметной области, т.е. dmfm DMFM, DC ≠ ; HC (HelperClass) - множество вспомогательных классов; QC (QueryClass) - множество классов-запросов; MPC (MethodParameterClass) - множество классов-параметров методов; EC (EnumClass) - множество классов-перечислений и классов-множеств элементов. Затем в статье кратко описываются структура каждого множества, элементами которого является кортеж определённого вида. Основным метаклассом является класс предметной области, который представим следующим образом: DC ={(ATT, BC dc, M, E, VLR, VSR, BHC, R)} где элементы кортежа каждого КПО заданы следующим образом: ATT (Attribute) - множество атрибутов класса предметной области, ATT ≠ V BC ≠ ; BC dc (BaseClass)- множество базовых классов предметной области, от которого унаследован данный, DC BC dc; M (Method) - множество методов класса, позволяющих реализовать поведение экземпляров классов, т.е. динамическую составляющую; E (Event) - множество обработчиков событий, возникающих в жизненном цикле объекта класса предметной области; VLR (ValidationRule) - множество предикатов, представляющих валидационные правила, которым должен отвечать каждый объект; VSR (VisualizationRule) - множество визуализационных правил, которые управляют видимостью, доступность, цветом отдельных атрибутов; BHC (BehaviorController) - множество контроллеров поведения, позволяющих управлять как поведением объектов, так и пользовательским интерфейсом приложения; R (Report) - множество отчетов системы, позволяющие выводить экземпляры класса (объекта) в удобном для пользователя виде с возможностью распечатки данных. В заключении статьи сделаны предположения о направлениях дальнейшего развития предложенного подхода.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Формальное описание прикладных предметных областей в понятиях унифицированной метамодели объектно-ориентированных приложений баз данных»

3. Найти эффективную долю пропускной способности сетевого канала. Для 100 Мб/с Ethernet канала эффективная пропускная способность равна 60-80% от всей ширины канала.

4. Вычислить эффективную пропускную способность защищаемого канала:

Для 100 Мб/c сети Ethernet:

100

Мб

N

^ **тах

N

* • r^fiW

L

1500 65000 * 2

8 « 0300п

с:

1000 „„„„п

—-----= 400015,5 МС с ;

2. ^гг 1500

3. Коэффициент пропускной способности Кэф = 0,6;

Если для 100 Мб/с сети максимальное количество пакетов канального уровня равно 8300 в секунду, то полученная реализация позволяет отправлять 4800 пакетов/с. А так как эффективное использование сети из-за возникновения коллизий составляет 60-80% от пропускной способности канала, то данная реализация системы обеспечения безопасного канала передачи данных позволяет защищать 96% всего проходящего трафика, проходящего через узел.

Литература

1. OpenVPN - The Open Source VPN [Электронный ресурс]. - Режим доступа: https://openvpn.net/, свободный. - Загл. с экрана.

2. Liu, J. A real-time network simulation infrastructure based on OpenVPN / J. Liu, Y. Li, N. Van Vorst, S. Mann, K. Hellman // The Journal of Systems and Software. - 82, 2009 - P. 473-485.

3. Radhakrishnan, S. TCP fast open / S. Radhakrishnan, Y. Cheng, J. Chu, A. Jain, B. Raghavan // Proceedings of the Seventh Conference on emerging Networking Experiments and Technologies. - ACM, 2011. -21 P.

4. Vratonjic, N. The inconvenient truth about web certificates / N. Vratonjic, J. Freudiger, V. Bindschaedler, J. P. Hubaux // Economics of Information Security and Privacy III. -Springer New York, 2013. - P. 79-117.

5. Неклюдова, С. А. Парадигмы программирования как инструменты разработчика программных систем / С. А. Неклюдова, А. Р. Балса // Межвузовский сборник научных трудов: Информационные технологии и системы. - №. 1. - С. 12.

6. Буч, Г. Объектно-ориентированный анализ и проектирование с примерами приложений на C++. - СПб : Невский диалект, 1998.

УДК 004.04

ФОРМАЛЬНОЕ ОПИСАНИЕ ПРИКЛАДНЫХ ПРЕДМЕТНЫХ ОБЛАСТЕЙ В ПОНЯТИЯХ УНИФИЦИРОВАННОЙ МЕТАМОДЕЛИ ОБЪЕКТНООРИЕНТИРОВАННЫХ ПРИЛОЖЕНИЙ БАЗ ДАННЫХ

Олейник Павел Петрович, к.т.н, системный архитектор программного обеспечения,

ОАО "Астон", доцент, Шахтинский институт (филиал) Южно-Российского государственного политехнического университета им. М.И. Платова, Россия, Ростов-на-Дону, [email protected]

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

108

множественной модели, то есть с помощью описания х: Т, "х имеет тип Т", что эквивалентно описанию принадлежности (х £ Т,"х является членом множества Т").

При этом все операции программы можно моделировать как набор манипуляций с множествами. Базисом для разработанной формальной модели является унифицированная метамодель объектной системы, подробно представленная в работах [1-8].

При проектировании информационных системы необходимо построить модель предметной области, содержащую различные типы сущностей. Например, сущность Продукт, Приход и Расход являются сохраняемыми сущностями, а сущность Оборотносальдовая ведомость является вычисляемой, т.е. её экземпляры не сохраняются в БД непосредственно, а рассчитываются на основании других сохраняемых сущностей. С формальной точки зрения, формальная модель модели предметной области, построенной в понятиях унифицированная метамодели объектно-ориентированного приложения БД (ФММПОуммоопбд) представляет собой кортеж, состоящий из множеств и представляемый как (1):

DMFM = (DC, HC, QC, MPC, EC) (1)

где:

DC (DomainClass) - непустое множество классов предметной области, т.е. dmfm

£ DMFM, DC ^ 0;

HC (HelperClass) - множество вспомогательных классов;

QC (QueryClass) - множество классов-запросов;

MPC (MethodParameterClass) - множество классов-параметров методов;

EC (EnumClass) - множество классов-перечислений и классов-множеств элементов.

Рассмотрим описание каждого перечисленного множества. Классы предметной области (КПО, Domain Class, DC) - это ключевой элемент, используемый для моделирования сущностей предметной области, экземпляры которых сохраняются в БД. В общем случае для описания всех классов предметной области (DC) используется множество, элементами которых является кортеж, и описываемое как (2):

DC = {(ATT, BCdc, M, E, VLR, VSR, BHC, R)} (2)

где элементы кортежа каждого КПО заданы следующим образом:

ATT (Attribute) - множество атрибутов класса предметной области, ATT Ф 0 V ВС Ф 0;

BCdc (BaseClass)- множество базовых классов предметной области, от которого унаследован данный, DC ^ BCdc;

M (Method) - множество методов класса, позволяющих реализовать поведение экземпляров классов, т.е. динамическую составляющую;

E (Event) - множество обработчиков событий, возникающих в жизненном цикле объекта класса предметной области;

VLR (ValidationRule) - множество предикатов, представляющих валидационные правила, которым должен отвечать каждый объект;

VSR (VisualizationRule) - множество визуализационных правил, которые управляют видимостью, доступность, цветом отдельных атрибутов;

BHC (BehaviorController) - множество контроллеров поведения, позволяющих управлять как поведением объектов, так и пользовательским интерфейсом приложения;

R (Report) - множество отчетов системы, позволяющие выводить экземпляры класса (объекта) в удобном для пользователя виде с возможностью

распечатки данных.

При этом выполняется следующее ограничение:

dc € DC, V bcdc£i BCdc £ DC=> dc J? BCdc

Для описания свойств (характеристик) экземпляров классов (объектов) необходимо описать множество атрибутов ATT, формально описываемое как кортеж вида (3):

ATT = {(Name, AttributeKind, Multiplicity, dc, hc, ec)} (3)

109

где:

Name - уникальное название атрибута (правильный идентификатор); AttributeKind - вид атрибута;

Multiplicity - множественность атрибута (минимальное и максимальное количество связанных объектов);

dc - класс предметной области (dc DC) , указывается когда AttributeKind = DomainClassAttribute или AttributeKind = GeneratedAttribute;

he - вспомогательный класс (he £ НС) , указывается когда AttributeKind = HelperClassAttribute или AttributeKind = GeneratedAttribute;

ее - класс-перечисление / класс-множество (ее £ ЕС), указывается когда AttributeKind = EnumAttribute.

Система предоставляет разработчику множество различных видов атрибутов, которые можно представить как (4):

AttributeKind = {BuiltInClassAttribute, ColorAttribute, DateTimeAttribute, DecimalAttribute, DomainClassAttribute, EnumAttribute,

FileDataAttribute, GeographyAttribute, GeometryAttribute,

HelperClassAttribute, HyperLinkAttribute, ImageAttribute, IntAttribute, LogicalAttribute, MetaModelClassAttribute, MoneyAttribute,

ObjectAttribute, StringAttribute, SymbolAttribute, TextAttribute, TimeAttribute, TypeAttribute} (4)

где:

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

ColorAttribute - цветовой атрибут, используется для представления целочисленной константы описывающей цвет;

DateTimeAttribute - дата-временной атрибут, используется для представления даты и времени;

DecimalAttribute - дробный атрибут, значением которого является дробное число;

DomainClassAttribute - предметно-классовый атрибут, значением которого является экземпляр (объект) класса предметной области. Часто используется для организации отношений ассоциаций;

EnumAttribute - перечисляемый/множественный атрибут, используется для хранения значения перечисления/множества;

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

GeneratedAttribute - сгенерированный атрибут, применяется для представления атрибутов, которые автоматически генерируются системой;

GeographyAttribute - географический атрибут, используется для представления географических координат;

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

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

HyperLinkAttribute - гиперссылочный атрибут, значением которого является гиперссылка;

ImageAttribute - графический атрибут, используется для сохранения изображений;

IntAttribute - целочисленный атрибут, применяется для хранения целочисленных значений;

LogicalAttribute - логический атрибут, используется для хранения булевого значения (0 или 1);

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

MoneyAttribute - денежный атрибут, применяется для сохранения значений в валюте;

ObjectAttribute - объектный атрибут, используется для сохранения объекта любого типа;

110

StringAttribute - строковый атрибут, применяется для сохранения строки текста;

SymbolAttribute - символьный атрибут, используется для сохранения символа;

TextAttribute - текстовый атрибут, применяется для сохранения текста неограниченной длины с форматированием;

TimeAttribute - временной атрибут, используется для хранения времени;

TypeAttribute - типовый атрибут, применяется для сохранения названия типа данных.

Допустимыми значениями для множественности являются:

Multiplicity = {0..1, 1..1, 0..*, 1..*}

Так как предполагается организация двунаправленных ассоциации, реализуемых с помощью описания двух атрибутов на разных краях, то подобным способом можно описать и другие виды множественности, например, многие-ко-многим (*..*). Отметим, что обязательными элементами в выражении (4) являются лишь Name, AttributeKind, т.е. имя и вид атрибута. Остальные компоненты не обязательны и могут отсутствовать при описании атрибута.

Множество M, позволяет реализовать поведение экземпляров классов в виде методов, т.е. динамическую составляющую и представимо в виде (5):

M = {(Name, mpc, Body)} (5)

где:

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Name - название метода (правильный идентификатор);

mpc - параметр метода, mpc € МРС;

Body - строки программного кода, реализующего метод.

Каждый метод представляет собой процедуру (функцию, не возвращающую результат). При этом функция может иметь параметр, представляемый элементом множества MPC. Т.е. реализуется шаблон (паттерн) проектирования объект-параметр (parameter object), когда в качестве параметра передается экземпляр класса.

Множество E представляет собой множество обработчиков событий, возникающих в жизненном цикле объекта (экземпляра) сущности, описываемой классом предметной области и представляемых в виде (6):

E = {(Name, EventKind, Body)} (6)

где:

Name - название обработчика события(правильный дентификатор);

EventKind - вид события для которого создается обработчик;

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

Для описания видов событий используется перечисление вида (7):

EventKind = {AfterChangedAttributeValueEvent, AfterDeletedEvent, AfterLoadedEvent, AfterSavedEvent, BeforeDeletingEvent, BeforeSavingEvent,

InitializationEvent} (7)

где:

AfterChangedAttributeValueEvent - событие, вызываемое после изменения значения атрибута объекта;

AfterDeletedEvent - событие, вызываемое после удаления объекта;

AfterLoadedEvent - событие, вызываемое после загрузки объекта;

AfterSavedEvent - событие, вызываемое после сохранения объекта

BeforeDeletingEvent - событие, вызываемое перед удалением объекта;

BeforeSavingEvent - событие, вызываемое перед сохранением объекта;

InitializationEvent - событие инициализации объекта.

Множество предикатов, представляющих валидационные правила, которым должен отвечать каждый объект, представимо множеством VLR, которое описывается (7):

VLR = {(cr, ATTvlr)} (7)

111

где:

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

Для улучшения анализа данных и упрощения представления используются множество визуализационных правил VSR, представляющих собой неупорядоченные тройки вида (8):

VSR = {(cr, vrk, ATTvsr)} (8)

где:

cr - предикат, определяющий применимость визуализационных правил; vrk - определяет вид визуализационного правила;

ATTvsr - множество атрибутов, на которое распространяется визуализационное правило,

при этом выполняется:

ATTvsr — ATT vrk G VRK где:

VRK = {HideProperty, DisableProperty, SetFontColor, SetBackgroundColor} где:

HideProperty - данный вид правила скрывает атрибуты;

DisableProperty - данный вид правила делает неактивными атрибуты; SetFontColor - данный вид правила устанавливает цвет шрифта в редакторах атрибутов;

SetBackgroundColor - данный вид правила устанавливает цвет фона в редакторах атрибутов.

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

Множество отчетов R представляет набор отчетов, каждый из которых описывается расширяемым языком разметки XML и содержит данные, интерпретируемые прикладной программой.

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

В (9) представлено формальное описание множества вспомогательных классов (HC):

HC = {(ATT, bchc, PC, M, VSR, BHC, R)} (9)

где:

ATT (Attribute) - множество атрибутов класса предметной области; bcdc (BaseClass) - базовый вспомогательный класс, от которого унаследован данный;

PC (ProgramCode) - программный код реализации вспомогательного класса, представляемый в виде множества строк языка C#;

M (Method) - множество методов класса, позволяющих реализовать поведение экземпляров классов, т.е. динамическую составляющую;

VSR (VisualizationRule) - множество визуализационных правил, которые управляют видимостью, доступностью цветом отдельных атрибутов;

BHC (BehaviorController) - множество контроллеров поведения, позволяющих управлять как поведением объектов, так и пользовательским интерфейсом приложения;

R (Report) - множество отчетов системы, позволяющие выводить экземпляры класса (объекта) в удобном для пользователявиде с возможностью распечатки данных.

Пи этом выполняются следующие ограничения:

V umm Е UMM V he £ НС, ATT ф 0 V bcdc Ф 0 V PC Ф 0

V he Е НС, V bchc £ НС =) he ф behc

В (10) представлено формальное описание множества классов-запросов (QC):

QC = {(ATT, PC, VSR, BHC, R)} (10)

112

где:

ATT (Attribute) - множество атрибутов класса предметной области;

PC (ProgramCode) - программный код реализации вспомогательного класса, представляемый в виде множества строк языка C#;

VSR (VisualizationRule) - множество визуализационных правил, которые управляют видимостью, доступностью, цветом отдельных атрибутов;

BHC (BehaviorController) - множество контроллеров поведения, позволяющих управлять как поведением объектов, так и пользовательским интерфейсом приложения;

R (Report) - множество отчетов системы, позволяющие выводить экземпляры класса (объекта) в удобном для пользователя виде с возможностью распечатки данных.

при этом выполняются следующие ограничения:

V umm Е UMM V qc Е QC, ATT ф 0 V PC ф 0

В (11) представлено формальное описание множества классов-параметров методов (MPC):

MPC = {(ATT, bcmpc, UM, M, VLR, VSR, BHC, R)} (11)

где:

ATT (Attribute) - множество атрибутов класса предметной области;

bcmpc (BaseClass)- базовый класс-параметр методов, от которого унаследован данный;

UM (UsingMethod) - множество методов, которые используют данный класс в качестве параметра;

M (Method) - множество методов класса, позволяющих реализовать поведение экземпляров классов, т.е. динамическую составляющую;

VLR (ValidationRule) - множество предикатов, представляющих валидационные правила, которым должен отвечать каждый объект;

VSR (VisualizationRule) - множество визуализационных правил, которые управляют видимостью, доступностью, цветом отдельных атрибутов;

BHC (BehaviorController) - множество контроллеров поведения, позволяющих управлять как поведением объектов, так и пользовательским интерфейсом приложения;

R (Report) - множество отчетов системы, позволяющие выводить экземпляры класса (объекта) в удобном для пользователя виде с возможностью

распечатки данных.

При этом выполняются следующие ограничения:

V umm Е UMM V mpc Е MPC, ATT ф 0 V Ьстрс^ 0

V mpc Е MPC, V bcmpc Е МРС =) трс ф Ьстрс

В (12) представлено формальное описание множества классов-перечислений (EC), представляющее именованные констаны с присвоенными целыми значениями:

EC = {(Name,ek, {vali = 2X-1})} (12)

Где:

i Е 0..п;

ek Е EnumKind;

EnumKind = {Enum, Set} - тип класса перечисления, Enum - описывает перечисление, а Set - множество.

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

Дальнейшее развитие данной работы автор видит в применении описанного формального подхода для описания какой-либо объектной модели. Будущие статьи планируется посвятить описанию унифицированной модели тестирования инструментов разработки объектно-ориентированных приложений в понятиях представленного аппарата.

Литература

113

1. Олейник П.П., программа для ЭВМ "Унифицированная среда быстрой разработки корпоративных информационных систем SharpArchitect RAD Studio", свидетельство о государственной регистрации № 2013618212 от 04 сентября 2013 г.

2. Олейник П.П. Иерархия классов метамодели объектной системы // Объектные системы -2012: материалы VI Международной научно-практической конференции (Ростов-на-Дону, 1012 мая 2012 г.) / Под общ. ред. П.П. Олейника. - Ростов-на-Дону: ШИ ЮРГТУ (НПИ), 2012. -С. 37-40., http://obiectsvstems.ru/files/2012/Qbiect Systems 2012 Proceedings.pdf

3. Олейник П.П. Иерархия классов представления валидационных правил объектной системы //

Объектные системы - 2013: материалы VII Международной научно-практической

конференции (Ростов-на-Дону, 10-12 мая 2013 г.) / Под общ. ред. П.П. Олейника. - Ростов-на-Дону: ШИ (ф) ЮРГТУ (НПИ), 2013. - С. 14-17.,

http://obiectsvstems.ru/files/2013/Obiect Systems 2013 Proceedings.pdf

4. Oleynik P.P. Domain-driven design the database structure in terms of metamodel of object system // Proceedings of 11th IEEE East-West Design & Test Symposium (EWDTS'2013), Institute of Electrical and Electronics Engineers (IEEE), Rostov-on-Don, Russia, September 27 - 30, 2013, pp. 469-472.

5. Олейник П.П. Элементы среды разработки программных комплексов на основе организации метамодели объектной системы // Бизнес-информатика. 2013. №4(26). - С. 69-76., http://biioumal.hse.ru/data/2014/01/16/1326593606/1BI%204(26)%202013.pdf

6. Олейник П.П. Предметно-ориентированное проектирование структуры базы данных в понятиях метамодели объектной системы // Объектные системы - 2014: материалы VIII Международной научно-практической конференции (Ростов-на-Дону, 10-12 мая 2014 г.) / Под общ. ред. П.П. Олейника. - Ростов-на-Дону: ШИ (ф) ЮРГПУ (НПИ) им. М.И. Платова, 2014. - С. 41-46., http://obiectsystems.ru/files/2014/Qbiect Systems 2014 Proceedings.pdf

7. Oleynik P.P. Using metamodel of obiect system for domain-driven design the database structure // Proceedings of 12th IEEE East-West Design & Test Symposium (EWDTS’2014), Kiev, Ukraine, September 26 - 29, 2014, DOI: 10.1109/EWDTS.2014.7027052

8. Олейник П.П., Кураков Ю.И. Концепция создания обслуживающей корпоративной информационной системы экономического производственно-энергетического кластера // Прикладная информатика. 2014. №6. - С. 5-23.

9. Олейник П.П. Унифицированная модель тестирования инструментов разработки объектноориентированных приложений // Объектные системы - 2014 (Зимняя сессия): материалы IX Международной научно-практической конференции (Ростов-на-Дону, 10-12 декабря 2014 г.) / Под общ. ред. П.П. Олейника. - Ростов-на-Дону: ШИ (ф) ЮРГПУ (НПИ) им. М.И. Платова, 2014. С. 23-32.,

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

http://obiectsystems.ru/files/2014WS/Obiect Systems 2014 Winter session Proceedings.pdf

УДК 004.42

КОНЦЕПТУАЛЬНАЯ МОДЕЛЬ ПРОГРАММНОГО КОМПЛЕКСА МОНИТОРИНГА СРЕДСТВ МАССОВОЙ ИНФОРМАЦИИ В СЕТИ ИНТЕРНЕТ

Губарев Илья Дмитриевич, программист отдела разработки информационно-аналитических систем, Санкт-Петербургский Информационно-Аналитический Центр, Россия, Санкт-Петербург,

[email protected]

Курилкин Алексей Владимирович, начальник сектора отдела разработки информационноаналитических систем, Санкт-Петербургский Информационно-Аналитический Центр, Россия, Санкт-

Петербург, kurilkin@iac. spb. ru

Змиевский Александр Федорович, программист отдела разработки информационно-аналитических систем, Санкт-Петербургский Информационно-Аналитический Центр, Россия, Санкт-Петербург,

zmievskiy@iac. spb. ru

В последние несколько лет в России наблюдается все большее развитие СМИ в сфере Интернет, ввиду широкой доступности и динамичности обновления данных. На данный

114

i Надоели баннеры? Вы всегда можете отключить рекламу.