---
# System prepended metadata

title: ПРОГРАММА ГОСУДАРСТВЕННОГО ЭКЗАМЕНА

---

# ПРОГРАММА ГОСУДАРСТВЕННОГО ЭКЗАМЕНА
## «C#. Современные компьютерные технологии»

### 9. Обзор платформ для разработки графического интерфейса пользователя: Windows Forms и Windows Presentation Fondation

Общее:
1) Для чего? - для быстрой разработк пользовательского интерфейса
2) ООП фреймворк
3) содержит большое количество классов (контролы)

Различия:
| W Forms                          | WPF                         |
| -------------------------------- | --------------------------- |
| Работает за счет ЦП и видеокарты | Аппаратное ускрение графики |
| Императивный    | Декларативное описание интерфейса UI (верстка), язык XAML |
|Растровая графика  |  Векторная графика                   |
|                                  |  Наличие стилей              |
|                                  |  Адаптивная верстка          |
|                                  |  Есть система анимаций по ключевым кадрам|
|                                  |  Есть система привязки данных (Data Binding) |
| Абсолютное позиционирование (координаты по пикселям)  |  Относительное позиционирование (никаких координат). Для размещения используются контейнеры компоновки  |
|  Пример кнопки: Button btn = new Button(); bnt.Size = new Size(10, 10); | Пример кнопки XAML: <Button Width="10" Height="10"> Загрузка </Button>|

### 18. ASP .NET MVC и движок Razor: особенности, виды представлений и их компоновка
Цель движка представлений Razor - определить переход от разметки html к коду C#.
Использование синтаксиса Razor характеризуется тем, что перед выражением кода стоит знак @, после которого осуществляется переход к коду C#. Существуют два типа переходов: к выражениям кода и к блоку кода.
Например, переход к выражению кода:
`<p>@b.Name</p>`
Применение блоков кода аналогично, только знак @ ставится перед всем блоком кода, а движок автоматически определяет, где этот блок кода заканчивается:
```
@foreach (BookStore.Models.Book b in Model)
{
    <p>@b.Name</p>
}
```

### 19. Обзор существующих СУБД для веб разработки.

SQL-базы данных
1. Oracle
Oracle RDBMS (она же Oracle Database) на первом месте среди СУБД. Система популярна у разработчиков, проста в использовании, у нее понятная документация, поддержка длинных наименований, JSON, улучшенный тег списка и Oracle Cloud.
Разработчик: Oracle Corporation
Написана на:Assembly, C, C++

**Особенности**
* Обрабатывает большие данные.
* Поддерживает SQL, к нему можно получить доступ из реляционных БД Oracle.
* Oracle NoSQL Database с Java/C API для чтения и записи данных.
 
2. MySQL
MySQL работает на Linux, Windows, OSX, FreeBSD и Solaris. Можно начать работать с бесплатным сервером, а затем перейти на коммерческую версию. Лицензия GPL с открытым исходным кодом позволяет модифицировать ПО MySQL.
Эта система управления базами данных использует стандартную форму SQL. Утилиты для проектирования таблиц имеют интуитивно понятный интерфейс. MySQL поддерживает до 50 миллионов строк в таблице. Предельный размер файла для таблицы по умолчанию 4 ГБ, но его можно увеличить. Поддерживает секционирование и репликацию, а также Xpath и хранимые процедуры, триггеры и представления.
Разработчик: Oracle Corporation
Написана на C, C++

**Особенности**
* Масштабируемость.
* Лёгкость использования.
* Безопасность.
* Поддержка Novell Cluster.
* Скорость.
* Поддержка многих операционных систем.
 
3. Microsoft SQL Server
Самая популярная коммерческая СУБД. Она привязана к Windows, но это плюс, если вы пользуетесь продуктами Microsoft. Зависит от платформы. И графический интерфейс, и программное обеспечение основаны на командах. Поддерживает SQL, непроцедурные, нечувствительные к регистру и общие языки баз данных.

Разработчик: Microsoft Corporation
Написана на C, C++
 
**Особенности**
* Высокая производительность.
* Зависимость от платформы.
* Возможность установить разные версии на одном компьютере.
* Генерация скриптов для перемещения данных.

4. PosgreSQL
Масштабируемая объектно-реляционная база данных, работающая на Linux, Windows, OSX и некоторых других системах. В PostgreSQL 10 есть такие функции, как логическая репликация, декларативное разбиение таблиц, улучшенные параллельные запросы, более безопасная аутентификация по паролю на основе SCRAM-SHA-256.

Разработчик: PostgreSQL Global Development Group
Написана на C
Используется в компаниях: Apple, Cisco, Fujitsu, Skype, and IMDb
 
**Особенности**
* Поддержка табличных пространств, а также хранимых процедур, объединений, представлений и триггеров.
* Восстановление на момент времени (PITR).
* Асинхронная репликация.
 
NoSQL-базы данных
5. MongoDB
Самая популярная NoSQL система управления базами данных. Лучше всего подходит для динамических запросов и определения индексов. Гибкая структура, которую можно модифицировать и расширять. Поддерживает Linux, OSX и Windows, но размер БД ограничен 2,5 ГБ в 32-битных системах. Использует платформы хранения MMAPv1 и WiredTiger.

Разработчик: MongoDB Inc. в 2007
Написана на C++
 
**Особенности**
* Высокая производительность.
* Автоматическая фрагментация.
* Работа на нескольких серверах.
* Поддержка репликации Master-Slave.
* Данные хранятся в форме документов JSON.
* Возможность индексировать все поля в документе.
* Поддержка поиска по регулярным выражениям.

6. Microsoft Access
Система управления базами данных от Microsoft, которая сочетает в себе реляционное ядро БД Microsoft Jet с графическим интерфейсом пользователя и инструментами разработки ПО.
Идеально подходит для начала работы с данными, но производительность не рассчитана на большие проекты. В MS Access можно использовать C, C#, C++, Java, VBA и Visual Rudimental.NET. Access хранит все таблицы БД, запросы, формы, отчёты, макросы и модули в базе данных Access Jet в виде одного файла.

Разработчик: Microsoft Corporation

**Особенности**
* Можно использовать VBA для создания многофункциональных решений с расширенными возможностями управления данными и пользовательским контролем.
* Импорт и экспорт в форматы Excel, Outlook, ASCII, dBase, Paradox, FoxPro, SQL Server и Oracle.
* Формат базы данных Jet.

### 20. Обзор существующих CSS фреймворков для веб разработки.

**Boostrap.** Один из самых известных CSS-фреймворков на сегодняшний день. Имеет в своем составе шаблоны для отрисовки кнопок, сайдбаров, навигационных панелей, форм и других элементов сайта. Включает себя JavaScript-расширения.
Основные инструменты bootstrap — шаблоны, формы, навигация, алерты, типографика и конечно же, сетки. Bootstrap совместим со всеми основными современными браузерами, но в старых версиях браузеров могут быть проблемы. Поддерживает адаптивность.
**Foundation.** Распространенный CSS-фреймворк. Наряду с другими основными элементами включает в себя несколько HTML шаблонов с различным расположением блоков на странице. Имеет большой набор компонентов на JavaScript. Очень серьезный по своим возможностям и составу фреймворк. Совместимость кода со всеми основными браузерами.
**Semantic UI.** Поддержка Firefox, Chrome, Safari, Internet Explorer, Android 4, Blackberry10. Содержит большое количество компонентов: иконки, изображения, надписи, меню и другие стандартные компоненты. Поддерживает последние версии HTML и CSS и имеет хорошую подборку скриптовых модулей и API. Использует Less. По применимости соревнуется с bootstrap. Есть вариант на русском языке, но неполный.

И другие.
https://proglib.io/p/verstat-bystro-i-krasivo-15-populyarnyh-css-freymvorkov-2020-01-16

### 21. XML и JSON: синтаксис, примеры использования.
Синтаксис JSON выводится из JavaScript синтаксиса объекта обозначения:
– Данные в пар имя / значение
– Данные разделены запятыми
– Фигурные скобки держать объекты
– Квадратные скобки держать массивы
Массивы JSON
JSON массивы записываются в квадратных скобках.
Так же, как JavaScript, массив JSON может содержать несколько объектов:
```
"employees":[
    {"id":"1", "value":"12"},
    {"id":"2", " value ":"14"},
    {"id":"3"," value ":"16"}
]
```
Объекты JSON
Объекты JSON записываются в фигурные скобки.
Так же, как JavaScript, объекты JSON может содержать несколько имя / значений пар:
`{"firstName":"John", "lastName":"Doe"}`

Основная функциональность по работе с JSON сосредоточена в пространстве имен System.Text.Json.

Ключевым типом является класс JsonSerializer, который и позволяет сериализовать объект в json и, наоборот, десериализовать код json в объект C#.
**Пример:**
```
class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Person tom = new Person { Name = "Tom", Age = 35 };
            string json = JsonSerializer.Serialize<Person>(tom);
            Console.WriteLine(json);
            Person restoredPerson = JsonSerializer.Deserialize<Person>(json);
            Console.WriteLine(restoredPerson.Name);
        }
    }
```
Также возможны запись и чтение файла json.

XML - это расширяемый язык разметки (Extensible Markup Language), разработанный специально для размещения информации в интернете, наряду с HTML, который давно стал стандартным языком создания Web-страниц. 
XML является одним из распространенных стандартов документов, который позволяет в удобной форме сохранять сложные по структуре данные. Поэтому разработчики платформы .NET включили в фреймворк широкие возможности для работы с XML.
**Пример:**
```
<?xml version="1.0" encoding="utf-8" ?>
<users>
  <user name="Bill Gates">
    <company>Microsoft</company>
    <age>48</age>
  </user>
  <user name="Larry Page">
    <company>Google</company>
    <age>48</age>
  </user>
</users
```
XML-документ объявляет строка <?xml version="1.0" encoding="utf-8" ?>. Она задает версию (1.0) и кодировку (utf-8) xml. Далее идет собственно содержимое документа.
XML-документ должен иметь один единственный корневой элемент, внутрь которого помещаются все остальные элементы. В данном случае таким элементом является элемент <users>. Внутри корневого элемента <users> задан набор элементов <user>. Вне корневого элемента мы не можем разместить элементы user.

Каждый элемент определяется с помощью открывающего и закрывающего тегов, например, <user> и </user>, внутри которых помещается значение или содержимое элементов.
Элемент может иметь вложенные элементы и атрибуты. В данном случае каждый элемент user имеет два вложенных элемента company и age и атрибут name.

Атрибуты определяются в теле элемента и имеют следующую форму: название="значение". Например, <user name="Bill Gates">, в данном случае атрибут называется name и имеет значение Bill Gates

Внутри простых элементов помещается их значение. Например, <company>Google</company> - элемент company имеет значение Google.

Названия элементов являются регистрозависимыми, поэтому <company> и <COMPANY> будут представлять разные элементы.


## «Java программирование»
### 1. Исключения. Классы Exception и RunTimeException. Генерация и обработка исключений. Выражения try - catch - finally, try - with - resources, throws.
**Исключение** - это ошибка, возникающая в процессе выполнения программы. 

При возникновении исключения в блоке try управление переходит в блок catch, который может обработать данное исключение.

Обработка исключений в Java основана на использовании в программе следующих ключевых слов: 
* try – определяет блок кода, в котором может произойти исключение;
* catch – определяет блок кода, в котором происходит обработка исключения;
* finally – определяет блок кода, который является необязательным, но при его наличии выполняется в любом случае независимо от результатов выполнения блока try.

Эти ключевые слова используются для создания в программном коде специальных обрабатывающих конструкций: try{}catch{}, try{}catch{}finally{}, try{}finally{}. 

* throw – используется для возбуждения исключения;
* throws – используется в сигнатуре методов для предупреждения, о том что метод может выбросить исключение

**Обработка исключений.** 
Исключение в Java-программе может быть создано:
* автоматически из-за ошибки в коде программы, например, деление на нуль и выход за пределы массива;
* программно, используя ключевое слово throw.

Выражение catch имеет следующий синтаксис: 
catch (тип_исключения имя_переменной).
Блок catch обрабатывает только исключения указанного в инструкции типа_исключения. Исключения других типов блокм catch не обрабатываются и скорее всего программа прекратит работу. 
После завершения выполнения блока catch программа продолжает свою работу, выполняя все остальные инструкции после блока catch.

Конструкция try{…} catch {…} также может иметь блок finally {…}. Однако этот блок необязательный, и его можно при обработке исключений опускать. Блок finally выполняется в любом случае, возникло ли исключение в блоке try или нет

*Пример:*
> try{  				//защищенный блок кода
>     int[] numbers = new int[3];
>     numbers[4]=45;
>     System.out.println(numbers[4]);
> }
> catch(Exception ex){ 	//выполняется в случае исключения
>     ex.printStackTrace();
> }
> finally{  			//выполняется в любом случае (было исключение или нет)
>     System.out.println("Блок finally"); 
> }

**Обработка нескольких исключений.** 
В Java можно разграничить обработку исключений разных типов, включив дополнитель-ные блоки catch
*Пример:*
> int[] numbers = new int[3];
> try{
>     numbers[6]=45;
>     numbers[6]=Integer.parseInt("gfd");
> }
> catch(ArrayIndexOutOfBoundsException ex){
>     System.out.println("Выход за пределы массива");
> }
> catch(NumberFormatException ex){
>     System.out.println("Ошибка преобразования из строки в число");
> }

**Генерирование исключений.**
Инструкция для генерирования исключения имеет форму:
throw объект_исключения;
Здесь объект_исключения должен быть объектом класса, производного от класса Throwable .
С помощью оператора throw мы сами можем создать исключение и вызвать его в процессе выполнения. Например, в нашей программе происходит ввод числа, и мы хотим, чтобы, если число больше 30, то возникало исключение:
> try{
>   Scanner in = new Scanner(System.in);
>   int x = in.nextInt();
>   if(x>=30){
>     throw new Exception("Число х должно быть меньше 30");
>   }
> }
> catch(Exception ex){
>   System.out.println(ex.getMessage());
> }
> System.out.println("Программа завершена");

Конструкцию try-with-resources ввели в Java 7. Она дает возможность объявлять один или несколько ресурсов в блоке try, которые будут закрыты автоматически без использования finally блока.

Базовым классом для всех исключений является класс Throwable. От него уже наследуются два класса: Error и Exception. Все остальные классы являются производными от этих двух классов.
Собственно исключения наследуются от класса Exception. Среди этих исключений следует выделить класс RuntimeException. RuntimeException является базовым классом для так называемой группы непроверяемых исключений (unchecked exceptions) - компилятор не проверяет факт обработки таких исключений и их можно не указывать вместе с оператором throws в объявлении метода. Такие исключения являются следствием ошибок разработчика, например, неверное преобразование типов или выход за пределы массива.
Все остальные классы, образованные от класса Exception, называются проверяемыми исключениями (checked exceptions). Подобные исключения обрабатываются с помощью конструкции try..catch. 


### 2. ООП. Принципы проектирования классов.

**ООП.**
– Абстракция означает выделение главных, наиболее значимых характеристик предмета и наоборот – отбрасывание второстепенных, незначительных.
– Инкапсуляция – это механизм программирования, объединяющий вместе код и данные, которыми он манипулирует, исключая как вмешательство извне, так и неправильное использование данных.
– Наследование - механизм, который позволяет описать новый класс на основе существующего (родительского). При этом свойства и функциональность родительского класса заимствуются новым классом. Поля и методы, описанные в родительских классах, можно использовать в классах-потомках.
– Полиморфизм – это возможность работать с несколькими типами так, будто это один и тот же тип. При этом поведение объектов будет разным в зависимости от типа, к которому они принадлежат.


**Принципы проектирования классов.**
*1. Принцип единственной обязанности  (SRP – Single Responsibility Principle)*
Класс должен иметь единственную обязанность. При этом не должно возникать более одной причины для изменения класса.
*2. Принцип открытости-закрытости (OCP - Open-Closed Principle)*
Классы должны быть открыты для расширения, но закрыты для модификации. Суть этого принципа состоит в том, что система должна быть построена таким образом, что все ее последующие изменения должны быть реализованы с помощью добавления нового кода, а не изменения уже существующего.
*3. Принцип разделения интерфейса (ISP – Interface Segregation Principle)*
Вместо одного универсального интерфейса лучше использовать много специализированных.
*4. Принцип подстановки Барбары Лисков (LSP - Liskov Substitution Principle)*
Наследующий класс должен дополнять, а не замещать поведение базового класса. При этом замена в коде объектов класса-предка на объекты класса-потомка не приведёт к изменениям в работе программы.
*5. Принцип инверсии зависимостей (DIP – Dependency Inversion Principle)*
Зависимости внутри системы строятся на уровне абстракций. Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Абстракции не должны зависеть от деталей, а наоборот, детали должны зависеть от абстракций.
*6. Принцип повышения связности*
Связность (cohesion) — это мера  сфокусированности обязанностей класса.
Считается что класс обладает высокой степенью связности, если его обязанности тесно связаны между собой и он не выполняет огромных объемов разнородной работы.
*7. Принцип уменьшения связанности с другими классами*
Связанность (coupling) — это мера, определяющая, насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает.

### 3. Интерфейсы. Вложенные, локальные и анонимные классы. Примеры использования
Интерфейсы определяют некоторый функционал, не имеющий конкретной реализации, который затем реализуют классы, применяющие эти интерфейсы. И один класс может применить множество интерфейсов.
Чтобы определить интерфейс, используется ключевое слово interface. Например:
> interface Printable{
>     void print();
> }

Интерфейс может определять константы и методы, которые могут иметь, а могут и не иметь реализации. Методы без реализации похожи на абстрактные методы абстрактных классов. 
Чтобы класс применил интерфейс, надо использовать ключевое слово implements.
> class Book implements Printable{
>     String name;
>     String author;
>     Book(String name, String author){
>           
>         this.name = name;
>         this.author = author;
>     } 
>     public void print() {
>      
>         System.out.printf("%s (%s) \n", name, author);
>     }
> }
При этом надо учитывать, что если класс применяет интерфейс, то он должен реализовать все методы интерфейса. Если класс не реализует какие-то методы интерфейса, то такой класс должен быть определен как абстрактный, а его неабстрактные классы-наследники затем должны будут реализовать эти методы.

**Вложенные**
Как и классы, интерфейсы могут быть вложенными, то есть могут быть определены в классах или других интерфейсах. Например:
class Printer{
    interface Printable {
        void print();
    }
}
При применении такого интерфейса нам надо указывать его полное имя вместе с именем класса:
> public class Journal implements Printer.Printable {
>     String name;
>     Journal(String name){
>         this.name = name;
>     }
>     public void print() {
>         System.out.println(name);
>     }
> }

Использование интерфейса будет аналогично предыдущим случаям:
> Printer.Printable p =new Journal("Foreign Affairs");
> p.print();

Классы могут быть вложенными (nested), то есть могут быть определены внури других классов. Частным случаем вложенных классов являются внутренние классы (inner class).
Внутренний класс ведет себя как обычный класс за тем исключением, что его объекты могут быть созданы только внутри внешнего класса.
> public class Program{
>     public static void main(String[] args) {
>              
>         Person tom = new Person("Tom", "qwerty");
>         tom.displayPerson();
>         tom.account.displayAccount();
>     }
> }
> class Person{
>      
>     private String name;
>     Account account;
>  
>     Person(String name, String password){
>         this.name = name;
>         account = new Account(password);
>     }
>     public void displayPerson(){
>         System.out.printf("Person \t Name: %s \t Password: %s \n", name, account.password);
>     }
>  
>     public class Account{
>         private String password;
>          
>         Account(String pass){
>             this.password = pass;
>         }
>         void displayAccount(){
>             System.out.printf("Account Login: %s \t Password: %s \n", Person.this.name, password);
>         }
>     }
> }

Внутренний класс имеет доступ ко всем полям внешнего класса, в том числе закрытым с помощью модификатора private. Аналогично внешний класс имеет доступ ко всем членам внутреннего класса, в том числе к полям и методам с модификатором private.
Ссылку на объект внешнего класса из внутреннего класса можно получить с помощью выражения Внешний_класс.this, например, Person.this.
Объекты внутренних классов могут быть созданы только в том классе, в котором внутренние классы опеределены. В других внешних классах объекты внутреннего класса создать нельзя.
Еще одной особенностью внутренних классов является то, что их можно объявить внутри любого контекста, в том числе внутри метода и даже в цикле.
**Анонимный** класс не имеет имени. Анонимный класс является подклассом существующего класса (в примере Base) или реализации интерфейса.
Поскольку анонимный класс не имеет имени, он не может иметь явный конструктор. Также к анонимному классу невозможно обратиться извне объявляющего его выражения, за исключением неявного обращения посредством объектной ссылки на суперкласс или интерфейс. Анонимные классы никогда не могут быть статическими, либо абстрактными, и всегда являются конечными классами. Кроме того, каждое объявление анонимного класса уникально. Например, в следующем фрагменте кода объявляются два различных анонимных класса:
> Base bref1 = new Base() {
>     void method1() {}
> };
> 
> Base bref2 = new Base() {
>     void method1() {}
> };

### 4. Характеристика языка Java. Область применения. Среда выполнения

### 5. Обобщенное программирования. Шаблоны. Описание типов с шаблонами. Описание методов с шаблонами. Формальные параметры типа.

**Обобщенное программирование (generic programming)** – описание данных и алгоритмов в программе, которое можно применить к различным типам данных, не меняя при этом само это описание.
Для такого описания используются специальные синтаксические конструкции, называемые шаблонами (дженериками). Шаблон (generic) – описание класса, метода или атрибута, в которых тип данных указыва-ется в виде параметра. 
Одно из назначений – более сильная проверка типов во время компиляции и устранение необходимости явного приведения.

**Обобщенный тип (generic type)** – это описание класса с использованием формальных параметров типа.

Синтаксис описания шаблонного типа:
class Gen < T > {…},  // тип T указывается в угловых скобках; Gen-обобщенный класс
где T – формальный параметр типа, это имя – заполнитель, подлежащий замене фактическим типом, передаваемым конструктору Gen(T оbj) при создании объекта. Внутри класса Gen имя Т применяется всякий раз, когда возникает необходимость в использовании параметра типа.

Формальных параметров может быть несколько – KeyValue <KEY,value>.
Параметризованный тип (parameterized type) – реализация обобщенного типа с использованием конкретного типа данных в качестве аргумента.

Обобщённое программирование (англ. generic programming) — парадигма программирования, заключающаяся в таком описании данных и алгоритмов, которое можно применять к различным типам данных, не меняя само это описание.
Обобщения или generics (обобщенные типы и методы) позволяют нам уйти от жесткого определения используемых типов. Рассмотрим проблему, в которой они нам могут понадобиться.
Допустим, мы определяем класс для представления банковского счета. К примеру, он мог бы выглядеть следующим образом:
class Account{
     
    private int id;
    private int sum;
     
    Account(int id, int sum){
        this.id = id;
        this.sum = sum;
    }
     
    public int getId() { return id; }
    public int getSum() { return sum; }
    public void setSum(int sum) { this.sum = sum; }
}
Класс Account имеет два поля: id - уникальный идентификатор счета и sum - сумма на счете. В данном случае идентификатор задан как целочисленное значение, например, 1, 2, 3, 4 и так далее. Однако также нередко для идентификатора используются и строковые значения. И на момент написания класса мы можем точно не знать, что лучше выбрать для хранения идентификатора - строки или числа. Либо, возможно, этот класс будет использоваться другими разработчиками, которые могут иметь свое мнение по данной проблеме. 
Писать для каждого отдельного типа свою версию класса Account тоже не является хорошим решением, так как в этом случае мы вынуждены повторяться.
Эти проблемы были призваны устранить обобщения или generics. Поэтому определим класс Account как обобщенный:
class Account<T>{
     
    private T id;
    private int sum;
     
    Account(T id, int sum){
        this.id = id;
        this.sum = sum;
    }
     
    public T getId() { return id; }
    public int getSum() { return sum; }
    public void setSum(int sum) { this.sum = sum; }
}
С помощью буквы T в определении класса class Account<T> мы указываем, что данный тип T будет использоваться этим классом. Параметр T в угловых скобках называется универсальным параметром, так как вместо него можно подставить любой тип. При этом пока мы не знаем, какой именно это будет тип: String, int или какой-то другой. Причем буква T выбрана условно, это может и любая другая буква или набор символов.
После объявления класса мы можем применить универсальный параметр T: так далее в классе объявляется переменная этого типа, которой затем присваивается значение в конструкторе.
Кроме обобщенных типов можно также создавать обобщенные методы, которые точно также будут использовать универсальные параметры.
Особенностью обобщенного метода является использование универсального параметра в объявлении метода после всех модификаторов и перед типом возвращаемого значения.
public <T> void print(T[] items)
Затем внутри метода все значения типа T будут представлять данный универсальный параметр.
При вызове подобного метода перед его именем в угловых скобках указывается, какой тип будет передаваться на место универсального параметра:
printer.<String>print(people);
printer.<Integer>print(numbers);


### 6. Коллекции. Сортировка элементов коллекции. Интерфейс Comparator.
Коллекции — это наборы однородных элементов. Интерфейсы и классы коллекций располагаются в пакете java.util. Инструменты для работы с такими структурами в Java содержатся в Java Collections Framework. Фреймворк состоит 
1)	из интерфейсов, их реализаций, обычно включая сортировку, поиск, добавление, удаление, преобразования  и  классов для работы с элементами коллециии.
2)	и классов, реализующих разные типы коллекций: 
* Set — это неупорядоченное множество уникальных элементов.
* List — упорядоченный список, в котором у каждого элемента есть индекс. Дубликаты значений допускаются.
* Queue — очередь. В таком списке элементы можно добавлять только в хвост, а удалять — только из начала. Так реализуется концепция FIFO (first in, first out) — «первым пришёл — первым ушёл».
* Deque может выступать и как очередь, и как стек. Это значит, что элементы можно добавлять как в её начало, так и в конец. То же относится к удалению.
* Map состоит из пар «ключ-значение». Ключи уникальны, а значения могут повторяться. Порядок элементов не гарантирован. Map позволяет искать объекты (значения) по ключу.

Реализаций классов и интерфейсов очень много. Рассмотрим наиболее часто используемые.
1. Класс ArrayList – используется наиболее часто. Строится на базе обычного массива. Если при создании не указать размерность, то под значения выделяется 10 ячеек. При попытке добавить элемент, для которого места уже нет, массив автоматически расширяется — программисту об этом специально заботиться не нужно. Список проиндексирован. При включении нового элемента в его середину все элементы с большим индексом сдвигаются вправо.
2. Класс LinkedList реализует одновременно List и Deque. Это список, в котором у каждого элемента есть ссылка на предыдущий и следующий элементы. Благодаря этому добавление и удаление элементов выполняется быстро — времязатраты не зависят от размера списка, так как элементы при этих операциях не сдвигаются: просто перестраиваются ссылки.
3. Класс ArrayDeque — это реализация двунаправленной очереди в виде массива с переменным числом элементов. Новые значения можно добавлять в начало или конец списка, и удалять оттуда же. Причём эти операции выполняются быстрее, чем при использовании LinkedList.
4. Класс HashSet использует для хранения данных в хеш-таблице. Это значит, что при манипуляциях с элементами используется хеш-функция — hashCode() в Java. Добавление, поиск и удаление элементов при такой организации происходит за постоянное время, независимо от числа элементов в коллекции.

**Сортировка коллекций**
В java есть утилитный метод, который позволяет отсортировать в порядке возрастания любой ArrayList или LinkedList: java.util.Collections.sort(List list).

**Интерфейс Comparator**
Интерфейс Collection является базовым для всех коллекций, определяя основной функционал:
```
public interface Collection<E> extends Iterable<E>{
 
    // определения методов
}
```
Интерфейс Collection является обобщенным и расширяет интерфейс Iterable, поэтому все объекты коллекций можно перебирать в цикле по типу for-each.
Для того, чтобы объекты класса можно было сравнить и сортировать, они должны применять интерфейс Comparable<E>.
Интерфейс Comparable содержит один единственный метод int compareTo(E item), который сравнивает текущий объект с объектом, переданным в качестве параметра. Если этот метод возвращает отрицательное число, то текущий объект будет располагаться перед тем, который передается через параметр. Если метод вернет положительное число, то, наоборот, после второго объекта. Если метод возвратит ноль, значит, оба объекта равны.
Однако перед нами может возникнуть проблема, что если разработчик не реализовал в своем классе, который мы хотим использовать, интерфейс Comparable, либо реализовал, но нас не устраивает его функциональность, и мы хотим ее переопределить? На этот случай есть еще более гибкий способ, предполагающий применение интерфейса Comparator<E>.
Интерфейс Comparator содержит ряд методов, ключевым из которых является метод compare():
```
public interface Comparator<E> {
 
    int compare(T a, T b);
    // остальные методы
}
```
Метод compare также возвращает числовое значение - если оно отрицательное, то объект a предшествует объекту b, иначе - наоборот. А если метод возвращает ноль, то объекты равны. Для применения интерфейса нам вначале надо создать класс компаратора, который реализует этот интерфейс:
```
class PersonComparator implements Comparator<Person>{
 
    public int compare(Person a, Person b){
     
        return a.getName().compareTo(b.getName());
    }
} 
```


### 8. ORM (Object-Relational Mapping), Java Persistence API.

**ORM** (Object-Relational Mapping, рус. объектно-реляционное отображение, или преобразование) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных»

Необходимо обеспечить работу с данными в терминах классов, а не таблиц данных, и, напротив, преобразовать термины и данные классов в данные, пригодные для хранения в СУБД.  В общем, необходимо избавиться от необходимости писать SQL-код для взаимодействия в СУБД.

Тут описаны достоинства и недостатки ORM
https://ru.bmstu.wiki/ORM_(Object-Relational_Mapping)

**Java Persistence API (JPA)** — спецификация API Java EE, предоставляет возможность сохранять в удобном виде Java-объекты в базе данных.
**JPA (Java Persistence API)** это спецификация Java EE и Java SE, описывающая систему управления сохранением java объектов в таблицы реляционных баз данных в удобном виде. Сама Java не содержит реализации JPA, однако есть существует много реализаций данной спецификации от разных компаний.
JPA реализует концепцию ORM.


## КИС
### 1. Особенности проектирования КИС в среде RadixWare 
В презентации 1


### 2. Этапы процесса разработки ИС 
Стадия 1. Формирование требований к ИС
На начальной стадии проектирования выделяют следующие этапы работ:
– обследование объекта и обоснование необходимости создания ИС;
– формирование требований пользователей к ИС;
– оформление отчета о выполненной работе и тактико-технического задания на разработку.
Стадия 2. Разработка концепции ИС.
– изучение объекта автоматизации;
– проведение необходимых научно-исследовательских работ;
– разработка вариантов концепции ИС, удовлетворяющих требованиям пользователей;
– оформление отчета и утверждение концепции.
Стадия 3. Техническое задание.
– разработка и утверждение технического задания на создание ИС.
– Стадия 4. Эскизный проект.
– разработка предварительных проектных решений по системе и ее частям;
– разработка эскизной документации на ИС и ее части.
Стадия 5. Технический проект.
– разработка проектных решений по системе и ее частям;
– разработка документации на ИС и ее части;
– разработка и оформление документации на поставку комплектующих изделий;
– разработка заданий на проектирование в смежных частях проекта.
Стадия 6. Рабочая документация.
– разработка рабочей документации на ИС и ее части;
– разработка и адаптация программ.
Стадия 7. Ввод в действие.
– Тестирование и Обучение персонала
Стадия 8. Сопровождение ИС.
– выполнение работ в соответствии с гарантийными обязательствами;
– послегарантийное обслуживание.

В презентации 2

### 3. Модель КИС в среде RadixWare
НЕТ ОТВЕТА

### 4. Язык UML. Виды и назначение диаграмм UML
UML – унифицированный язык моделирования (Unified Modeling Language) – это система обозначений, которую можно применять для объектно-ориентированного анализа и проектирования. Его можно использовать для визуализации, спецификации, конструирования и документирования программных систем.
Словарь UML включает три вида строительных блоков:
* Диаграммы.
* Сущности.
* Связи.

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

Диаграммы:
– Диаграммы вариантов использования являются описаниями типичных взаимодействий между пользователями системы и самой системой. Они отображают внешний интерфейс системы и указывают форму того, что система должна сделать (именно что, а не как). Основная задача — представлять собой единое средство, дающее возможность заказчику, конечному пользователю и разработчику совместно обсуждать функциональность и поведение системы.
– Диаграмма классов (Class diagram) — статическая структурная диаграмма, описывающая структуру системы, демонстрирующая классы системы, их атрибуты, методы и зависимости между классами.
– Диаграмма объектов (Object diagram) — демонстрирует полный или частичный снимок моделируемой системы в заданный момент времени. На диаграмме объектов отображаются экземпляры классов (объекты) системы с указанием текущих значений их атрибутов и связей между объектами.
- Диаграмма компонентов (Component diagram) — статическая структурная диаграмма, показывает разбиение программной системы на структурные компоненты и связи (зависимости) между компонентами. В качестве физических компонентов могут выступать файлы, библиотеки, модули, исполняемые файлы, пакеты и т. п.
И другие.

### 5. Классификация компонентов КИС по функциональному назначению программного обеспечения.

Корпоративные информационные системы можно также разделить на два класса: финансово-управленческие и производственные.
– Финансово-управленческие системы включают подкласс малых интегрированных систем. Такие системы предназначены для ведения учета по одному или нескольким направлениям (бухгалтерия, сбыт, склад, кадры и т.д.)- Системами этой группы может воспользоваться практически любое предприятие. Системы этого класса обычно универсальны, цикл их внедрения невелик, иногда
можно воспользоваться «коробочным» вариантом, купив программу и самостоятельно установив ее на ПК.
– Производственные системы (также называемые системами производственного управления) включают подклассы средних и крупных интегрированных систем. Они предназначены в первую очередь для управления и планирования производственного процесса. Учетные функции, хотя и глубоко проработаны, играют вспомогательную роль, и порой невозможно выделить модуль бухгалтерского учета, так как информация в бухгалтерию поступает автоматически из других модулей.


## Проектирование, разработка и администрирование баз данных ORACLE
### 1. Транзакции, ACID, проблемы изоляции параллельных транзакций.


### 2. Уровни изоляции транзакций.
В идеале транзакции разных пользователей должны выполняться так, чтобы создавалась иллюзия, что пользователь текущей транзакции — единственный. Однако в реальности, по соображениям производительности и для выполнения некоторых специальных задач, СУБД предоставляют различные уровни изоляции транзакций.
Уровни описаны в порядке увеличения изолированности транзакций и, соответственно, надёжности работы с данными.
    0 — Чтение незафиксированных данных (Read Uncommitted) — чтение незафиксированных изменений как своей транзакции, так и параллельных транзакций. Нет гарантии, что данные, изменённые другими транзакциями, не будут в любой момент изменены в результате их отката, поэтому такое чтение является потенциальным источником ошибок. Невозможны потерянные изменения (lost changes), возможны грязное чтение (dirty read), неповторяемое чтение и фантомы.
    1 — Чтение зафиксированных данных (Read Committed) — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций. Потерянные изменения и грязное чтение не допускается, возможны неповторяемое чтение и фантомы.
    2 — Повторяемое чтение (Repeatable Read, Snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы.
    3 — Сериализуемый (Serializable) — сериализуемые транзакции. Результат параллельного выполнения сериализуемой транзакции с другими транзакциями должен быть логически эквивалентен результату их какого-либо последовательного выполнения. Проблемы синхронизации не возникают.
Чем выше уровень изоляции, тем больше требуется ресурсов, чтобы его обеспечить. Соответственно, повышение изолированности может приводить к снижению скорости выполнения параллельных транзакций, что является «платой» за повышение надёжности.
В СУБД уровень изоляции транзакций можно выбрать как для всех транзакций сразу, так и для одной конкретной транзакции. По умолчанию в большинстве баз данных используется уровень 1 (Read Committed). Уровень 0 используется в основном для отслеживания изменений длительных транзакций или для чтения редко изменяемых данных. Уровни 2 и 3 используются при повышенных требованиях к изолированности транзакций. 


### 3. Data Definition Language (DDL), Data Manipulation Language (DML), CRUD(SQL).
**Data Definition Language (DDL)** (язык описания данных) — это семейство компьютерных языков, используемых в компьютерных программах для описания структуры баз данных.
На текущий момент наиболее популярным языком DDL является SQL, используемый для получения и манипулирования данными в РСУБД, и сочетающий в себе элементы DDL, DML и DCL.
Функции языков DDL определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL это глаголы — «create» («создать»), «alter» («изменить»), «drop» («удалить»). Эти запросы или команды часто смешиваются с другими командами SQL, в связи с чем DDL не является отдельным компьютерным языком.
Запрос «create» используется для создания базы данных, таблицы, индекса, представления или хранимой процедуры. Запрос «alter» используется для изменения существующего объекта базы данных (таблицы, индекса, представления или хранимой процедуры) или самой базы данных. Запрос «drop» используется для удаления существующего объекта базы данных (таблицы, индекса, представления или хранимой процедуры) или самой базы данных. И наконец, в DDL существуют понятия первичного и внешнего ключа, которые осуществляют соблюдение целостности данных. Команды "первичный ключ" primary key, "внешний ключ" foreign key включаются в запросы «create table", «alter table».
В эту группу входят следующие операторы:
- CREATE – используется для создания объектов базы данных;
- ALTER – используется для изменения объектов базы данных;
- DROP – используется для удаления объектов базы данных.

**Data Manipulation Language (DML)** (язык управления (манипулирования) данными) — это семейство компьютерных языков, используемых в компьютерных программах или пользователями баз данных для получения, вставки, удаления или изменения данных в базах данных.
На текущий момент наиболее популярным языком DML является SQL, используемый для получения и манипулирования данными в РСУБД. Другие формы DML использованы в IMS/DL1, базах данных CODASYL (таких как IDMS), и других.
Языки DML изначально использовались только компьютерными программами, но с появлением SQL стали также использоваться и людьми.
Функции языков DML определяются первым словом в предложении (часто называемом запросом), которое почти всегда является глаголом. В случае с SQL эти глаголы — «select» («выбрать»), «insert» («вставить»), «update» («обновить»), и «delete» («удалить»). Это превращает природу языка в ряд обязательных утверждений (команд) к базе данных.
Языки DML могут существенно различаться у различных производителей СУБД. Существует стандарт SQL, установленный ANSI, но производители СУБД часто предлагают свои собственные «расширения» языка.
В эту группу входят самые распространённые операторы языка SQL:
- SELECT – осуществляет выборку данных;
- INSERT – добавляет новые данные;
- UPDATE – изменяет существующие данные;
- DELETE – удаляет данные.
**CRUD** — акроним, обозначающий четыре базовые функции, используемые при работе с базами данных: создание (англ. create), чтение (read), модификация (update), удаление (delete). Введён Джеймсом Мартином (англ. James Martin) в 1983 году как стандартная классификация функций по манипуляции данными.
В SQL этим функциям, операциям соответствуют операторы Insert (создание записей), Select (чтение записей), Update (редактирование записей), Delete (удаление записей). В некоторых CASE-средствах использовались специализированные CRUD-матрицы или CRUD-диаграммы, в которых для каждой сущности указывалось, какие базовые функции с этой сущностью выполняет тот или иной процесс или та или иная роль. В системах, реализующих доступ к базе данных через API в стиле REST, эти функции реализуются зачастую (но не обязательно) через HTTP-методы PUT, GET, PATCH и DELETE соответственно.
Хотя традиционно оперирование в стиле CRUD применяется к базам данных, такой подход может быть распространён на любые хранимые вычислительные сущности (файлы, структуры в памяти, объекты). Шаблон проектирования ActiveRecord обеспечивает соответствие функций CRUD объектно-ориентированному подходу, и широко используется в различных фреймворках для доступа к базам данных из объектно-ориентированных языков программирования.
CRUD постоянно используется для всего, что связано с базами данных и проектированием баз данных. Разработчики программного обеспечения ничего не могут сделать без операций CRUD. С другой стороны, CRUD не менее важен для конечных пользователей. Большинство приложений, которые мы используем, позволяют нам добавлять или создавать новые записи, искать существующие, вносить в них изменения или удалять их.


### 4. Архитектурные решения, используемые при реализации многопользовательских СУБД
- Централизованная архитектура
- Технология с сетью и файловым сервером (архитектура "файл-сервер")
- Технология "клиент – сервер"
- Трехзвенная (многозвенная) архитектура "клиент – сервер".
https://intuit.ru/studies/courses/508/364/lecture/8643?page=1

### 5. Типы соединений в sql запросах (union, join)

