Термін "Конструювання ПЗ" запроваджений Стівеном МакКоннеллом у його книзі "Досконалий код".
Дисципліна "Конструювання ПЗ" в основному стосується технік мінімізації складності ПЗ, що, у свою чергу, зменшить кількість помилок у ньому і підвищить гнучкість його адаптації до нових завдань.
В рамках лабораторних робіт студенти вивчають техніки хорошого стилю коду: грамотне розмежування додатку на компоненти у пакетах чи просторах імен, ін'єкція залежностей, використання дизайн патернів, документування інтерфейсів на основі javadoc, XML documentation чи NDoc; написання юніт-тестів; використання систем контролю версій.
Усі лабораторні роботи виконуються в рамках прилюдних репозиторіїв студентів. Дисципліна стосується новітніх технологій, тому вся документація і звіти з виконання лабораторних робіт зберігаються у виключно в репозиторіях.
Друкувати паперові звіти з виконання лабораторних робіт не потрібно.
Дисципліна не стосується якоїсь конкретної мови програмування, технології чи середовища розробки. Вона надає практичні рекомендації, яких можна дотримуватися на буль-якій мові програмування. Це відповідає терміну С.МакКоннелла "program into language" див. тут. Тому Ви вільні у виборі мови програмування, технології і середовища розробки. Практичне завдання можна виконати як консольний чи віконний додаток для .NET або JVM, як веб-сторінку з JavaScript або будь-що інше за вподобанням студента.
Будь ласка, регулярно відправляйте у репозиторій проміжні версії своєї роботи. Бо дуже підозріло виглядає репозиторій, де студент відправив лише одну завершену версію програми в день виставлення залікового модуля.
Приємного програмування!
Створіть обліковий запис на github.
Додайте у файл README.md
розділ "Правила гри", де опишіть так, як пригадуєте з лекційного заняття, правила гри "Вгадай слово".
Створіть у будь-якій мові програмування інтерфейс (трейт) TaskProvider
з методом get
, що повертає інстанцію Task
.
Добавте структуру (кейс-клас) Task
з полями question
та answer
стрічкового типу.
Створіть юніт-тест TestProviderTest
для компонента TestProvider
. Тест повинен перевіряти чи метод get
повертає непорожню (not null) інстанцію Task
, обидва поля якого також непорожні (not null).
Напишіть найпримітивнішу імплементацію TaskProviderImpl
інтерфейсу TaskProvider
.
Добавте інтерфейс GameView
з методами showSorry(message)
, showCongratulations(message)
, showCurrentGuess(guess: String)
та showTask(task: Task)
.
Добавте інтерфейс GameService
з властивостями gameView: GameView
, taskProvider: TaskProvider
та методами: guessWord(word: String)
, guessLetter(letter: String)
і start()
.
Напишіть юніт-тест GameServiceTest
для компоненту GameService
, який засобами Mockito підставляє імітаційні (mocked) імплементації компонентів gameView: GameView
і taskProvider: TaskProvider
. Тест повинен перевіряти чи компонент вірно опрацьовує логіку гри при вірно і невірно вгаданому слові(букві). При цьому слід перевіряти особливі випадки: користувач ввів порожню стрічку, користувач вгадав букву, котра у слові зустрічаєтсья двічі і т.д.
Створіть нову імплементацію інтерфейсу TaskProvider
, яка зчитує запитання і відповіді з файла чи будь-якого іншого засобу локального збереження даних, наприклад, HTML5 Web Storage для веб-додатків.
Добавте до TaskProviderTest
юніт-тест, що перевіряє чи два послідовні звернення до методу get
повертають різні завдання і чи адекватно опрацьовується випадок завершення файла (спроба отримати більше завдань ніж присутні у файлі).
Якщо ви розробляєте десктопний додаток, то зверніть увагу як ваш додаток виконує пошук файла із завданнями відносно поточної робочої директорії.
Створіть ще одну імплементацію інтерфейсу TaskProvider
, яка зчитує запитання і відповіді за допомогою get запиту на REST ресурс.
Імплементація повинна переключатися на отримання даних з локального сховища при невдалій спробі отримання даних з вказаного ресурсу. Перевірте цю поведінку за допомогою юніт-тесту.