Tag: 编程范例

POP(面向协议的编程)-简介

在此处找到原始帖子。 前言 计算机是由多个硬件组件组成的复杂机器。 然后是一个软件层,可以有效地利用这些组件来执行所需的任务。 这些复杂的机器很多时候互相交谈以共享信息或委派一些任务。 所有这些任务在某个时间点都会处理数据。 对整个生态系统的研究被广泛称为计算机科学。 科学领域,其整个重点是使一组任务自动化。 我们将不断发展和改善现有的生态系统,并期望它能为我们做更多的事情。 在硬件组件上不时有值得称赞的改进。 随后,我们改进了软件方法,以充分利用这些笨拙的组件。 我们发明了操作系统,内核,编译器,并逐步对其进行改进以与硬件相匹配。 为了构建这些功能强大的软件,需要开发出具有更多功能和更多功能的新编程语言。 每种编程语言均出于一组目的而存在,并且支持一个或多个编程范例。 这样的范例之一就是面向对象的编程(OOP),它于1960年代初期引入,并从那时起被广泛使用。 这种范式要求我们根据对象来思考一切。 OOP通过其核心原理(抽象,封装,继承和多态性)具有解决现实问题的强大能力。 因此,许多编程语言已成为OOP的主要范例。 诸如C ++,JAVA,Objective-C等OOP语言通过分类,子分类,方法重载,抽象(协议)等支持了核心原理。 不过有一些注意事项– 所有这些功能仅可用于对象(引用类型)。 诸如结构和枚举之类的值类型无法利用这些功能,因此它们仅保留了数据存储空间而已。 我们失去了值类型是线程安全的巨大优势。 结果,我们不懈地致力于解决对象(引用)的线程安全问题。 同样,大多数OOP语言由于其性质的复杂性而不支持多重继承,因此不支持多重继承。 例如:假设歌手和演员都从其父艺术家Artist继承,他们都免费获得了Artist实现的通用功能 但是,如果要求说某些歌手也可能是演员,那么继承树将看起来像– 在这里,我们也将每个歌手都设置为演员 ,当歌手不是演员时,这会强制不相关的功能。 期望 这些惊人的OOP功能也应该有一种可用于值类型的方法,这样我们就不必担心解决线程安全的成本。 而且,如果我们可以在不给我们的类型带来太多复杂性的情况下带来多重继承,那么我们就可以完全避免上述问题。 解决方案—面向协议的方法 时间需要不同的思维方式。 超越OO方式的思考。 面向协议的方法。 但是首先,什么是协议? 协议是一组规则和要求(方法和属性),类型(值或引用)需要满足。 将协议视为其要求的抽象蓝图。 一个类型可以相应地实现这些要求,并称其符合协议。 此外,一种类型可以符合多种协议。 让我们尝试通过面向协议的方法来解决上述问题– 我们声明了三个协议, 艺术家 , 演员和歌手 。 演员和歌手都继承自Artist协议。 每个协议都已声明其要求。 例如,符合Artist协议的类型需要在其实现中定义名称和年龄。 同样,符合Singer协议的类型需要提供name , age , […]

面向人文协议的编程

当心! Story ini menggunakan类似物Superhero dari DC Comics。 Sebagai程序员,Pasta sudah terbiasa dengan 面向对象编程 。 Dimana paradigma pemrograman itu banyak memberi solusi untuk membuat arsitektur 可重用 代码 。 Namun OOP sendiri juga memiliki beberapa kekurangan,Yang kemudian pada tahun 2015,Swift memperkenalkan 面向协议的编程 ,yang bisa menangani kekurangan tersebut。 Definisi 协议 sendiri adalah : 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 Setiap 方法,属性,dll,协议,类,类, 要求, 协议 。 […]

模块和变更控制:为什么对Swift中基于协议的编程感到兴奋

你曾经没有冰箱住过吗? 自从我们一个多月前破产以来,这就是我一直在做的事情。 原来,我们的厨房在冰箱周围进行了翻新,所以把破损的冰箱搬出来是一场噩梦。 整个经历使我开始思考我们在多大程度上依靠我们的设备为我们做不同的事情。 当我们第一次买到冰箱时,我真的很兴奋,因为它也有一个饮水机。 因此,现在,我们的冰箱不仅用于储存食物并保持冷藏,还可以用来取水。 我们已经有一个饮水机,我们的厨房水槽。 我们用它来洗碗,但是我们也有一个洗碗机。 我们有许多不同的设备,它们以不同的方式完成相同的任务,以完成各种任务。 作为一个新手程序员,我一直在思考如何在代码中表示事物。 通常,在编写代码时,我的理念是问“完成此任务看起来像什么? 涉及的机制和步骤是什么? 所以预期的条件和结果是什么?”因此,当我了解到所有可以做的事情(例如Swift)时,我会以类比的方式来使用它们来解决生活中的问题。 所以我有一个装满电器的厨房,我想用代码表示它们。 传统上,使用面向对象编程,我将为每种通用设备类型定义一个类,然后具有特定的子类来共享其大多数方法和属性,并添加自己的独特方法和属性。 太好了,但这就是问题所在:就像一个程序一样,我的厨房经历了无数次迭代。 如果我在12月为我的厨房编写代码(我将其称为以前的版本为Kitchen 2.0),因为我的冰箱分配了水并且也是唯一使食物保持低温的东西,也许我会先定义Sink类,然后才有了冰箱包括一个水槽对象以允许其分配水。 我本来让洗碗机继承了洗碗的能力,却没有分配水的能力。 好吧,现在冰箱坏了,我们有一个迷你冰箱。 那根本不分配水。 因此,如果我要更新厨房代码,则必须为不继承水分配功能的迷你冰箱增加一个新类。 好吧,这就是这样的大型项目的本质。 但是,当我们买到新冰箱时会怎样? 技术在10年中取得了长足的进步,现在出现了一种全新的设备,即“智能设备”,可以访问互联网。 在OOP范式中,从经过翻新的Kitchen 2.o到智能电器Kitchen 3.o,将是一项疯狂的工作。 我必须决定是否重新分类几乎所有内容,使冰箱成为智能设备和冷却设备的父类,是否要从小型冰箱继承还是成为其父对象,还是要创建新的智能设备?反对并将其纳入我的课程。 更改父类时,我必须返回并确保所做的更改没有破坏任何子类。 我必须进入每个子类,并确保我要考虑其内部方法中对父类代码的任何更改,并确保我覆盖了我不想继承或不想继承的任何方法。功能有所不同。 整个过程将花费一些时间来实现我真正兴奋的超酷“智能设备”功能。 Kitchen 3.o更新看起来是一场巨大的噩梦。 此外,您可以看到继承如何在其头上代表其自身的概念基础。 通常,您会想象一个简单的对象从更复杂的对象继承其功能。 但是,继承模型具有从简单对象继承的更复杂的对象。 这会导致更改从简单且易于修复的对象向外过滤到复杂且难以修复的对象中。 这就是为什么我对面向协议的编程感到如此兴奋的原因。 协议旨在概述对对象的要求,以便它们可以与其他对象安全地交互。 但是从我目前的厨房状况来看,我可以看到POP的多功能性对于真正实现OOP设定的目标将有真正的帮助。 我可以通过使用Swift的协议从传统的继承模型切换到模块化(面向方面​​)模型来实现。 它将使Kitchen 3.oa变得束手无策! 在以协议为中心的模型中,我可以将可用于多个类的所有常用方法划分为协议。 协议将允许我定义几个类共有的功能,并对操作它们所需的变量实施要求。 在下面,您可以看到如何使用协议在Swift中实现我的Container模块。 我使用“ _m”来区分我的模块和其他类型的协议。 您可以看到我正在设置变量“ storedItems”的要求。 我需要定义此变量是否可以直接访问,并且如果我将Structs与此模块兼容,则需要定义将其修改为Mutating的方法。 为了允许类使用模块,我需要像普通协议一样将其添加到类声明中。 现在,该类的任何实例都可以使用它从模块中获得的方法。 我不必声明这些方法即可编译我的代码,如果需要添加功能或完全替换它们,也可以覆盖它们。 […]