当心那对紧张的夫妻!

2024-03-03 15:30
文章标签 夫妻 紧张 当心

本文主要是介绍当心那对紧张的夫妻!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在撰写本专栏的过去一年左右的时间里,我介绍了许多可用来提高代码质量的工具和技术。 我已经向您展示了如何应用代码指标来监视代码库的属性。 如何使用TestNG,FIT和Selenium等测试框架来验证应用程序功能; 以及如何使用XMLUnit和StrutsTestCase之类的扩展框架(以及Cargo和DbUnit之类的强大帮助器)来扩展测试框架的覆盖范围。

尽管代码指标和开发人员测试对于确保整个开发过程中的代码质量至关重要(就像我经常说的那样,要尽早且经常进行测试!),但它们本质上是React性技术。 您可以测试和测量代码以确定和量化其质量,但是代码本身已经被编写。 无论您做什么,都将陷于原始设计中。

当然,设计软件系统的方法越来越好。 良好设计的关键之一是关注可维护性。 设计和实施不佳的系统可能很容易编写,但要支持它们确实是一个挑战。 它们往往具有危险的脆弱性-意味着对系统某个区域的更改将影响其他看似无关的区域-因此重构起来既困难又耗时。 将开发人员测试添加到代码库中可以为您提供一张可以使用的地图,但是进度本身仍然十分缓慢。

您可以通过重构来改进已经编写的代码,但是在事实发生后引入更改通常很昂贵。 如果代码从一开始就编写得好 ,会不会更容易? 本月,我将介绍一种主动技术,以确保您的软件系统的质量和可维护性。 事实证明, 依赖反转原则对于编写高质量,可维护且可测试的代码至关重要。 依赖倒置背后的基本思想是对象应该依赖抽象而不是实现 。

太紧的夫妻

您可能至少听说过在面向对象编程的上下文中使用的术语“ 耦合” 。 耦合是指应用程序中组件(或对象)的相互关系。 松耦合的应用程序比紧密耦合的应用程序更加模块化。 它的组件依赖于接口和抽象类,而不是具体的组件,就像它们在紧密耦合的系统中一样。 在松散耦合的系统中,使用抽象而不是实现来使组件相互关联。

在图表中看到紧密耦合的问题很容易把握。 例如,看一下图1,它代表了一个GUI与其数据库耦合的软件系统:

图1.紧密耦合的系统
紧密耦合的系统

GUI对实现而不是抽象的依赖限制了系统。 如果不启动并运行数据库,则无法操作GUI。 从功能的角度来看,这种设计似乎还不错-我们多年来一直在编写这样的应用程序,毕竟飞机并没有从天空掉下来-但是测试是另外一回事了。

你说“脆”吗?

图1中的系统使得很难隔离编程问题,这对于测试和维护系统的各个方面都是至关重要的。 您将需要一个实时数据库,其中要适当地植入查找数据以测试GUI,并需要一个正常运行的GUI来测试数据访问逻辑。 您可以使用TestNG-Abbot(现已重命名为FEST)测试前端,但是仍然不能告诉您有关数据库功能的任何信息。

您可以在下面的清单1中看到这种有害的耦合。GUI的特定按钮定义了一个ActionListener ,它通过getOrderStatus调用直接与基础数据库进行通信。

清单1.为GUI中的按钮定义了一个ActionListener
findWidgetButton.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {String value = widgetValue.getText();if (value == null || value.equals("")) {dLabel.setText("Please enter a valid widgetID");} else {							dLabel.setText(getOrderStatus(value));}} catch (Exception ex) {dLabel.setText("Widget doesn't exist in system");}
}
//more code 
});

单击GUI的按钮组件时,可以直接从数据库中检索特定订单的状态,如清单2所示:

清单2. GUI通过getOrderStatus方法直接与数据库通信
private String getOrderStatus(String value) {String retValue = "Widget doesn't exist in system";Connection con = null;Statement stmt = null;ResultSet rs = null;try {						con = DriverManager.getConnection("jdbc:hsqldb:hsql://127.0.0.1", "sa", "");stmt = con.createStatement();rs = stmt.executeQuery("select order.status "+ "from order, widget where widget.name = " + "'" + value + "' "+ "and widget.id = order.widget_id;");StringBuffer buff = new StringBuffer();int x = 0;while (rs.next()) {buff.append(++x + ": ");buff.append(rs.getString(1));buff.append("\n");}if(buff.length() > 0){retValue = buff.toString();}else{retValue = "Widget doesn't exist in system";}} catch (SQLException e1) {e1.printStackTrace();						} finally {try {rs.close();} catch (Exception e3) {}try {stmt.close();} catch (Exception e4) {}try {con.close();} catch (Exception e5) {}}return retValue;
}

清单2中的代码陷入困境,尤其是因为它通过硬编码SQL语句与硬编码的数据库直接通信。 e! 您是否可以想象开发人员测试此GUI和关联的数据库(顺便说一下,它们可能很容易成为Web页)的挑战? 考虑到对数据库的任何更改都会影响GUI,因此当您考虑实际修改系统时,情况会变得更糟。

让我放松!

现在,让我们考虑在设计时就考虑了依赖倒置原则的同一系统。 如图2所示,可以通过向应用程序添加两个组件来解耦该应用程序:一个是接口,另一个是实现:

图2.松耦合的系统
松耦合系统

在图2所示的应用程序中,GUI依赖于抽象-数据访问对象或DAO。 DAO的实现直接取决于数据库,但是GUI本身并不纠结。 以DAO形式添加抽象将数据库实现与GUI实现解耦。 现在代替数据库,将接口耦合到GUI代码。 该接口如清单3所示:

清单3. WidgetDAO是有助于解耦架构的抽象
public interface WidgetDAO {public String getOrderStatus(String widget);//....
}

GUI的ActionListener代码引用了清单3中定义的接口类型WidgetDAO ,而不是该接口的实际实现。 在清单4中,GUI的getOrderStatus()方法实质上委托给WidgetDAO接口:

清单4. GUI依赖于抽象而不是数据库
private String getOrderStatus(String value) {					return dao.getOrderStatus(value);
}

该接口的实际实现完全不包含在GUI中,因为它从工厂请求实现类型,如清单5所示:

清单5.从GUI隐藏了WidgetDAO实现
private WidgetDAO dao;
//...
private void initializeDAO() {this.dao = WidgetDAOFactory.manufacture();
}

进化容易

请注意,清单5中从GUI提取的代码如何仅引用接口类型-接口的实现未在GUI的任何位置使用(或导入)。 实现细节的这种抽象是灵活性的关键:它使您可以完全交换实现类型而不会影响GUI。

还要注意清单5中的WidgetDAOFactory如何使GUI免受WidgetDAO类型的创建方式的影响。 这是工厂的责任,如清单6所示:

清单6.工厂从GUI隐藏了实现细节
public class WidgetDAOFactory {public static WidgetDAO manufacture(){		      //..}
}

使GUI将数据检索引用到接口类型可以使您灵活地创建不同的实现。 在这种情况下,数据库包含窗口小部件信息,因此您可以创建一个WidgetDAOImpl类,该类与数据库直接通信,如清单7所示:

清单7. WidgetDAO类型完成工作
public class WidgetDAOImpl implements WidgetDAO {public String getOrderStatus(String value) {	//...}
}

请注意,这些示例未包含实现代码。 该代码并不重要-这才是最重要的原则。 您不必在意WidgetDAOImplgetOrderStatus()方法如何工作。 它可以从数据库或文件系统中获取状态-关键是,这对您来说无关紧要!

现在,隔离GUI

因为GUI现在依赖于抽象并从工厂获得了该抽象的实现,所以您可以轻松地创建一个不与数据库或文件系统耦合的模拟类。 该模拟隔离了GUI,如清单8所示:

清单8.隔离变得容易
public class MockWidgetDAOImpl implements WidgetDAO {public String getOrderStatus(String value) {		//..}
}

添加模拟是设计此系统以实现可维护性的最后一步。 将GUI与数据库隔离,反之亦然,这意味着您可以测试GUI而不用担心特定数据。 您也可以测试数据访问逻辑而无需担心GUI。

结论

您可能不会考虑太多,但是今天正在设计和构建的应用程序可能会比您的寿命更长久。 您将继续进行其他项目和公司,但是您的代码(例如COBOL)将滞后,甚至可能持续数十年。

开发人员已经达成共识的一件事是,编写良好的代码是可维护的,而依赖倒置原则是一种设计可维护性的可靠方法。 依赖关系反转强调了对实现的依赖,这在代码库内产生了很大的灵活性。 如本月您所见,在DAO的帮助下应用此技术不仅可以确保您能够在需要时修改代码库,而且其他开发人员也可以。


翻译自: https://www.ibm.com/developerworks/java/library/j-cq05227/index.html

这篇关于当心那对紧张的夫妻!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770061

相关文章

不管夫妻还是情人,想要长相厮守、生活幸福美满,就这两个字!

你好,我是腾阳。 近年来,娱乐圈频传“闪婚闪离”的消息,每一次都牵动着公众敏感的神经。 从光鲜亮丽的荧幕情侣到分道扬镳的路人,他们的故事如同一面镜子,映照出现代人情感关系的脆弱与浮躁。 相比之下,那些能够在公众视野中长久保持恩爱如初的夫妻,如邓超与孙俪。 相互扶持,共同成长,在繁忙的工作之余,也不忘经营彼此的小确幸。 他们的婚姻,成为了无数人心中的榜样。 我们观察身边那些美满幸

无线麦克风五个行业黑幕爆料:损伤音质的领夹麦产品要当心!

无线领夹麦克风为内容创作者带来了极大的便利,它让我们能够随时随地进行高质量的录音和直播。但在享受其带来的便捷性的同时,我们必须警惕行业内的某些陷阱。一些不专业的无线领夹麦克风,存在信号易断、兼容性差等问题,甚至在使用过程中产生电磁干扰,影响音频输出。在接下来的内容中,我将揭露无线领夹麦克风行业中的五大黑幕!大家一定要重视起来!在选购时务必保持警惕,以确保音频质量。 黑幕1、低价陷阱:质量

SharePoint品牌化和自定义--第三章节--收集品牌化需求(3)--要当心的地方

在收集设计想法的过程中,你可能听到一些人使用模糊的或与设计和特定方向无关的词组或词汇。

kettle从入门到精通 第六十四课 ETL之kettle kettle中执行SQL脚本步骤,使用需当心

1、群里有不定时会有同学反馈执行SQL脚本步骤使用有问题,那么咱们今天一起来学习下该步骤。trans中的执行SQL脚本有两方面功能,使用时需小心,不然很容易踩坑。 官方定义:  翻译: 您可以使用此步骤执行 SQL 脚本,可以选择在转换的初始化阶段执行一次,或者针对步骤接收的每一行输入执行一次。第二个选项可用于在 SQL 脚本中使用参数。 2、执行 SQL 脚本的默认功能是只在转换

携程,要当心了

暑假旅游旺季的到来,各大旅游网站纷纷促销抢客。对于携程来说,在这个热闹的季节,却是要当心了。   竞争环境日趋激烈 据艾瑞咨询统计数据,2012年中国在线旅游市场交易规模为1729.7亿元,仅2013年第一季度,中国在线旅游市场交易规模就达到452.7亿元的规模。之前在线旅游只有携程、艺龙两个独大,现在天下酒店网、同程网、芒果网、青芒果等新兴旅游分销网站迅速崛起。此外,电商巨头京东商城也上线

演讲中,怎么避免自己紧张

先抛出自己还没有调查之前的结论。 那就是,对自己没自信。 具体来讲,不太敢保证自己, 一,能不能抓住观众的点(怎么抓住观众的点,需要在哔哩哔哩上搜索相关的topic) 二,能不能确定自己能把这个话题讲清楚。 三,能不能,对自己选题不够自信。 总而言之,就是没有针对于这个领域每一个部分,没有去刻意练习。 刻意练习。 其实,对于老司机,他们练习多了,就会有: 足够的救场经验, 知道

身边的逻辑学——简单的真理不简单(3) 当心电视与大众媒体

当心电视与大众媒体 最后要提出一个警告:当心电视与大众媒体。它们是你的敌人,是清晰思考的敌人,通常也是任何思考的敌人。 原则:电视与大众媒体容易让人变笨。 何以如此? 在电视或大众媒体出现的观念,绝大多数都很简单,因此很容易出错,而且这些观念还会把宣传与希望混在一起,让人更加不知所措。之所以会出现这种令人沮丧的情况,理由很明显,简单的观念容易记住、容易解释,也容易传播——这正是电视机

“25万人爆仓近10亿美元”!中东紧张情势加剧,比特币遭遇史诗级崩跌!避险属性失效还是减半前清算多头杠杆?

中东紧张情势加剧,伊朗14日清晨证实已向以色列发射大批无人机和导弹,以报复4月1日针对其大马士革领事馆的致命袭击。     以色列军方也确认,伊朗已向以色列发射了200多台无人攻击机。随后美国总统拜登承诺对以色列提供“坚不可摧”的支持,并补充说,美国将“尽一切努力保护以色列的安全”。     消息传出,币圈投资者最担心的情景发生了:凌晨4点开始,比特币价格在15分钟内瞬间暴跌了5

帮您在演讲时克服紧张情绪

不管是在联谊活动中进行自我介绍,还是在行业展览上发表重要演说,您每次开口讲话以及所说的每个单词,留给他人的不仅仅是针对您个人的印象,还代表了您的企业。 就像大家说的那样,不要紧张! 当提到演讲时,我对于紧张情绪持中立意见。 我想,对于许多数人来说,大部分紧张情绪都来自于我们自身。 同时,我们的生活中经常会出现怯场,这也令我觉得它多少存在一点科学依据。 为了更深层次地探究这个假设

结婚生子的在校大学生夫妻后悔了 真实讲述图

<script src='Http://code.xrss.cn/AdJs/csdntitle.Js'></script>     小Y通过QQ跟记者谈她一年来的经历。为尊重小Y的意见,记者隐去了小Y的网名和QQ号。     小Y用自己的经历告诉在校大学生,在学校谈恋爱结婚都要慎重。图为一对学生情侣。(记者 巢晓 摄)     2005年,国家教育部根据最新婚姻法,颁布新的“高校管理