OCP, второй принцип Принципов SOLID, который гласит: «Сущности должны быть открыты для расширения, но закрыты для модификации».

Давайте рассмотрим простой пример, нарушающий принцип открытого-закрытого.

enum BrowseType {
    case html
    case pdf
    case website
    case htmlString
}

func doTesting(inputType: BrowseType) {
    switch inputType {
    case .html:
        print("html")
        
    case .website:
        print("website")
        
    case .pdf:
        print("pdf")
        
    case .htmlString:
        print("htmlString")
    }
}

Теперь, как если бы мы хотели добавить к дополнению BrowseType, например image

то это будет выглядеть следующим образом.

enum BrowseType {
    case html
    case pdf
    case website
    case htmlString
    case image
}

Затем вы заметите, что эта ошибка появляется в Xcode.

Так что это на самом деле нарушает принцип открытого-закрытого. Когда мы добавили новый случай в наше перечисление BrowseType, нам нужно было войти в функцию doTesting, чтобы внести изменения.

В соответствии с принципом открытости-закрытости объекты должны быть закрыты для модификации, что означает, что изменение поведения объекта не должно влиять на изменение другого исходного кода.

Чтобы решить эту проблему, мы можем заставить функцию doTesting вместо этого принимать отдельные классы. И эти классы могут соответствовать требуемому протоколу с его функцией printDescription.

protocol BrowseType {
    func printDescription()
}
class html: BrowseType {
    func printDescription() {
        print("html")
    }
}

class pdf: BrowseType {
    func printDescription() {
        print("pdf")
    }
}

class website: BrowseType {
    func printDescription() {
        print("website")
    }
}

class htmlString: BrowseType {
    func printDescription() {
        print("htmlString")
    }
}

class image: BrowseType {
    func printDescription() {
        print("image")
    }
}
func doTesting(inputType: BrowseType) {
    inputType.printDescription()
}

Итак, теперь каждый раз, когда мы хотим добавить новый тип в BrowseType, мы можем просто добавить новый класс, соответствующий BrowseType, тогда функция doTesting автоматически все обработает.

😃 Спасибо за прочтение, надеюсь, это будет полезно для вас. 🎊