Нарушает ли вложение UINavigationController в другой UINavigationController принцип подстановки Барбары Лисков (LSP)?

«Нарушает ли вложение UINavigationController в другой UINavigationController принцип подстановки Барбары Лисков (LSP)?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, это прямое нарушение LSP.

Принцип Лисков гласит, что объекты должны быть заменяемыми экземплярами своих базовых классов без изменения корректности программы.

UINavigationController не спроектирован для использования в качестве viewController внутри стека другого UINavigationController. Такая вложенность приводит к:

  • Непредсказуемому поведению навигационной панели (появлению двух панелей, конфликтам кнопок back).
  • Проблемам с жестами (например, interactivePopGestureRecognizer).
  • Нарушению ожидаемого жизненного цикла и контейнерной иерархии UIKit.

Неправильный подход (нарушает LSP):

let innerNavController = UINavigationController(rootViewController: SomeViewController())
let outerNavController = UINavigationController(rootViewController: innerNavController) // Нарушение!
window?.rootViewController = outerNavController

Правильные альтернативы:

  1. Использовать UINavigationController как корневой контейнер, а внутри стека размещать только UIViewController.
  2. Для сложной навигации использовать комбинацию UITabBarController и UINavigationController.
  3. Реализовать кастомный контейнерный контроллер, если требуется особая логика переходов.