内容简介:在这篇文章中,我将重点解释一种设计模式(控制反转)和一种实践(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 年软件开发趋势
- 软件开发:敏捷开发模式,无论是产品还是运营都要懂
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Four
Scott Galloway / Portfolio / 2017-10-3 / USD 28.00
NEW YORK TIMES BESTSELLER USA TODAY BESTSELLER Amazon, Apple, Facebook, and Google are the four most influential companies on the planet. Just about everyone thinks they know how they got there.......一起来看看 《The Four》 这本书的介绍吧!