Что такое протокол-ориентированное программирование в Swift? Какую пользу это принесет?

посмотреть Представления, Ориентированные На Протокол видео. Я нахожу это видео более простым и простым в использовании. Само видео WWDC немного продвинуто и требует большей ширины.


С собственного веб-сайта Apple: "в основе дизайна Swift лежат две невероятно мощные идеи:Программирование, ориентированное на протокол и семантика значений первого класса."

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

Я читал этой и смотрел протокол-ориентированное программирование в Swift видео, но исходя из фона Objective-C все еще не понял этого. Я любезно прошу очень простой английский ответ вместе с фрагментами кода и техническими подробностями о том, как он отличается от Objective-C.

просто один из путаницы, которую я использую <tableViewDelegate, CustomDelegate> У нас не соответствуют несколько протоколов в Objective-C? Итак, опять же, как Swift new?

4 ответов


предисловие: POP и OOP не являются взаимоисключающими. Это парадигмы дизайна, которые тесно связаны между собой.

основным аспектом POP over OOP является то, что предпочитает композиция над наследованием. В этом есть несколько преимуществ.

в больших иерархиях наследования классы предков tend чтобы содержать большую часть (обобщенной) функциональности, с листовыми подклассами, вносящими только минимальный вклад. Вопрос здесь что классы предков в конечном итоге делают много вещей. Например,Car приводы, груз магазинов, пассажиры мест, музыка игр, ЕТК. Это много функций, которые каждый из них совершенно различны, но все они нераздельно объединяются в Car класса. Потомки Car, например Ferrari, Toyota, BMW, etc. все они вносят минимальные изменения в этот базовый класс.

следствием этого является сокращение повторного использования кода. Мой BoomBox играет музыка, но это не машина. Наследование функциональности воспроизведения музыки от Car невозможно.

вместо этого Swift поощряет, чтобы эти большие монолитные классы были разбиты на состав меньших компонентов. После этого эти компоненты легче использовать повторно. Оба!--0--> и BoomBox можно использовать MusicPlayer.

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


в протоколе Objective C то же самое, что и интерфейс на большинстве языков. Таким образом, в Objective C использование протокола ограничено твердый принцип "зависеть от абстракций. Не зависите от конкреций."

в протоколах Swift были улучшены настолько серьезно, что, поскольку они все еще могут использоваться в качестве интерфейсов, на самом деле они ближе к классам (например,абстрактные классы в C++)

в Objective C единственный способ поделиться функциональность между классами является наследованием. И вы могли бы унаследовать только один родительский класс. В Swift вы также можете принять столько протоколов, сколько вы хотите. И поскольку протоколы в Swift могут иметь реализацию методов по умолчанию, они дают нам полнофункциональный множественное наследование. Больше гибкости, лучшее повторное использование кода-потрясающе!

вывод:

Программирование, Ориентированное На Протокол is в основном то же самое, что ОП но он уделяет дополнительное внимание совместному использованию функций не только через наследование, но и через принятие протокола (композиция над наследованием).

стоит отметить, что в C++ абстрактные классы очень похожи на протоколы в Swift, но никто не говорит, что C++ поддерживает определенный тип ООП. Так общие POP является одной из версий ООП, если мы говорим о парадигмах программирования. Для Swift POP является улучшенным версия ООП.


меня удивило, что ни один из ответов не упомянул тип значения в POP.

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

  1. он имеет только один удел. Если у нас очень сложная иерархия наследования, у нижнего класса может быть много ненужного состояния.
  2. он использует класс, который является ссылочным типом. Тип ссылки может вызвать код небезопасен. например, обработка коллекции ссылочных типов во время их изменения.

в то время как в протоколе ориентированного программирования в swift:

  1. оно может соответствовать нескольким протоколам.
  2. он может использоваться не только классом, но и структурами и перечислениями.
  3. это расширение протокола, которое дает нам общую функциональность для всех типов, что соответствует протоколу.
  4. он предпочитает использовать тип данных вместо ссылочный тип. Взгляните на стандартную библиотеку swift здесь, вы можете найти большинство типов структур, является тип значения. Но это не значит, что вы вообще не используете класс, в какой-то ситуации вы должны использовать класс, например Singleton.

таким образом, ориентированное на протокол программирование-это не что иное, как еще одна парадигма программирования, которая пытается решить недостатки ООП.


добавление к приведенному выше ответу

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

причина использовать протокол

классы предоставляют одно наследование, а структура не поддерживает наследование. Таким образом протоколы были введенный.

расширение методы, объявленные внутри протокола, могут быть реализованы внутри расширения, чтобы избежать избыточности кода в случае, если протокол наследуется в нескольких классах / структурах, имеющих одинаковую реализацию метода. Мы можем вызвать метод, просто объявив объект struct / enums. Даже мы можем ограничить расширение списком классов, только ограниченный класс сможет использовать метод, реализованный внутри расширения, в то время как остальная часть классы должны реализовать метод внутри собственного класса.

пример

protocol validator{

    var id : String{ get }
    func capitialise()-> (String)

}

extension validator where Self : test{
    func capitialise() -> String{
        return id.capitalized
    }
}

class test : validator {

    var id: String

    init(name:String) {
        id = name
    }
}

let t = test(name: "Ankit")
t.capitialise()

при использовании в ООП предположим, что у нас есть базовый класс транспортного средства, который наследуется самолетом, велосипедом, автомобилем и т. д. Здесь перерыв, ускорение может быть общим методом среди трех подклассов, но не летным методом самолета. Таким образом, если мы объявляем метод flyable также в ООП, подкласс bike и car также имеет метод inherit flyable, который бесполезен для тех класс. Таким образом, в POP мы можем объявить два протокола: один-для летучих объектов, а другой-для методов разрыва и ускорения. И flyable протокол может быть ограничен в использовании только самолетом