Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon 在MVVMCross中使用单例的缺点是什么


在MVVMCross中使用单例的缺点是什么


单例虽然有助于确保类的单个实例,但具有几个缺点,可以影响应用程序的可维护性和可扩展性,包括使用MVVMCross的应用程序。这是一些关键问题:

1。可检验性问题**

众所周知,单身人士很难测试,因为它们拥有状态并管理自己的生命周期。这使得编写不会无意间与网络或其他外部系统互动的单元测试具有挑战性。在MVVMCross中,测试对于确保视图模型和其他组件的可靠性至关重要,单例可以阻止有效隔离和测试个体组件的能力[1] [4]。

2。数据不一致和多线程问题**

在多线程环境中,如果不正确同步,单元子可能会导致数据不一致。这可能导致非确定性行为,因此很难调试问题。虽然可以制作单身线程安全,但这会增加复杂性,并且并不总是正确完成[2] [4]。

3。隐藏的依赖和耦合**

单例通过提供全球访问资源的点来鼓励隐藏的依赖关系。这可能会导致班级之间的紧密耦合,因为它们都取决于单顿的具体实现。在MVVMCROSS中,松散的耦合对维护干净的结构有益,单例可以通过难以更改或替换组件而不会影响整个系统来破坏这一原理[2] [3]。

4。违反牢固原则**

单例违反了几个坚实的原则:
- 单一责任原则(SRP):单例外,除了主要职责外,经常管理自己的生命周期,这可能会导致不必要的复杂性。
- 依赖性反转原理(DIP):高级模块不应取决于低水平的细节,但是对于单例,它们通常会依靠Singleton的具体实现[2] [3]。

5。可伸缩性和灵活性限制**

单例可以通过难以适应不断变化的要求来限制可扩展性。如果应用程序需要处理资源的多个实例或更改管理资源的管理方式,则单身人士可以成为瓶颈。在MVVMCROSS中,灵活性对于处理不同的平台和配置很重要,单例可以限制这些功能[7]。

6。国家管理挑战**

Singletons在应用程序的一生中具有状态,这可能使其难以有效地重置或管理状态。在需要经常刷新或更新状态的应用程序中,这尤其有问题[4]。

###单例替代品
为了避免这些缺点,开发人员通常将依赖注入作为一种更灵活,更可维护的选择。依赖注入允许通过通过构造函数或其他方式提供依赖性,而不是依靠全局实例[1] [7],可以松散耦合和轻松测试组件。在MVVMCROSS中,使用依赖注入可以帮助维持更易于测试和维护的干净,可扩展的体系结构。

引用:
[1] https://www.reddit.com/r/iosprogramming/comments/9zxqj1/why_i_i_cant_cant_singleton_singleton_why_it_it_is_is_bad_design/
[2] https://www.youtube.com/watch?v=x6gbdwfnin4
[3] https://www.davidtanzer.net/david's%20blog/2016/03/6-reasons-why-why-you-hy-you-should-avoid-singletons.html
[4] https://matteomanferdini.com/swift-singleton/
[5] https://forums.kodeco.com/t/why-i-cant-use-singleton-why-it-is-is-bad-design-pattern/56168
[6] https://www.reddit.com/r/androiddev/comments/8v2wfa/are_singletons_a_bad_practice/
[7] https://www.linkedin.com/advice/0/what-benefits-drawbacks-using-singleton-1e
[8] https://softwareengineering.stackexchange.com/questions/40373/so-singletons-are-are-bad-then-what