内容简介:在这篇文章中,我将重点解释一种设计模式(控制反转)和一种实践(YAGNI)如何降低软件项目失败的可能性。您可以立即开始应用这些技术。如果您是工程经理,如果您想降低功能边际成本的波动性,那么这是一个很好的解读
在这篇文章中,我将重点解释一种设计模式(控制反转)和一种实践(YAGNI)如何降低软件项目失败的可能性。您可以立即开始应用这些技术。
如果您是工程经理,如果您想降低功能边际成本的波动性,那么这是一个很好的解读
控制反转(IoC)
我的意思是依赖注入吗?真的不是,但我们可以使用依赖注入作为实现依赖关系之间的控制反转的工具。
IoC可以帮助改变依赖方向。它可以在组件A依赖于组件B的情况下提供帮助,现在您希望A不知道B的实现细节
一个未知的应用程序,有三个众所周知的层。
UI - > REST API - >数据库
放大REST API我们找到了UsersController类。我们注意到它是从/向SQLServer数据库读取和写入的。以下是C#的可能实现:
<font><i>//...</i></font><font> <b>public</b> <b>class</b> UsersController { <b>public</b> <b>void</b> postUser(User userInfo) { </font><font><i>//...</i></font><font> SqlCommand cmd = <b>new</b> SqlCommand(</font><font>"CreateUser"</font><font>, conn); cmd.Parameters.AddWithValue(</font><font>"@username"</font><font>, userInfo.name); bool isOk = cmd.ExecuteNonQuery() > 0; </font><font><i>//...</i></font><font> } } </font>
如果您认为上述解决方案不是一个好的设计,那么你是对的
在该示例中,UsersController被紧密耦合与SQLServer的执行情况。该postUser方法使得很难写测试(记住,单元测试不应该打数据库或外部服务)。随着应用程序的扩展,将对所使用的特定SQLServer库产生高度依赖性。如果有人决定按域区域拆分应用程序,可能会很麻烦
前面提到的A B组件,在这种情况下:
- A = UsersController
- B = .NET上的System.Data.SqlClient
如果我们应用Inversion of Control以使UsersController不依赖于特定的SQLServer实现,该怎么办?如果我们让REST API不知道我们正在使用什么持久层呢?
<b>interface</b> IUserService { <b>void</b> createUser(User userInfo); } <b>public</b> <b>class</b> UsersController { UsersController(IUserService userService){ <b>this</b>.userService = userService; } <b>public</b> <b>void</b> postUser(User userInfo) { <font><i>//...</i></font><font> <b>var</b> ok = <b>this</b>.userService.createUser(userInfo); </font><font><i>//...</i></font><font> } } </font><font><i>//...</i></font><font> <b>public</b> <b>class</b> SQLUserService : IUserService { <b>public</b> <b>void</b> createUser(User userInfo) { </font><font><i>//...</i></font><font> SqlCommand cmd = <b>new</b> SqlCommand(</font><font>"CreateUser"</font><font>, conn); cmd.Parameters.AddWithValue(</font><font>"@username"</font><font>, userInfo.name); bool isOk = cmd.ExecuteNonQuery() > 0; </font><font><i>//...</i></font><font> } } </font>
优点
- 我们的架构可以扩展。此外,我们减少了在现有课程中修改的必要性。开/关原则
- 测试很容易写。我们可以在测试UsersController时注入模拟UserService
- 业务逻辑没有耦合或依赖于任何持久性策略
YAGNI
意思是:你不需要它!
我认为每个开发人员都应该采用YAGNI作为他们的核心实践之一。这个原则可以帮助您避免过度工程和使用未使用的代码(不可触及)。它还可以节省您的工作。
一个有趣的小故事:
我在一个项目中工作,其中Software Architects决定用char数据类型代表数据库中的几乎所有布尔列。至少他们使用英语,true存储为“Y”,false存储为“N”。这有道理吗?当我问到如何构思神奇的解决方案时,他们回答说:
“通过这种方式,我们对第三种状态存在可能性持开放态度”。
我从来不知道真/假的东西如何能有第三种状态(也许他们想过量子比特)。正如您可能注意到的,这最终是一个非常糟糕的决定,并且后果遍布整个代码。我找到了类似的东西:
<b>if</b>(supportVisa ===“Y”|| supportVisa ===“y”){...
代码可读性受到影响,SQL查询也受到影响。
但这并不止于此。随着时间的推移,该软件将国际化添加到其用户界面中。一些配置和目录由客户端自己使用GUI应用程序提供。我们得到了一些布尔列的“S”和“N”(西班牙语中的S i和N o)。
代码真的不可维护。我不想谈论他们提出的解决方案
结论
根据Bob叔叔的说法,优秀的开发人员会尽量减少未做出的决策。不要在六个月内写下你认为有用的东西,而是等待六个月,看看你的架构,看看它有多少进化,然后做好工作。应用YAGNI。
您应该正确管理您的依赖项,控制反转将指导您。
我希望这些进入你的意识,并帮助你成为一个更好的开发人员。
“任何傻瓜都可以编写计算机可以理解的代码。优秀的 程序员 编写人类可以理解的代码。“ - Martin Fowler
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 云领软件,智享未来——昆明市软件开发云政策宣讲会暨华为软件开发云技术沙龙
- 如何看待软件开发 ?
- 京东敏捷软件开发套路
- 深度学习软件开发环境搭建
- [译] 2020 年软件开发趋势
- 软件开发:敏捷开发模式,无论是产品还是运营都要懂
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法技术手册(影印版第2版)(英文版)
(美)乔治·T·海涅曼//加里·波利斯//斯坦利·塞克欧 / 东南大学 / 2017-10-01 / 96.0
一起来看看 《算法技术手册(影印版第2版)(英文版)》 这本书的介绍吧!
URL 编码/解码
URL 编码/解码
RGB HSV 转换
RGB HSV 互转工具