Домашнее задание к занятию 3.2. Протоколы и расширения

Задача 1 (основная)

ВЫ - главный архитектор в команде разработчиков. Ваша задача - разработать программное обеспечение (ПО) для дилерских центров по продаже автомобилей. Ваша цель - создать гибкое ПО. Что это значит? Ваше ПО должно подходить для любой марки авто, должно быть расширяемым и масштабируемым в дальнейшем, чтобы ваша компания могла выпускать обновления. Задача разделена на 4 части, в каждой из них нужно самостоятельно подумать, какой тип данных передать каждому свойству для комфортной работы, а также по необходимости добавить вспомогательные методы.

Часть 1.

Для начала нужно описать машину минимальным набором параметров, используя протокол.

Алгоритм выполнения

  1. Создайте протокол 'Car'
  2. Добавьте в него свойства:
  • 'model' (только для чтения): марка
  • 'color' (только для чтения): цвет
  • 'buildDate' (только для чтения): дата выпуска
  • 'price' (чтение и запись): цена авто
  • 'accessories' (чтение и запись): дополнительное оборудование (тонировка, сингнализация, спортивные диски)
  • 'isServiced' (чтение и запись): сделана ли предпродажная подготовка. Обычно ее делают в дилерских центрах перед постановкой машины в салон.

Часть 2.

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

Алгоритм выполнения

  1. Создайте протокол 'Dealership'
  2. Добавьте свойства:
  • 'name' (только для чтения): название дилерского центра (назвать по марке машины для упрощения)
  • 'showroomCapacity' (только для чтения): максимальная вместимость автосалона по количеству машин.
  • 'stockCars' (массив, чтение и запись): машины, находящиеся на парковке склада. Представим, что парковка не имеет лимита по количеству машин.
  • 'showroomCars' (массив, чтение и запись): машины, находящиеся в автосалоне.
  • 'cars' (массив, чтение и запись): хранит список всех машин в наличии.
  1. Добавьте методы:
  • 'offerAccesories(_ :)': принимает массив акксесуаров в качестве параметра. Метод предлагает клиенту купить доп. оборудование.
  • 'presaleService(_ :)': принимает машину в качестве параметра. Метод отправляет машину на предпродажную подготовку.
  • 'addToShowroom(_ :)': также принимает машину в качестве параметра. Метод перегоняет машину с парковки склада в автосалон, при этом выполняет предпродажную подготовку.
  • 'sellCar(_ :)': также принимает машину в качестве параметра. Метод продает машину из автосалона при этом проверяет, выполнена ли предпродажная подготовка. Также, если у машины отсутсвует доп. оборудование, нужно предложить клиенту его купить. (давайте представим, что клиент всегда соглашается и покупает :) )
  • 'orderCar()': не принимает и не возвращает параметры. Метод делает заказ новой машины с завода, т.е. добавляет машину на парковку склада.

Обратите внимание! Каждый метод должен выводить в консоль информацию о машине и выполненном действии с ней.

Часть 3.

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

Алгоритм выполнения

  1. Используя структуры, создайте несколько машин разных марок (например BMW, Honda, Audi, Lexus, Volvo). Все они должны реализовать протокол 'Car'.
  2. Используя классы, создайте пять различных дилерских центров (например BMW, Honda, Audi, Lexus, Volvo). Все они должны реализовать протокол 'Dealership'. Каждому дилерскому центру добавьте машин на парковку и в автосалон (используйте те машины, которые создали ранее).
  3. Создайте массив, положите в него созданные дилерские центры. Пройдитесь по нему циклом и выведите в консоль слоган для каждого дилеского центра (слоган можно загуглить).

Обратите внимание! Используйте конструкцию приведения типа данных для решения этой задачи.

Часть 4. Задача со звездочкой (*)

Работа с расширениями. Нам нужно добавить спецпредложение для "прошлогодних" машин.

Алгоритм выполнения

  1. Создайте протокол SpecialOffer.
  2. Добавьте методы:
  • 'addEmergencyPack()': не принимает никаких параметров. Метод добавляет аптечку и огнетушитель к доп. оборудованию машины.
  • 'makeSpecialOffer()': не принимает никаких параметров. Метод проверяет дату выпуска авто, если год выпуска машины меньше текущего, нужно сделать скидку 15%, а также добавить аптеку и огнетушитель.
  1. Используя расширение, реализуйте протокол 'SpecialOffer' для любых трех дилерских центров.
  2. Проверьте все машины в дилерском центре (склад + автосалон), возможно они нуждаются в специальном предложении. Если есть машины со скидкой на складе, нужно перегнать их в автосалон.