Tag: 毒蛇

VIPERtasarımpaterni nedir?

吉里斯 Apple iOS的MVC模式,可以帮助您解决MVC的问题。 1996年MVC足球比赛将在MUL 1996举行。 Microsoft网络模型Web窗体Web窗体MVC模式2009年窗体的窗体。 iOS的MVC模式的MVC模式的ihtiyaçlarıkarşılamamayabaşladı。 位置视图控制器的位置已过时。 业务逻辑模型业务模型模型业务层数据库—数据模型sade hale getirildi。 她的母亲是孩子,是孩子,是孩子,是孩子,是孩子,她的孩子,孩子,孩子,孩子,孩子,孩子,孩子,孩子,孩子。 an MVC haricinde MVP,MVVM和VIPERtasarımpaternleri var。 在iOS上的应用程序在VIPER上运行的时候,会出现inceleyelim。 VIPER mimarisi nelerdenoluşur? VIPER mimarisiadını视图,交互者,演示者,实体路由器(线框)’ılkharflerindenalıyor。 Bukavramlarınneolduğunakısacabakalım。 视图: VIPER mimarisinde视图被动演示者演示者被动演示。 HangiiçeriğingösterileceğiView’ebağlıdır。 Kullanıcıactionlarıpresenter’ayönlendirir。 交互器:业务逻辑işlemlerininyapıldığıkısımdırveuygulamanınomurgasınıoluşturur。 Bu katmandayapılanişlemlertamamen UI danbağımsızolmalıdır。 主持人:主持人esas olarak查看il ilgili logic’iiçerenkoduiçerir。 用户交互作用的用户数据查看用户交互作用。 查看ile Interactorarasındabirköprügörevigörür。 Bu katmanda视图ile ilgili veyauygulamanın商业kurallarıylailgili kodbulunmamalıdır。 实体:交互模型tarafındankullanılan模型nesneleriniiçerir。 Entity’lerin sadece Interactortarafındankullanılmasıçokönemlidir。 Interactor asla演示者层’实体模型lerinigöndermez。 路由器: Hangiekranlarınne zamangösterileceğinibelirlendiğiuygulamageçişakışınbulunduğukatmandır。 […]

VIPER:干净的代码架构

软件开发体系结构(或设计模式)非常关键,是“一个人”必须决定并采取的非常重要且初始的步骤之一(此处“一个人”是指软件开发者 😐😐,这是上帝的创造,可以将Coffee转换为软件 )。 在开发软件时遵循设计模式非常重要(当我这么说时,请相信我,我遇到了一些甚至不知道什么是“设计模式”但在App Store中拥有其应用程序的人。😶),因为它不仅是一种文件夹结构,但不止于此…。 对我来说,当您说您遵循特定的体系结构时,您应该至少了解以下几点: 您需要知道如何将每个功能部件定义和划分为责任,并将这些任务分配给不同的部分(类)。 始终注意实现的类之间的正确通信流程。 经过几分钟或几小时的思考,您编写的代码是可维护的,并且可以由任何其他“人员”进行增强(此处的“人员”也是软件开发人员)。 作为专业的iOS开发人员,我尝试了一种非常著名的最新架构VIPER 。 VIPER是当今世界范围内使用的一种设计模式,是您在进行大型项目时可以参考的最简洁的体系结构之一。 Viper是一种面向协议的编程以及模块化方法。 所有模块都分为5个不同的部分(类),每个部分都有其责任。 这些类必须仅执行特定任务,然后将所需结果传递给其他任务(如果需要)。 分解模块的5个不同部分或类是: 视图-视图包含您的所有UI元素。 每当发生用户交互时,View都有责任将信息传递给Presenter。 交互器-交互器是模块的大脑。 它包含不同的业务逻辑并使用案例实现。 演示者-演示者将获取的数据从View传递到Interactor,以根据业务逻辑进行进一步处理。 经过进一步处理后,交互器将数据传递给Presenter,然后将其传递给View以更新UI。 演示者还与路由器进行交互以执行导航。 实体是指按照应用程序流程进行处理和更新的自然趋势的数据模型。 实际上,数据模型和视图的组合效果对用户而言是可见的。 R外 -路由器负责所有与导航有关的任务,并在需要时传递任何数据。 这种职责分解称为“ 单一责任原则” 。 因此,它非常容易编写测试用例,这与其他在同一类中包含业务逻辑,UI处理,导航等内容的体系结构不同。 沟通流程 在上图中,您可以看到Interactor与其他两种类型的类进行通信 API数据管理器 本地数据管理器 这些不是其他组件,而是Interactor的帮助程序方法,仅用于隔离职责,例如用于进行API调用的API数据管理器和用于处理数据持久性的本地数据管理器 。 现在,通过查看该图,您可以非常清楚地了解流程。 如果没有,我举个例子来解决。 假设您在登录屏幕上。 登录完成后,您必须显示仪表板。 因此,流程将是这样的:

什么是VIPER?

VIPER是一种模式设计,代表了传统模式MVC(模型-视图-控制器)的替代产品,解决了控制器可以包含所有应用程序逻辑的问题,从而在组件之间产生了强大的耦合,并使难度更大。代码维护,例如使用MVC进行代码维护。 VIPER将应用程序逻辑的责任划分为多个组件,从而实现了更大程度的去耦以及更好的代码维护和测试。 这些组件将它们的名称命名为模式:(V)iew,(I)相互作用器,(P)ententer,(E)ntity和(R)outing或线框。 视图 VIPER中的视图是被动的。 他们向Presenter通知用户产生的事件,并期望他的响应与必须显示的数据。 视图负责了解如何显示数据和管理用户交互。 他们通过视图模型处理数据,其中包含必须显示的特定数据。 主持人 它们从视图中接收事件,并基于这些事件可以与交互器通信,以请求数据请求,或与路由或线框通信,以在应用程序中执行某些导航逻辑。 交互者回答后,演示者负责在业务模型(使用交互者)和视图模型(使用视图)之间执行转换数据。 转换后,它们将与视图通信,以通知要显示的视图模型。 演示者不知道如何构成视图。 互动者 他们负责执行所有业务逻辑。 他们使用业务模型或实体。 交互者必须处理来自演示者的请求数据。 因此,依次调用服务,数据库或在数据所在的任何地方搜索。 他们转换业务模型或实体中的数据。 处理完数据后,会将其提供给演示者。 交互者不了解用户界面。 实体 它们代表自己的应用程序业务逻辑数据,并由交互器处理。 路由 他们负责执行所有屏幕导航,进入应用程序。 路由也称为线框。 首先创建它们,它们自己负责创建其他组件:视图,演示者,交互者,并在它们之间建立关系。 它们接收主持人的请求,并负责在屏幕之间传输数据。 他们允许知道应用程序内导航的不同可能性是什么。 什么时候应该使用VIPER 当我们想要为我们的项目提供一个有序的结构,可以轻松,清晰地扩展并且可以重用时,您可以并行开发不同的组件而不会产生冲突。 VIPER促进了组件的测试,并且由于每个组件封装了不同的职责而可能产生的可能的bug。 何时不应该使用VIPER VIPER牵涉到许多组件的创建,如果您的项目很小并且您知道将来将无法扩展,那么这可能会带来不便。 另外,所有开发团队都必须完全了解VIPER,以避免与其他模式产生混合,这可能会妨碍项目的开发和维护。 例 我在这里留下一个在Swift中开发的小项目,作为具有VIPER模式的项目的示例。 希望对您有所帮助。 https://github.com/aortegas/VIPER_Example.git 请让我知道您对本文的看法,您的问题或产生的错误。 感谢您的反馈意见。 请享用! 阿尔贝托·奥尔特加(Alberto Ortega)

VIPER — Arquitetura limpa em nossos应用程序

Gosto da类比entent软件e carro。 没有可用于公用事业的软件,也不能使用temos camadas de componentes quesãose parapara por forutilização软件。 我在Locost七号航站楼。 莲花莲花的七种风情七种安全和良好的保护作用(nãoque isso sejafácil)。 Logo de cara,一种外在或外在的念珠菌。 没有人可以定义estEstéePropropósito,Basta olhar或Locost e Perceberééééum carro de Corrida com apelo年份。 没有软件可以真正实现对系统的信息传输。 百事大合唱团存在于乌干达埃斯特鲁图拉基地,区别于基本的加德罗。 Quando carro de Corrida,necessita de uma estrutura forte para aguentar disputas,mas ao mesmo tempo leve para ter um bom desempenho。 没有任何人可以在Locost那里,在Alémde Ter uma estrutura pensada para […]

创建iOS Viper模块-分步指南

什么是VIPER? 什么是VIPER模块? 模块应如何组装? 背景故事 最近,作为iOS开发团队,我们决定将项目代码库从Objective-C迁移到Swift,我们还讨论了使用新体系结构而不是将所有内容保留在MVC中的问题。 因此,打开XCode,选择文件和新项目,选择swift作为开发语言并重新开始,对吗? 🤔 不,有时候事情并不是那么容易。 实际上,如果整个团队都保留即将推出的新功能以及sprint目标以进行迁移过程,则产品经理将不会感到高兴。 因此,我们必须同时进行快速迁移和常见的sprint作业,才能使所有人满意。 Apple称之为Mix and Match ,可以从下面的链接查看详细信息, 将Swift与Cocoa和Objective-C结合使用(Swift 4.1):同一项目中的Swift和Objective-C 描述Swift与Objective-C语言和Cocoa / Cocoa Touch框架的兼容性的各个方面。 developer.apple.com 然而,这个故事与快速迁移无关,也有很多更好的文章。 如果我们专注于更改应用程序体系结构的决定,那么背后的原因是什么?实际上,我们一直在从事的iOS项目就像一个巨大的意大利面条,每个开发人员都会为每项新任务在配方中添加自己的调味料。 那么,好的架构应该提供哪些功能? 易于跟踪的数据流。 每个对象都有明确的角色,彼此分开。 易于测试。 事实是,我们的iOS项目显然缺少这些功能。 那么,什么迹象表明应用程序架构存在问题? 具有数千行代码的大规模视图控制器。 调试时迷路。 整个应用程序中越来越多的全局变量。 几乎无法测试。 毫不奇怪,这些迹象正在定义我们的项目。 因此,我们开始考虑其优缺点,开始搜索iOS中使用的不同架构模式。 经过大量阅读后,我们召开了会议,相互讨论并做出最终决定。 在会议结束时,每个人似乎都对名为VIPER的体系结构感到满意,这是我们的下一个体系结构。 什么是VIPER? Viper是一种将功能实现划分为一个模块的五个不同层的体系结构。 VIPER的每个字符代表一个不同的层。 V:检视 I:交互器 主持人:主持人 E:实体 R:路由器 每一层在模块中都有不同的作用。 在VIPER中,我认为要实现一个功能,例如从不同的部分构建乐高玩具。 让我们看一下每一层, 视图 视图是一个虚拟对象,大多数情况下会接收触摸事件。 代替MVC的具有数千行代码的大规模视图控制器,基本上所有与服务相关的代码和决策都不应存在于其中。 例如,当从用户接收到触摸事件时,视图对象应通知演示者,例如“我亲爱的演示者,已从用户接收到触摸,但我不知道该怎么办”。 主持人 我认为主持人是VIPER模块的核心。 模块中仅与所有其他层通信的层。 […]

Swift-MVC

MVVM , MVP和VIPER 几周以来,我一直在尝试了解有关iOS建筑模式的更多信息。 作为基本MVC的一部分,您可以找到有关MVVM,MVP和VIPER的一些不错的文章。 iOS架构模式 MVVM简介 使用VIPER架构iOS应用 我不确定他们。 而且我还是很困惑。 最后, Bohdan Orlov在他的文章中说:“ 没有灵丹妙药, 因此选择架构模式只是在您的特定情况下权衡取舍的问题 ”。 我也有类似的想法。 当您可以使用更好的MVC时,为什么将所有架构决策押注在某种时髦的流行模式上? MVC 我完全同意MVC被破坏的事实,因为View和Controller集成在同一文件中。 这是事实,使MVC成为谎言。 我还认为采用这种替代模式是因为Objective-C的功能不如Swift强大。 老实说,由于Swift,我们可以以其他方式使用MVC。 现在要容易得多。 扩展功能更加强大且显而易见。 结构和枚举现在是真实的模型结构。 易于理解和使用。 因此,如果使用MVVM , MVP和VIPER也很痛苦,为什么我们不简单地使用MVC ? 搜索图案 我想学习如何使用HealthKit Framework ,所以几天前开始了一个项目。 我正在使用该项目来发展和研究有关如何在Swift中使用MVC的想法。 距离完成还很遥远,但是我要坚持下去。 每天都在发展和更改代码。 Swift-MVC 线索之一是使用扩展来尽可能多地移出ViewController。 视图:UIViewControllerIt是View 。 所有View Life Circle都在那里,因此仅将View代码放入ViewController中。 控制器:扩展 将所有Delagate和Data Source代码添加到新的扩展文件中。 我们通常将View Controller内部拥有的所有逻辑扩展到一个新的扩展逻辑文件。 模型 结构和枚举。 将所有数据模式转换为新文件 通过这种结构,ViewController的长度为100行。 结论 […]

许多面孔的VIPER-第1部分

我最喜欢的是蓝色。 如此宏伟的生物……。 虽然如此,尽管他是一位伟大的自然爱好者,拥有所有的生物,但我对动物学的了解不足,不会让我进一步感到羞耻。 当然,我将谈论VIPER客户体系结构。 这个故事不是另一个“ iOS上的VIPER简介”或当前其他任何地方。 我相信我们有很多有关该主题的文章。 假定您了解该概念并具有一定的经验。 这也不是要将其与任何其他架构方法或架构进行比较。 我之所以选择它,是因为它确实代表了一种相对较好的“ 清洁体系结构”方法,并且遵循SOLID原则,可以承受。 我什至不会自己使用首字母缩写词,但是我想它使我们所有人都更容易理解该主题。 这个故事是关于以更多样化的方式展示VIPER,并展示其友好的面孔。 为此,我将首先处理一些神话,然后再讨论一些问题,考虑真正的问题,下一次我们将研究一个演示项目,该项目将作为一个可能的解决方案/答案。 误区1:VIPER有很多课程 可以? 您认为应该有几节课? 或更准确地说:您希望在代码中包含多少“ 单一职责原则” ? 也许所有这些都值得商bat。 即使采用SR原则,我们也可以很快就某个特定类的职责进行辩论。 例如,Microsoft在MVVM的定义中将视图模型视为胶水代码 ,作为业务逻辑和视图之间的中间人。 有人可能会争辩说,这种职责范围太广:处理事件,表示逻辑并将模型数据转换为易于查看的形式应视为单独的职责。 关键是:无论采用哪种体系结构,如果要使代码可维护且可靠,那么它将必须符合“干净代码”的许多范式,其中包括SR,小类,尽可能少的耦合,OO模式,全部资金。 ……所有这些都导致“……很多课程……” 。 误解二:僵硬,有很多样板代码 我记得几年前,当我第一次接手VIPER并接管现有项目时,这并不是最好的体验。 不是因为VIPER本身,而是因为与该概念的明显斗争。 我实际上看到了我在这里所说的一个神话: 每个模块都需要很多样板代码 很多时候,这些类都没有创建,只是为了“遵循方法” 开发人员努力地采用需求的逻辑以使其适应VIPER规范,这当然是行不通的,并导致一些严格的遵循并同时破坏它的怪异组合。当我说“破坏”时,我真的这意味着从破坏模块的封装为一的角度来看。 演示者或路由器双向连接太多对象,并使每个结构更改都成为真正的PITA。 我们将在稍后的演示项目中看到,如果您牢记这一点,则不必一定是这样: 您需要遵循的是VIPER所基于的SOLID和其他OOP原则,并据此,您应该创建适合您工作的类。 尽可能在协议扩展,抽象类甚至父类(如果不是太多!!)中实现样板 误区3:学习困难,仅适合高级开发人员 VIPER就像学习SOLID,TDD和OOP设计模式一样困难。 等等…但这还是我们要做的,不是吗? 好的,我也可以添加FRP 。 但是没关系,您的意思是:如果您想成为一名真正的高级开发人员,那么您必须学习上述知识,在这种情况下,您应该编写VIPER编码就像将比萨饼切成小块并撒上手工啤酒一样简单。选择。 是的,但是是初级人员……好吧,那么,如果您的初级同事没有采用VIPER风格,那么您的代码库将采用初级人员的技能组吗? 如果是这样,那么是的,VIPER仅适合高级开发人员。 但是,在我曾经工作过的大多数地方,我们都确保初中生由年长者通过代码进行培训,而并非相反:采用代码以适应最高的通用技能水平…… 误解四:与SDK规定的MVC基础架构配合使用时,效果不佳 我想我在面向模块的体系结构系列中再次揭穿了这一点,特别是在第6部分:超越MVC中。 您也有类似Uber RIB的框架,也可以解决该问题,但是我不得不承认,我个人认为不应将体系结构转变为即时框架解决方案,但这是重点。 误解5:不适合小型项目或原型 同样,在面向模块的体系结构系列中,我们可以看到VIPER类完全精简和小巧,因为大多数样板都在协议扩展中实现。 如果您遵循神话2中所述的方法,那么即使在小型项目和原型中,您也会发现它非常易于使用并且可以快速实现任何种类的特定功能。 […]

建筑设计模式:VIPER

抱歉,延迟了,但是在阅读了文章之后,我意识到NasaAPOD应用程序的当前安装方式对于实施VIPER并不是很有趣。 应用程序内部需要进行更多的交互,因此我回到了MVC,MVVM和MVP来全面实现相同的功能。 我所做的是添加了“收藏夹”功能,该功能只是将您的收藏夹移到表视图的顶部(实际上并没有保存任何内容)。 因此,至少MVP和VIPER现在更加有趣了。 我不确定的一件事是如何为单元设置演示者/交互者。 似乎应该有一个presenter / interactor组件,因为它还可以处理图像缓存。 但是我不能完全考虑如何确保我没有制造大量或可能泄漏的材料。 auth0.com教程肯定有很大帮助,所以我的VIPER应用程序很大程度上基于它。 我发现有些奇怪,但根据以前的工作是很正常的,是当用户点击某些内容时,它会通过演示者而立即返回视图。 例如,用户点击信息图标,视图告诉演示者用户点击,演示者返回查看告诉其发生点击并显示详细信息。 auth0网站还建议您不要手动创建所有文件(我做了🙃),他们建议使用工具为您生成文件。 因为我决定手动创建所有文件,所以我确实很难考虑应用程序所需的每个文件的所有交互和协议。 如此之多,以至于我把它抽了出来。 我所做的一件事有些不同,那就是该应用程序如何设置演示者和交互者。 auth0站点将这些变量公开,但是我想尽可能地保持所有私有。 所以我添加了attachView(viewInteractor:) , attachInteractor(interactor:)和attachPresenter(presenter:)函数。 您可以在下面看到完整的应用程序。 ashleyng /建筑设计模式 通过在GitHub上创建一个帐户来为ArchitectureDesignPatterns开发做出贡献。 github.com 到目前为止,这是最有趣的学习模式,并且肯定有很多设置需要使它起作用。 话虽如此,我现在不认为VIPER是我的选择。 我仍然不太了解Router部分,但是如果没有Router ,也许还有VIPER的味道? 比较MVVM和Viper架构:何时使用一种或另一种 TL; DR:设计良好的体系结构对于长期保持项目可维护性很重要。 在这篇文章中… auth0.com 视图,交互器,演示者,实体和路由器 视图 —界面层(UIKit文件)。 视图负责显示演示者要求他们执行的操作,并将用户输入回传给演示者 Interactor —负责从模型层(使用网络或本地数据库)获取数据,并且其实现完全独立于用户界面。 演示者 —查看逻辑以格式化要显示的数据。 这是MVVM中ViewModel完成的工作的一部分。 演示者从交互器接收数据,创建视图模型并将其携带到视图。 还对用户输入做出反应,请求更多数据或将其发送回交互器 实体 -模型层职责的一部分。 没有业务逻辑的纯数据对象。 由交互者管理。 路由器 -应用程序的导航逻辑。 示例:如果必须在iPad应用程序中重用相同的iPhone视图,则唯一可能改变的是视图的显示方式。 这使您的其他图层保持不变。 示例应用 视图 […]

VIPER🐍iOS的架构演进

很久以前,我们的iOS团队决定尝试VIPER体系结构模式。 周围的模式有很多变化。 随着时间的流逝,我们有各种各样的用例,而经典的VIPER架构(请参见下文)无法提供标准化的解决方案。 因此,我们根据需要修改了架构模式。 现在,我想分享我们的学习和改进。 对于那些不了解VIPER架构模式的人来说,这是一个简单的示例:假设您要显示应用程序中的项目列表。 通常,您只会创建一个包含该UIView的UIViewController 。 用VIPER方式进行操作意味着您将创建5个组件,这些组件全部由其负责。 视图:我想你们都知道这个组件是什么。 大多数时候,它是一个UIViewController ,有时只是一个UIView 。 它向用户显示UI元素。 演示者:他负责从Interactor中获取数据,从该数据创建视图模型以及更新View。 此外,他告诉路由器导航到另一个视图或显示另一个视图 。 Interactor: Interactor处理业务逻辑,例如从API或本地数据库中获取数据。 路由器:如前所述,他负责导航,这可能意味着显示模态视图控制器或将视图控制器推入导航堆栈。 线框:他连接了上述所有组件,并返回了准备使用的View 。 在下文中,我将使用VIPER堆栈作为上述所有组件的别名。 started我们开始的VIPER架构变体 看看我们开始的VIPER Architecture变体。

Swift中的VIPER设计模式,用于iOS应用程序开发。

设计模式是上帝给软件开发人员的礼物。 这些技术可最大程度地减少代码重复,防止高度耦合并标准化编写代码的通用方式,从而为开发软件时的重复出现情况提供了通用解决方案。 在这个故事中,我们将熟悉用于iOS开发的称为VIPER (视图,交互器,演示者,实体和路由器)的设计模式。 先决条件:在开始学习VIPER之前,请确保您了解建筑设计模式和委托模式。 什么是毒蛇? 毒蛇是一种实现“关注分离”范式的设计模式。 与MVP或MVC一样,它通常采用模块化方法。 一种功能,一种模块。 对于每个模块,VIPER具有五个(有时是四个)不同的类,具有不同的角色。 任何课程都不能超出其唯一目的。 这些课程如下。 查看:具有所有代码的类,用于向用户显示应用程序界面并获取他们的响应。 在收到响应后,View会提醒演示者。 演示者:模块的核心。 它从视图中获取用户响应并相应地工作。 仅用于与所有其他组件进行通信的类。 调用路由器进行线框图,交互器以获取数据(网络调用或本地数据调用),查看以更新UI。 交互器:具有应用程序的业务逻辑。 主要进行API调用以从源中获取数据。 负责进行数据调用,但不一定来自其自身。 路由器:进行电线成帧。 从演示者那里收听要演示的屏幕并执行该屏幕。 实体:包含交互器使用的普通模型类。 下面显示了VIPER的简单示意图 毒蛇的例子 我创建了一个简单的项目来解释毒蛇。 可以在GitHub上找到。 这是一个非常基本的应用程序,它显示了从外部API获取的新闻标题。 (:p没用)。 Viper是委托驱动的体系结构。 因此,不同层之间的大多数通信都是通过委派执行的。 一层通过协议调用另一层。 调用层从协议中调用函数。 侦听层符合该协议并实现该功能。 下面,我将解释如何在我的一个示例项目中实现VIPER。 我建议您在github中打开项目并阅读说明。 通讯协定 我为所有协议创建了一个单独的文件。 遵循命名约定来命名协议。 例如,“ viewToPresenterProtocol”。 因此,这是一个“协议”,将由“演示者”实施以收听“视图”必须说的内容。 PresenterToViewProtocol:演示者调用,View侦听。 演示者从该协议接收引用以访问View。 视图符合协议。 ViewToPresenterProtocol:查看呼叫,主持人收听。 InteractorToPresenterProtocol:Interactor调用,Presenter监听。 PresentorToInterectorProtocol:演示者调用,Interactor侦听。 PresenterToRouterProtocol:演示者呼叫,路由器监听。 应用流程 View具有对“ ViewToPresenterProtocol”的引用以访问“ Presenter”并符合“ PresenterToViewProtocol”。 […]