Семинар. Применение базовых техник улучшения кода

Применение техник «Выделение вычислений» и «Улучшение структуры действий» #

Формат проведения семинара #

Данное занятие будет проведено в формате семинара. На семинаре будут обсуждаться результаты применения техник функционального программирования к ранее реализованному императивному коду.

Первый этап: подготовка императивного приложения #

Код написан согласно объектно-ориентированной парадигме #

Вам необходимо разработать, доработать или выбрать свой предыдущий код, реализующий задачу согласно принципам классической объектно-ориентированной парадигме:

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

Отсутствует завязка кода предметной области на фреймворк #

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

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

Все данные находятся в оперативной памяти #

Приложение также не должно использовать системы хранения данных.

  • Должны отсутствовать запросы к базе данных во время работы приложения.
  • Вся обрабатываемая информация должна находится в оперативной памяти приложения.

Удаление мусора происходит автоматически #

Удобнее всего применять предложенные подходы к языкам программирования, ориентированных на запуск в средах с функцией автоматической сборки мусора. То есть данные подходы плохо применимы к системным языкам программирования с ручным управлением памятью (Си, C++).

Объём кода, удобный для внесения изменений #

Для работы рекомендуется выбирать код длиной не более десяти тысячи строк.

Потенциально для решения задач подходит код, написанный на первых курсах бакалавриата.

Сложность предметной области #

  • Предметная область должна содержать не менее трёх сложных сущностей.
  • Предметная область должна предоставлять не менее десятка сложных операций.

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

erDiagram

Publisher {
  int id
  string name
}

Book {
  int id
  string isbn
}

Edition {
  int id
  book Book
  string series
  publisher Publisher
  date publishedOn
}

Library {
  int id
  string address
}

Librarian {
  int id
  string name
}

Reader {
  int id
  string name
  string libraryCard
}

Library }o--o{ Librarian : librarians
Library }o--o{ Reader : readers
Library }o--o{ Edition : bookCopies
Reader ||--o{ Edition : takenBooks
Book ||--o{ Edition : editions
Edition ||--|| Publisher : publisher

Подготовка к семинару #

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

  1. Изначальное состояние исходного кода. В описание должно входить:
    • Описание назначения кода.
    • Описание изначальной связи данных друг с другом.
    • Описание изначальной связи методов друг с другом.
    • Выявление неявных входов и выходов в ключевых методах.
  2. Описание результата применения техник к коду. В описании должно быть:
    • Пример выделения вычислений из действий с заменой неявных входов/выходов на аргументы/возвращаемое значение.
    • Пример улучшения структуры действий: передача данных через аргументы, изменение сигнатуры, копирование при записи (copy-on-write), выделение конструкторов.
    • Изменение в структуре методов до и после применения техник.
  3. Объяснение причин изменений: почему выделение вычислений улучшает код, как copy-on-write обеспечивает неизменяемость, как обобщение повышает переиспользуемость.

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

Подготовленный набор материалов: презентация и ссылка на репозиторий загружаются в качестве ответа на задание.

Проведение семинара #

Каждому слушателю курса необходимо представить свою работу и обсудить результаты других слушателей курса.

  • Каждый студент представляет свою работу в течение 5-10 минут.
  • После представления работы происходит обсуждение до 5 минут. Тематика обсуждения совпадает с темой курса.

Критерии оценивания #

Презентация (20 баллов) #

A – Описание исходного состояния (5 баллов) #

  • Назначение кода и предметная область описаны
  • Связи данных между сущностями описаны
  • Связи методов друг с другом описаны
  • Неявные входы и выходы в ключевых методах выявлены

B – Применение техник и рефлексия (15 баллов) #

  • Пример выделения вычислений из действий (замена неявных входов/выходов на аргументы/возвращаемое значение)
  • Пример улучшения структуры действий (аргументы, сигнатуры, copy-on-write, конструкторы)
  • Рефлексия: объяснение «почему» для каждой техники, связь с изученными концепциями

Активность на семинаре (10 баллов) #

C – Вопросы и комментарии к докладам других студентов (5 баллов) #

  • 5 баллов – Актуальные и содержательные вопросы, связанные с темой курса
  • 3 балла – Вопросы заданы, но без глубины или связаны с темой лишь частично
  • 1 балл — Вопросы формальные или не связаны с темой

D – Ответы на вопросы к собственному докладу (5 баллов) #

  • 5 баллов — Корректные ответы, готовность аргументировать выбор техник
  • 3 балла — Ответы даны, но аргументация слабая
  • 1 балл — Ответы некорректные или отсутствуют

Минимальный порог #

Менее 2 баллов в любом критерии — семинар не засчитан.

Пересчёт в 5-балльную оценку #

  • 0–4 баллов → оценка 1
  • 5–8 баллов → оценка 2
  • 9–12 баллов → оценка 3
  • 13–16 баллов → оценка 4
  • 17–20 баллов → оценка 5

© A. M. Васильев, 2026, CC BY-SA 4.0, andrey@crafted.su