php – 避免构造函数服务Symfony中的长参数列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了php – 避免构造函数服务Symfony中的长参数列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2705字,纯文字阅读大概需要4分钟。
内容图文
![php – 避免构造函数服务Symfony中的长参数列表](/upload/InfoBanner/zyjiaocheng/797/0a943dd8c7d9485a9d11f08ffe871a41.jpg)
我一直在使用Symfony开发我的Web应用程序,但我一直遇到一个问题.因为我希望能够正确地对我的服务进行单元测试,所以我总是在服务的构造函数中出现过多的混乱.
理论用例
假设我需要一个允许我处理XML文件并将其内容保存到数据库中的服务.
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user>
<id>1234</id>
<username>Example User</username>
<email>user@example.com</email>
<usergroup>
<id>567</id>
<name>Example User Group</name>
</usergroup>
<permissions>
<item>ALLOWED_TO_CREATE</item>
<item>ALLOWED_TO_UPDATE</item>
<item>ALLOWED_TO_DELETE</item>
<item>ALLOWED_TO_view</item>
</permissions>
</user>
</users>
已经有很多想法需要注入到这个服务:
> DomCrawler(读取XML文件)
> UserRepository(获取现有用户)
> UserGroupRepository(获取现有的UserGroups)
> PermissionsRepository(获取现有权限)
> EntityManager(持续刷新新/更新的对象)
我正在使用的真正的XML文件包含更多的数据,这需要我注入更多的存储库和处理某些逻辑的其他服务.
解决方案1:使用Doctrine服务
将Doctrine服务目录注入我的服务并通过$doctrine-> getRepository(User :: class)获取存储库
优点
>显着减少参数的数量
缺点
>单元测试变得更加困难,因为我不知道服务访问了什么,这使得它们变得无用
解决方案2:使用setter注入
从构造函数中删除所有服务和存储库并创建setter方法,然后在services.yml中调用
services:
AppBundle\Service\MyImportService:
calls:
- [setUserRepository, ['@app.user_repository']]
优点
>可以说更容易阅读
缺点
>更多代码
>服务不再是强制性的,可能需要进行可选的验证
题
有哪些解决方案可以使我的服务中的参数列表在可读性和单元测试能力方面更易于维护?
有一长串论据甚至被认为是不好的做法?
解决方法:
在你的构造函数中有大量的参数是一个名为Constructor Over-Injection的code smell.这个代码气味通常表明该类承担了太多的责任,这意味着它违反了Single Responsibility Principle(SRP). SRP违规会导致维护问题,这就是您应该密切关注它们的原因.
尽管对Property Injection进行重构可能会减少构造函数参数的数量,从而减少构造函数中的混乱程度,但它并没有解决潜在的问题,即这个类变得过于复杂.因此,Property Injection不是Constructor Over-Injection的解决方案.
这种代码气味的解决方案是降低手头课程的复杂性.有很多方法可以做到这一点,但一个非常常见的方法是Facade Services refactoring:
Facade Service [is] closely related to 07004, but the main difference is that a Parameter Object only moves the parameters to a common root, while a Facade Service hides the aggregate behavior behind a new abstraction. While the Facade Service may start its life as a result of a pure mechanistic refactoring, it often turns out that the extracted behavior represents a Domain Concept in its own right.
优点:
>降低类的复杂性,从而解决潜在的问题
>防止取决于Doctrine服务(这是Service Locator anti-pattern的应用程序)
>介绍Domain语言的新概念和改进.
>防止物业注入(因为物业注入导致Temporal Coupling)
缺点:
> Facade Services可能不是正确的重构.替代方案是Domain Events和Decorators.
内容总结
以上是互联网集市为您收集整理的php – 避免构造函数服务Symfony中的长参数列表全部内容,希望文章能够帮你解决php – 避免构造函数服务Symfony中的长参数列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。