Практические и теоретические задания к главе 4 «Рефакторинг программного кода»

Не забудьте сохранить сделанный в четвертой главе проект, а все задания реализуйте в его отдельной копии. В будущих главах мы вновь вернемся к версии 1.2 игры Right on target.

✕

Задание 1

В конце главы мы говорили о создании новой сущности «Генератор случайных числе» и выносе соответствующей логики из типа Game. Реализуйте следующую функциональность:

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

protocol IGenerator {
    func generateSecretValue() -> Int
}

struct Generator: IGenerator {
    func generateSecretValue() -> Int {
        // ...
    }
}

— Обеспечьте передачу генератора в структуру Game через ее инициализатор, например так:

let generator = Generator(range: 1...50)
var game = Game(generator: generator, rounds: 5) 

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

Кстати, передача экземпляра Generator в инициализатор типа Game называется Dependency Injection (инъекция зависимостей). Данный подход предусматривает передачу из вне (инжектирование) объектов с дополнительной функциональность в основной объект. То есть в данном случае генератор обеспечивает функциональность по выбору случайного числа, и данный объект создается не внутри типа Game, а передается из вне через инициализатор. Такой подход позволяет видеть, от чего зависит объект (то есть какую дополнительную функциональность он использует).

Dependency Injection — это довольно обширная и глубокая тема, к которой вы вероятно пока не готовы. Но помните, что рано или поздно вы вернетесь к ней, так как это одно из крайне важных знаний профессионального разработчика.

✕
Правильный ответ

Мой вариант решения вы можете скачать по ссылке https://justswift.io/listings22.

Задание 2

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

struct Round {
    // ...
    func tryGuess(withValue: Int) {
        // ...
    }
}
 

Таким образом Game будет отвечать за запуск игры в целом, а также за запуск нового раунда:

struct Game {
    private var round: Round
    // ...
    func startNewRound(withTryCounts: Int) {
        // ...
    }
}

Непосредственно во вьюконтроллере будет использовать интерфейс верхнегоуровневого объекта Game, а уже «под капотом» будет происходить обращение к Round. При этом что делать с генератором решайте сами: переносить его использование в Round (что приоритетнее) или оставить внутри Game.

В качестве ориентира можете использовать схему моих типов, или же придумать что-то полностью свое.

Правильный ответ

Мой вариант решения вы можете скачать по ссылке https://justswift.io/listings22.

Задание 3

Для решения данного задания возьмите за основу версию 1.2 приложения Right on target, которое было разработано в результате четвертой главы. Так стоит сделать, чтобы на начальном этапе не закопаться в изменении созданных нами дополнительных сущностей (Генератор случайных значений, Раунд).

✕

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

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

Одним из вариантов кодирования цвета является использование HEX-кода – шестизначной последовательности букв и цифр, начинающегося с символа # (например, белый – это #ffffff, черный ‒ #000000, а красный – #ffa0b2). Данная последовательность содержит три двухзначных числа в шестнадцатеричной системе счисления (цифры от 0 до F), объединенных в одно строковое значение. Для того, чтобы определить по HEX-коду цвет, компьютер разбивает его на три пары символов (например, для #ffaab2, розовый цвет – это ff, aa и b2), каждая из которых определяет интенсивность цвета для одного из каналов в схеме RGB (Red-Green-Blue).

✕

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

Фантазируйте и используйте все свои идеи. И помните, что суть обучения заключается не в том, чтобы вы выполнили задание, а в том, чтобы вы постарались его сделать, потратили время на рассуждения и самостоятельные попытки его решения!
В процессе выполнения задания вам самостоятельно потребуется рассмотреть работу с типом UIColor, позволяющим описать требуемый цвет в коде.
Правильный ответ

Мой вариант решения вы можете скачать по ссылке https://justswift.io/listings22.