Применение техник «Выделение вычислений» и «Улучшение структуры действий» #
Формат проведения семинара #
Данное занятие будет проведено в формате семинара. На семинаре будут обсуждаться результаты применения техник функционального программирования к ранее реализованному императивному коду.
Первый этап: подготовка императивного приложения #
Код написан согласно объектно-ориентированной парадигме #
Вам необходимо разработать, доработать или выбрать свой предыдущий код, реализующий задачу согласно принципам классической объектно-ориентированной парадигме:
- Для описания сущностей реального мира используются объекты, порождаемые классами. Для одной сущности реального мира используется ровно один объект в рамках системы.
- Допускается использование полиморфизма, наследования и обобщённого программирования.
Отсутствует завязка кода предметной области на фреймворк #
Настоятельно рекомендуется не использовать код, архитектура которого определена фреймворком, который был использован при разработке приложения. Допускается использование кода, работающего с графическим интерфейсом, в случае, если работа с данными классов предметной области целиком отделена от логики работы библиотек и требований различных фреймворков. При желании использования такого кода, его необходимо согласовать с преподавателем не позднее чем за неделю до сдачи.
Приложения с командным интерфейсом обычно не построены вокруг конкретных фреймворков, поэтому их архитектура диктуется самим разработчиком. Данный тип приложений рекомендован к использованию.
Все данные находятся в оперативной памяти #
Приложение также не должно использовать системы хранения данных.
- Должны отсутствовать запросы к базе данных во время работы приложения.
- Вся обрабатываемая информация должна находится в оперативной памяти приложения.
Удаление мусора происходит автоматически #
Удобнее всего применять предложенные подходы к языкам программирования, ориентированных на запуск в средах с функцией автоматической сборки мусора. То есть данные подходы плохо применимы к системным языкам программирования с ручным управлением памятью (Си, 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
Подготовка к семинару #
Для участия в семинаре необходимо подготовить выступление, в рамках которого рассмотреть процесс изменения исходного кода. Выступление должно описывать:
- Изначальное состояние исходного кода. В описание должно входить:
- Описание назначения кода.
- Описание изначальной связи данных друг с другом.
- Описание изначальной связи методов друг с другом.
- Выявление неявных входов и выходов в ключевых методах.
- Описание результата применения техник к коду. В описании должно быть:
- Пример выделения вычислений из действий с заменой неявных входов/выходов на аргументы/возвращаемое значение.
- Пример улучшения структуры действий: передача данных через аргументы, изменение сигнатуры, копирование при записи (copy-on-write), выделение конструкторов.
- Изменение в структуре методов до и после применения техник.
- Объяснение причин изменений: почему выделение вычислений улучшает код, как 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