iOS VIPER架构,谁必须实例化整个模块?
考虑到毒蛇的结构 我有两个模块,A和B。第一个模块A,通过presenter,想要执行一个必须在模块B中完成的动作,所以告诉它的线框去做。问题是,谁负责实例化整个模块(视图、交互者、演示者…)。我看到了一些不同方法的例子:iOS VIPER架构,谁必须实例化整个模块?,ios,architecture,Ios,Architecture,考虑到毒蛇的结构 我有两个模块,A和B。第一个模块A,通过presenter,想要执行一个必须在模块B中完成的动作,所以告诉它的线框去做。问题是,谁负责实例化整个模块(视图、交互者、演示者…)。我看到了一些不同方法的例子: 在应用程序的开头创建所有模块 在模块的线框中创建整个模块,因此在本例中,BWireframe Instantite的类方法将所有B模块都实例化 考虑到线框负责布线,它是否也负责创建其模块?我认为模块的入口是线框,因此我同意您的第二种方法 创建模块包括创建其所有对象,在我
- 在应用程序的开头创建所有模块
- 在模块的线框中创建整个模块,因此在本例中,BWireframe Instantite的类方法将所有B模块都实例化
考虑到线框负责布线,它是否也负责创建其模块?我认为模块的入口是线框,因此我同意您的第二种方法
创建模块包括创建其所有对象,在我看来这是一种浪费。TL;DR:我建议您使用类似的DI框架,并让它处理实例化 您可能不希望线框实例化VIPER模块(视图、演示器、交互器、数据管理器)中的所有内容的原因是,您将直接创建这些组件的依赖项 依赖性使软件不易更改:如果我们在打开/hats的情况下思考它,线框将通过了解视图和数据管理器而跨越至少两个独立层的边界 这迫使我们将线框视为一个通用的基础结构类:即应用程序最外层的内容 然而,这与线框的另一个(更真实的)职责相矛盾:导航。虽然这仍然是基础结构层,但它确实属于
UIKit
(-presentViewController:
等)中
所以,亲爱的,毒蛇的线框做得太多了
唯一明智的做法是将两种责任分开:
线框的权限内
模块A
的线框与模块B
的线框对话是不对的,不管
原因是模块A
现在将依赖于模块B
,导致紧密耦合:这会破坏模块的用途。有关此主题的更多讨论,请访问=]
希望这有帮助。- 使用此Xcode插件()自动创建和启动VIPER文件
- 阅读这篇文章,了解更多关于VIPER实例化的高级技巧(以及对上述插件的解释):
//ReusableView.swift
协议可重用视图:类{}
扩展可重用视图{
静态变量reuseIdentifier:字符串{
返回字符串(描述:self)
}
}
//UIViewController.swift
扩展UIViewController:ReusableView{}
//斯威夫特
伸缩板{
func instantialeviewcontroller()->T其中T:ReusableView{
将InstanceViewController(标识符为:T.reuseIdentifier)返回为!T
}
}
一般来说,我更喜欢线框来创建它的模块,如果我们在开始时创建所有模块,那么如果有很多模块,那么它就没有意义,所以我同意第二种方法更好。谢谢fatuhoku,这非常有启发性。在我的项目中,我有四个模块,对此我有些担心。我的下一步将是使用台风,在下一个版本:)再次感谢你。我第一次从这篇文章中了解了台风。。。。我现在的生活比以前好了1000倍。我欠你一杯啤酒@fatuhoku@SleepsOnNewspapers哈哈。很高兴我能帮上忙=]我只想记下使用台风的费用。我将它集成到我的项目中,我发现将代码重构为单元时它很有用。然而,它也增加了我的编译时间(通过CocoaPods)。我遇到的另一个问题是,当我想用Swift编写一些程序集时,我意识到由于语法问题,Typhone无法通过其协议注入对象。看看协议注入是否是用于实现VIPER的东西,然后这是需要注意的。谢谢Marcelo,我会看看这个,听起来很有趣!最后,我用同样的方法解决了这个问题,我使用了一个名为ModuleFactory
的协议来实例化整个模块。您可以在此处看到一个示例: