Перейти к содержимому
На этой странице

Паттерны

Все темы IOS Developer

Опишите принципы SOLID и внедрение зависимостей (Dependency Injection, DI).

Принципы SOLID:

  1. Принцип единственной ответственности (Single Responsibility Principle, SRP)

    : Каждый класс должен быть ответственен только за одну часть функциональности программы.

  2. Принцип открытости/закрытости (Open/Closed Principle, OCP) : Программные сущности должны быть открыты для расширения, но закрыты для модификации.

  3. Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP)

    : Объекты в программе могут быть заменены их наследниками без изменения свойств программы.

  4. Принцип разделения интерфейса (Interface Segregation Principle, ISP)

    : Клиенты не должны зависеть от интерфейсов, которые они не используют.

  5. Принцип инверсии зависимостей (Dependency Inversion Principle, DIP)

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

Внедрение зависимостей (Dependency Injection, DI) - это методика программирования, которая способствует реализации принципа инверсии зависимостей. Она заключается в том, что зависимости модуля внедряются извне, а не создаются внутри самого модуля. Это делает код более гибким, позволяя легко заменять зависимости и тестировать модули.


Каковы различия между взаимодействием классов через композицию, агрегацию и зависимость?

Взаимодействие классов через композицию, агрегацию и зависимость отличаются по степени “связности” объектов:

  1. Композиция: Это отношение “часть-целое”, где один объект (часть) является неотъемлемой частью другого объекта (целого). Когда целый объект уничтожается, все его части также уничтожаются. Например, автомобиль состоит из двигателя, колес и других частей. Если автомобиль уничтожается, то и его части также должны быть уничтожены.

  2. Агрегация: Это отношение “содержание-содержащее”, где один объект (содержащее) содержит другой объект (содержание), но содержание может существовать независимо от содержащего. Например, у автомобиля могут быть колеса, которые могут использоваться и в других транспортных средствах.

  3. Зависимость: Это отношение, когда один объект использует функциональность другого объекта, но не является его частью и не владеет им. Зависимость проявляется в том, что объект может вызывать методы или использовать свойства другого объекта. Например, класс, который использует сервис для выполнения определенной задачи, зависит от этого сервиса.


Какие паттерны проектирования вы чаще всего используете?

Примеры паттернов для обсуждения. Выберите те, которые использовали, и объясните решённую ими задачу.

  1. Model-View-Controller (MVC): Для разделения приложения на три компонента: модель (данные), представление (отображение данных) и контроллер (логика управления данными и представлением).

  2. Model-View-ViewModel (MVVM): Для разделения приложения на три компонента: модель (данные), представление (отображение данных) и модель представления (логика управления данными и их преобразование для представления).

  3. Dependency Injection (DI): Для управления зависимостями между компонентами приложения и обеспечения легкости тестирования и поддержки.

  4. Repository Pattern: Для абстрагирования доступа к данным и предоставления единого интерфейса для работы с различными источниками данных.

  5. Singleton Pattern: Для гарантирования того, что класс имеет только один экземпляр и предоставления глобальной точки доступа к этому экземпляру.


Какой дизайн-паттерн вы чаще всего используете в своих проектах и почему?

Если вы использовали MVVM, объясните, как ViewModel готовила данные и обрабатывала действия, а View отображала состояние. Приведите пример того, что стало проще тестировать, и назовите недостатки решения. Если в вашем проекте был другой паттерн, расскажите о нём.


Что такое паттерн Singleton и где его уместно использовать?

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

  • Менеджеры ресурсов: Например, менеджер сетевых запросов или менеджер баз данных.

  • Настройки приложения: Класс, управляющий настройками приложения.

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

Собеседования: iOS

Смотри записи интервью, узнай, какие вопросы задают и как отвечают кандидаты.

Вопросы и ответы

Не нашли ответ? Напишите мне в чат. Я делаю Шпаргалку и сам отвечаю на сообщения. Расскажите, что не работает или чего вам не хватает. Может, смогу сразу взять это в работу.

Откуда взяты вопросы?

Из реальных собеседований. Основой подборки стал опыт Вадима Новосёлова: он проходил интервью и записывал вопросы. Подробнее о материалах.

Насколько эти вопросы актуальны?

Эти вопросы встречались нам на реальных собеседованиях в 2025 году. Мы регулярно проходим собеседования и пополняем подборку новыми вопросами. Основы профессии и ключевые технологии остаются востребованными годами, а детали конкретных инструментов и версий стоит сверять с текущей документацией.

На какой уровень рассчитана подборка?

Мы проходили собеседования на вакансии уровня Middle+, а иногда и на Senior-позиции. Вопросы из этих интервью вошли в подборку. Направления работы: iOS-разработчик, Swift-разработчик. Глубина обсуждения зависит от вакансии: будь готов объяснить основную идею, привести практический пример и разобрать ограничения и альтернативы решения.

Этот вопрос точно будет на моём собеседовании?

Гарантии нет: набор вопросов зависит от компании, задач команды, уровня вакансии и самого интервьюера. Эти вопросы уже встречались на реальных собеседованиях, но на твоём интервью ту же тему могут проверить другой формулировкой, практической задачей или обсуждением твоего опыта. Используй подборку, чтобы разобраться в теме: объясняй идею своими словами, приводи примеры и готовься обсудить ограничения и альтернативы решения. Так будет проще ответить и на знакомый вопрос, и на неожиданные уточнения.