Главная страница
Навигация по странице:

  • Задание №2.

  • Задание №4.

  • Лабораторные работы №10 «Инспекция программного кода на предмет соответствия стандартам кодирования» Цель

  • Задание №1 Выполнить анализ программного кода для разрабатываемого ПО и модульных тестов с целью плохо организованного кода. Задание №2

  • Задание №3 Выполнить описание произведенных операций рефакторинга (было-стало-шаблон рефакторинга). Задание №4

  • Задание №5 Сделать выводы по результатам выполнения работ. Класс Main Было

  • Список литературы

  • Задания. Методические рекомендации по выполнению практических


    Скачать 2.15 Mb.
    НазваниеМетодические рекомендации по выполнению практических
    Дата23.08.2022
    Размер2.15 Mb.
    Формат файлаpdf
    Имя файлаЗадания.pdf
    ТипПрактическая работа
    #651734
    страница8 из 8
    1   2   3   4   5   6   7   8
    Задание №1. Провести сравнение понятий «качество» государственным и международным стандартами. Выписать документы, в которых даны данные определения.
    Задание №2. Опишите методы получения информации о ПС по ГОСТу. Для каждого метода выделите источник информации.
    Задание №3. Выберите стандарты для оценки качества ПС. Перечислите критерии надежности ПС по ГОСТу.
    Задание №4. Методика оценки качественных показателей ПП основана на составлении метрики ПП. В лабораторной работе необходимо выполнить следующее:
    1. Выбрать показатели качества (не менее 5) и сформулировать их сущность. Каждый показатель должен быть существенным, т. е. должны быть ясны потенциальные выгоды его использования. Показатели представить в виде таблицы (таблица 1).
    Показатели качества
    Сущность показателя
    Экспертная оценка (вес) wi
    Оценка, установленная экспериментом ri
    2. Установить веса показателей wi (?wi =1).
    3. Для каждого показателя установить конкретную численную оценку ri от 0 до 1, исходя из следующего:
    § 0 – свойство в ПП присутствует, но качество его неприемлемо;
    § 0.5 — 1 – свойство в ПП присутствует и обладает приемлемым качеством;
    § 1 – свойство в ПП присутствует и обладает очень высоким качеством.
    § Возможно, присвоение промежуточных значений в соответствии с мнением оценивающего лица относительно полезности того или иного свойства ПП.
    Результатом выполнения данной работы является отчет

    Лабораторные работы №10 «Инспекция программного кода на предмет соответствия
    стандартам кодирования»
    Цель: научиться выполнять реорганизацию программного кода на основании шаблонов рефакторинга.
    Задание №1
    Выполнить анализ программного кода для разрабатываемого ПО и модульных тестов с целью плохо организованного кода.
    Задание №2
    Используя шаблоны рефакторинга, выполнить реорганизацию программного кода разрабатываемого ПО.
    Задание №3
    Выполнить описание произведенных операций рефакторинга (было-стало-шаблон рефакторинга).
    Задание №4
    В случае необходимости скорректировать проектную документацию.
    Задание №5
    Сделать выводы по результатам выполнения работ.
    Класс Main
    Было:
    пакетная игра; импорт игры. Персонажи. *; импорт игры. Персонажи. Персонажи; импорт игры. Энергетика. Энергетика; импорт игры. Энергетика. Освещение; импорт игры. Уровни. Блок; импорт игры. Уровни. Уровень; импортировать game.Levels.Level_data; импорт игры. Weapon.Bullet; импорт игры. Оружие. Оружие; import javafx.animation.AnimationTimer; импорт javafx.application.Application; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.scene.input.KeyCode; import javafx.scene.layout.Pane; import javafx.stage.Stage; import java.io.DataInputStream; import java.io.FileInputStream; импорт java.io.IOException; import java.util.ArrayList; import java.util.HashMap; публичный класс Main расширяет приложение { public static ArrayList blocks = new ArrayList <> (); public static ArrayList bullets = new ArrayList <> (); public static ArrayList врагаBullets = новый ArrayList <> (); public static ArrayList враги = новый ArrayList <> (); static HashMap keys = new HashMap <> (); публичная статическая сцена этапа; публичная статическая сцена; public static Pane gameRoot = new Pane (); public static Pane appRoot = new Pane (); публичное статическое меню; публичный статический Персонаж букера; публичная статическая HUD HUD; статическое оружие общего назначения; публичная статика елизавета елизавета; статический VendingMachine vendingMachine; статическое учебное пособие;
    частные статические CutScenes cutScene; публичная статика Энергетика энергетика; публичная статическая молния молнии; public static int levelNumber; уровень статического уровня; public static AnimationTimer timer = new AnimationTimer () {
    @Override public void handle (давно) {
    Обновить();
    }
    }; приватное статическое void update () { для (EnemyBase враг: враги) { enemy.update (); if (врага.getDelete ()) { enemies.remove (враг); перемена;
    }
    }
    Bullet.update ();
    Controller.update (); booker.update (); if (! energetic.getName (). equals ("")) energetic.update (); if (levelNumber> 0) elizabeth.update (); если (молния! = ноль) { lightning.update (); if (lightning.getDelete ()) молния = ноль;
    } menu.update (); hud.update (); weapon.update (); if (booker.getTranslateX ()> Level_data.BLOCK_SIZE * 295) cutScene = новые CutScenes (levelNumber);
    }
    @Override public void start (Stage primaryStage) выдает исключение { stage = primaryStage; сцена = новая сцена (appRoot, 1280, 720);
    . AppRoot.getChildren () добавить (gameRoot); уровень = новый уровень (); try (DataInputStream dataInputStream = new DataInputStream (новый FileInputStream ("C:
    /DeadShock/saves/data.dat"))) { levelNumber = dataInputStream.readInt (); level.createLevels (levelNumber); level.changeImageView (levelNumber); vendingMachine = new VendingMachine (); букер = новый персонаж (); booker.setMoney (dataInputStream.readInt ()); booker.setSalt (dataInputStream.readByte ()); booker.setCountLives (2); оружие = новое оружие (); weapon.setWeaponClip (dataInputStream.readInt ()); weapon.setBullets (dataInputStream.readInt ()); hud = новый HUD ();

    Елизавета = новая Елизавета (); энергичный = новый Энергетический ();
    } catch (IOException e) { levelNumber = 0; level.createLevels (levelNumber); vendingMachine = new VendingMachine (); букер = новый персонаж (); оружие = новое оружие (); hud = новый HUD (); энергичный = новый Энергетический (); tutorial = new Tutorial (levelNumber);
    } switch (levelNumber) { случай 0: враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 117, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 127, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 148, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 161, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 171, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 185, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 204, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 215, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 228, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 233, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 243, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 252, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 262, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 277, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 280, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 286, 200)); перемена;
    Дело 1: враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 57, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 67, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 74, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 87, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 104, 150)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 117, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 133, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 156, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 177, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 193, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 201, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 216, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 224, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 246, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 260, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 277, 100));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 34,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 36,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 60,
    Level_data.BLOCK_SIZE * 9));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 61,
    Level_data.BLOCK_SIZE * 9));

    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 106,
    Level_data.BLOCK_SIZE * 7));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 107,
    Level_data.BLOCK_SIZE * 7));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 168,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 170,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 196,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 197,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 232,
    Level_data.BLOCK_SIZE * 8));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 233,
    Level_data.BLOCK_SIZE * 8)); перемена;
    } меню = новое меню (); appRoot.getChildren () добавить (menu.menuBox). booker.translateXProperty (). addListener (((наблюдаемый, oldValue, newValue) -> { int offset = newValue.intValue (); if (offset> 600 && offset } если (смещение <= 100) level.getBackground () setLayoutX (0).
    })); vendingMachine.createButtons (); stage.getIcons (). add (новое изображение ("файл: / C: /DeadShock/images/icon.jpg")); stage.setTitle ( "DeadShock"); stage.setResizable (ложь); stage.setWidth (scene.getWidth ()); stage.setHeight (scene.getHeight ()); stage.setScene (сцены); stage.show (); timer.start ();
    } public static void main (String [] args) { запуск (арг);
    }
    }
    Стало:
    пакетная игра; импорт игры. Персонажи. *; импорт игры. Персонажи. Персонажи; импорт игры. Энергетика. Энергетика; импорт игры. Энергетика. Освещение; импорт игры. Уровни. Блок; импорт игры. Уровни. Уровень; импортировать game.Levels.Level_data; импорт игры. Weapon.Bullet; импорт игры. Оружие. Оружие; import javafx.animation.AnimationTimer; импорт javafx.application.Application; import javafx.scene.Scene;
    import javafx.scene.image.Image; import javafx.scene.input.KeyCode; import javafx.scene.layout.Pane; import javafx.stage.Stage; import java.io.DataInputStream; import java.io.FileInputStream; импорт java.io.IOException; import java.util.ArrayList; import java.util.HashMap; публичный класс Main расширяет приложение { public static ArrayList blocks = new ArrayList <> (); public static ArrayList bullets = new ArrayList <> (); public static ArrayList врагаBullets = новый ArrayList <> (); public static ArrayList враги = новый ArrayList <> (); static HashMap keys = new HashMap <> (); публичная статическая сцена этапа; публичная статическая сцена; public static Pane gameRoot = new Pane (); public static Pane appRoot = new Pane (); публичное статическое меню; публичный статический Персонаж букера; публичная статическая HUD HUD; статическое оружие общего назначения; публичная статика елизавета елизавета; статический VendingMachine vendingMachine; статическое учебное пособие; частные статические CutScenes cutScene; публичная статика Энергетика энергетика; публичная статическая молния молнии; public static int levelNumber; уровень статического уровня; public static AnimationTimer timer = new AnimationTimer () {
    @Override public void handle (давно) {
    Обновить();
    }
    }; private void initContent () {
    . AppRoot.getChildren () добавить (gameRoot); уровень = новый уровень (); try (DataInputStream dataInputStream = new DataInputStream (новый FileInputStream ("C:
    /DeadShock/saves/data.dat"))) { levelNumber = dataInputStream.readInt (); level.createLevels (levelNumber); level.changeImageView (levelNumber); vendingMachine = new VendingMachine (); букер = новый персонаж (); booker.setMoney (dataInputStream.readInt ()); booker.setSalt (dataInputStream.readByte ()); booker.setCountLives (2); оружие = новое оружие (); weapon.setWeaponClip (dataInputStream.readInt ()); weapon.setBullets (dataInputStream.readInt ()); hud = новый HUD ();
    Елизавета = новая Елизавета (); энергичный = новый Энергетический ();
    } catch (IOException e) {
    levelNumber = 0; level.createLevels (levelNumber); vendingMachine = new VendingMachine (); букер = новый персонаж (); оружие = новое оружие (); hud = новый HUD (); энергичный = новый Энергетический (); tutorial = new Tutorial (levelNumber);
    } createEnemies (); меню = новое меню (); appRoot.getChildren () добавить (menu.menuBox). booker.translateXProperty (). addListener (((наблюдаемый, oldValue, newValue) -> { int offset = newValue.intValue (); if (offset> 600 && offset } если (смещение <= 100) level.getBackground () setLayoutX (0).
    })); vendingMachine.createButtons ();
    } public static void createEnemies () { switch (levelNumber) { случай 0: враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 117, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 127, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 148, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 161, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 171, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 185, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 204, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 215, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 228, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 233, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 243, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 252, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 262, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 277, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 280, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 286, 200)); перемена;
    Дело 1: враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 57, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 67, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 74, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 87, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 104, 150)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 117, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 133, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 156, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 177, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 193, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 201, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 216, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 224, 200));
    враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 246, 200)); враги.адд (новый EnemyRedEye (Level_data.BLOCK_SIZE * 260, 200)); враги.адд (новый EnemyComstock (Level_data.BLOCK_SIZE * 277, 100));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 34,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 36,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 60,
    Level_data.BLOCK_SIZE * 9));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 61,
    Level_data.BLOCK_SIZE * 9));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 106,
    Level_data.BLOCK_SIZE * 7));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 107,
    Level_data.BLOCK_SIZE * 7));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 168,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 170,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 196,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 197,
    Level_data.BLOCK_SIZE * 13));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 232,
    Level_data.BLOCK_SIZE * 8));
    Level_data.enemyBlocks.add (новый блок («невидимый», Level_data.BLOCK_SIZE * 233,
    Level_data.BLOCK_SIZE * 8)); перемена;
    }
    } приватное статическое void update () { для (EnemyBase враг: враги) { enemy.update ();
    If (enemy.GetDelete()) { enemies.remove(enemy); break;
    }
    }
    Bullet.update();
    Controller.update(); booker.update();
    If (!energetic.GetName().Equals("")) energetic.update(); if (levelNumber > 0) elizabeth.update(); if (lightning != null) { lightning.update();
    If (lightning.GetDelete()) lightning = null;
    } menu.update(); hud.update(); weapon.update(); if (booker.getTranslateX() > Level_data.BLOCK_SIZE * 295) cutScene = new CutScenes(levelNumber);
    }

    @Override
    public void start(Stage primaryStage) throws Exception { stage = primaryStage; scene = new Scene(appRoot, 1280, 720); initContent(); stage.getIcons().add(new Image("file:/C:/DeadShock/images/icon.jpg")); stage.setTitle("DeadShock"); stage.setResizable(false); stage.setWidth(scene.getWidth()); stage.setHeight(scene.getHeight()); stage.setScene(scene); stage.show(); timer.start();
    } public static void main(String[] args) { launch(args);
    }
    }
    Шаблон рефакторинга: Выделение метода(Extract Method)

    Список литературы
    Электронные издания (электронные ресурсы)
    1. Гниденко, И. Г. Технология разработки программного обеспечения : учеб. пособие для
    СПО / И. Г. Гниденко, Ф. Ф. Павлов, Д. Ю. Федоров. — Москва : Издательство Юрайт,
    2019. — 235 с. Текст : электронный // ЭБС Юрайт [сайт]. — Режим доступа:
    https://biblio- online.ru/bcode/438444 2. Разработка, внедрение и адаптация программного обеспечения отраслевой направленности [Электронный ресурс]: учеб. пособие / Г.Н. Федорова. — М. :КУРС :
    ИНФРА-М, 2019. — 336 с. (Среднее Профессиональное Образование). - Режим доступа:
    http://znanium.com/catalog/product/989682 3. Программное обеспечение компьютерных сетей и web-серверов [Электронный ресурс]: учеб. пособие / Г.А. Лисьев, П.Ю. Романов, Ю.И. Аскерко. — М. : ИНФРА-М, 2019. —
    145 с. - Режим доступа:
    http://znanium.com/catalog/product/988332 4. Гагарина, Л. Г. Разработка и эксплуатация автоматизированных информационных систем [Электронный ресурс]: учеб. пособие / Л.Г. Гагарина. — М. : ФОРУМ : ИНФРА-
    М, 2019. — 384 с.- Режим доступа:
    http://znanium.com/catalog/product/1003025
    (ЭБСZnanium)
    5. Технология разработки программного обеспечения [Электронный ресурс]: учеб. пособие / Л.Г. Гагарина, Е.В. Кокорева, Б.Д. Сидорова-Виснадул ; под ред. Л.Г.
    Гагариной. — М. : ИД «ФОРУМ» : ИНФРА-М, 2019. — 400 с. - Режим доступа:
    http://znanium.com/catalog/product/1011120
    (ЭБСZnanium)
    6. Программное обеспечение компьютерных сетей [Электронный ресурс]: учеб. пособие /
    О.В. Исаченко. — М. : ИНФРА-М, 2019. — 117 с. — (Среднее профессиональное образование). - Режим доступа:
    http://znanium.com/catalog/product/989894
    (ЭБСZnanium)
    7. Плохотников, К.Э. Метод и искусство математического моделирования : курс лекций /
    К.Э. Плохотников. — 2-е изд., стер. — Москва : ФЛИНТА, 2017. — 519 с. - Текст : электронный. - Режим доступа:
    https://new.znanium.com/catalog/product/1034329 8. Математическое моделирование технических систем [Электронный ресурс]: учебник /
    В.П. Тарасик. — Минск : Новое знание ; М. : ИНФРА-М, 2019. — 592 с. - Режим доступа:
    http://znanium.com/catalog/product/1019246
    Методические издания
    1. Игнатенко, Е.С.. Методические указания по выполнению практических работ по МДК
    02.01 Технология разработки програмного обеспечения.– Нефтеюганск: НИК(филиал)
    ФГБОУ ВО «ЮГУ», 2019 [Электронный ресурс] Режим доступа: локальная сеть филиала.
    Периодические издания
    1. Программные продукты и системы [Электронный ресурс]: журнал.- Тверь: — Научно- исследовательский институт «Центрпрограммсистем» Электронно-библиотечная система «Лань» : [сайт]. — Режим доступа:
    https://e.lanbook.com/journal/2276
    1   2   3   4   5   6   7   8


    написать администратору сайта