Курс "Введение в ООП" ВШЭ 2018 Модуль 3"

Курс "Введение в ООП" ВШЭ 2018 Модуль 3"

Dmitry Kozlov

Чат в Telegram: https://t.me/joinchat/BzLwXRF6-MB3K45Aii5E9g

Для выполнения заданий нужен Java 9 SDK SE и необязательно - Intellij IDEA.

Если вам что-то непонятно в ДЗ - спрашивайте в телеграме.


Домашнее задание 1. Дедлайн 23 янв

Написать на Java эквивалент программы http://www.ioccc.org/2011/akari/akari.c

Для тех, кто испугался делать дз из-за непонятного С-кода. Задание попроще: никакого непонятного кода, а вместо него красивый и понятный: https://github.com/cslarsen/jp2a. Написать эквивалентную программу на Java.


Домашнее задание 2. Дедлайн 6 фев

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

С участниками семинаров, особенно вторничного, мы говорили о том, что С-шный код переписанный на Java слово-в-слово выглядит немного ужасно. Поэтому мне бы хотелось код в стиле Java http://www.oracle.com/technetwork/java/codeconventions-150003.pdf

А также без попыток реализации scanf средствами регулярных выражений.

Благодаря участникам первой лекции и семинара у нас сама собой начала образовываться тема работы с изображениями и в этом задании мы попробуем ее развить. Впереди у нас хорошо построенная объектно-ориентированная система по работе с изображениями, представленными в формате ascii graphics. Если вы помните, то помимо akari.c я давал программу на С, которая преобразует изображение в ascii graphics, причем делает это довольно толково, разным уровням серого соответствуют разные символы. Эта програмка будет основой нашей библиотеки распознавания изоражений. Итак, нам надо уметь преобразовывать изображения в наш внутренний формат представления - ascii graphics, а потом разпознавать в них всякое. Для этого задания - цифры. Алгоритм разпознавания - выбор каждого. Алгоритм преобразования в ascii graphics - согласно той программке на C.

Подумайте над вопросами, которые я задавал на семинаре про akari.c:

- а как добавить поддержку еще какого-то входного формата,

- а что надо сделать, чтобы изменить алгоритм сжатия (для тех, кто не делал дз здесь описание того, что делает akari.c http://www.ioccc.org/2011/akari/hint.html).

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

P.S. По итогам заданных мне вопросов по заданию: изображение цифр не зашумлено. Распознавание можно заменить преобразованием, поворотом и отражением.


Домашнее задание 3. Дедлайн 13 фев.

Теперь изображение на входе содержит несколько цифр, разделимых на листе вертикальными и горизонтальными линиями. Надо сделать сегментирование изображения на кусочки по 1 цифре и параллельную обработку кажодого кусочка в отдельно Thread. Использовать java.util.concurrent пока нельзя, пока работаем со старым API.

P.S. По итогам заданных мне вопросов по заданию: Распознавание можно заменить преобразованием, поворотом и отражением. В этом случае нужно сделать сборку изображения обратно.


Домашнее задание 4. Пока без даты дедлайна, о ней будет уточнение дополнительно.
Одна из оцениваемых работ будет посвящена принципам SOLID, вам будет предложен код, в котором будут нарушения каких-либо принципов из этого списка, нужно будет сделать рефакторинг кода таким образом, чтобы принципы SOLID соблюдались. Для успешного выполнения этой работы полезно ознакомиться со следующими статьями:
https://web.archive.org/web/20150202200348/http://www.objectmentor.com/resources/articles/srp.pdf
https://web.archive.org/web/20150905081105/http://www.objectmentor.com/resources/articles/ocp.pdf
https://web.archive.org/web/20150905081111/http://www.objectmentor.com/resources/articles/lsp.pdf
https://web.archive.org/web/20150905081110/http://www.objectmentor.com/resources/articles/isp.pdf
https://web.archive.org/web/20150905081103/http://www.objectmentor.com/resources/articles/dip.pdf
Для тех, кто будет переживать, что еще и читать надо, отмечу, что это был материал прошлой лекции.


Классное задание 5. Без даты дедлайна.

Сделать ревью кода дз 1-3 у двоих коллег. Результаты должны быть доступны в Github-репозитарии того человека, чей проект вы смотрели. Мы делали и делаем это на семинаре.


---------------------------------------------------------

Из чего должен состоять финальный проект.

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

- Финальный проект начинается с постановки задачи, которую вы пишете в объеме листа А4. Эта постановка согласовывается с лектором.

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

- Проект должен содержать реализацию каких-либо алгоритмов с использованием стандартной библиотеки Java. При этом важно продемонстрировать умение грамотно пользоваться стандартной библиотекой и писать код в соответствии с Java Coding Conventions. 

- Проект должен содержать качественный код в терминах книг Clean Code и Code Complete.

- Проект должен демонстрировать применение методов ООП для моделирования предметной области, примером служит серия дз 1-3, где мы проектировали систему для преобразований, обработки и распознавания изображений.

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

- Проект должен содержать документацию как с использованием технологии Javadoc, так и без (например, Readme файл для Github). Документация обязательно должна содержать инструкции по запуску проекта.

- Программа, созданная в рамках проекта, должна взаимодействовать с пользователем в user-friendly манере, например, если это командная строка Unix, то должна поддерживаться опция --help, а об отсутствии необходимых параметров и т.п. должны выводиться понятные пользователю сообщения. 

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

- Проект выкладывается в публичный Github-репозиторий в виде набора pull request-ов. История изменений должна быть ясной и понятной.

- Проект должен собираться из исходников одной командой с использованием одного из средств сборки: ant, maven, gradile. 


Я уезжаю с 2 по 8 марта в командировку, поэтому постановку задачи лучше согласовать до этого времени, это даст вам больше времени на работу над проектом.

---------------------------------------------------------

Краткое содержание предыдущих серий:

Лекция 1. Вводная

На ней мы поговорили о структуре курса, формах контроля знаний, языке программирования Java, истории его появления и сравнили его с уже изучавшимися Python, C, C++.


Лекция 2. Процедурное программирование на Java.

Мы поговорили о том, что Java очень похож на С и многие конструкции практически совпадают. Посмотрели на типы данных и на инструкции, связанные с потоком управления. Этот материал хорошо изложен вот здесь:

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/index.html

https://docs.oracle.com/javase/tutorial/java/package/index.html

https://docs.oracle.com/javase/tutorial/java/IandI/index.html


Лекция 3. Основные конструкции ООП в Java.

Мы поговорили о том, что такое ООП, посмотрели какие конструкции ООП есть с Python, C++ и сравнили их с Java. Часть, касающуюся конструкций языка Java можно посмотреть вот по этим материалам:

https://docs.oracle.com/javase/tutorial/java/concepts/index.html

https://docs.oracle.com/javase/tutorial/java/javaOO/index.html


Лекция 4. Основне принципы ООП.

Материалы к лекции:
https://web.archive.org/web/20150202200348/http://www.objectmentor.com/resources/articles/srp.pdf

https://web.archive.org/web/20150905081105/http://www.objectmentor.com/resources/articles/ocp.pdf
https://web.archive.org/web/20150905081111/http://www.objectmentor.com/resources/articles/lsp.pdf
https://web.archive.org/web/20150905081110/http://www.objectmentor.com/resources/articles/isp.pdf
https://web.archive.org/web/20150905081103/http://www.objectmentor.com/resources/articles/dip.pdf

Лекция 5. Шаблоны проектирования (design patterns).

Мы говорили про design patterns в терминах одноименной книжки GoF и смотрели примеры их реализации на Java вот здесь.
https://www.avajava.com/tutorials/lessons/abstract-factory-pattern.html

Еще мы смотрели примеры практического использования каждого паттерна. Часть из них я рисовал на доске, а часть брал отсюда:

https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries

Лекция 6 (сдвоенная) Разработка, основанная на тестировании.
Слайды лекции:

https://drive.google.com/open?id=1AYqu0cU86TF5yKBAf5EG0qAcVJbEEfAJ
Мы также смотрели примеры использвоания JUnit, Hamcrest и Mockito.
По JUnit можно почитать tutorial вот здесь: http://www.vogella.com/tutorials/JUnit/article.html
Официальная документация лежить вот здесь: https://junit.org/junit4/. Мы смотрели именно 4-ю версию.
По Hamcrest можно также читать tutorial: http://www.vogella.com/tutorials/Hamcrest/article.html
А официальная документация лежит вот здесь: http://hamcrest.org/JavaHamcrest/

Аналогично для Mockito:
http://www.vogella.com/tutorials/Mockito/article.html

http://site.mockito.org/

Лекция 7. Системы сборки.
Слайды тут: https://drive.google.com/open?id=1eXviLHAQl1rw1D8mIDSMYkqR1o7_ntDG