refactoring Patterns(一):介绍

对工时评估的思考:当AI颠覆了coding效率 在AI时代,“人日”作为软件工时度量衡已然失效。开发的价值核心正从“编码实现”转向“深度思考”与“精准沟通”——即如何将人类的模糊需求精确地传达给AI。当最有价值的“思想工作”变得最难量化时,传统的项目管理范式随之动摇。我们必须超越对过程的算计,开始探索衡量思想、沟通与业务价值的新标尺。 阅读详情
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 这是关于refactoring思考的第一部分内容。本文将介绍refactoring的基本概念、定义,同时解释正确、安全进行refactoring需要坚持的几个原则。 介绍 代码太容易变坏。代码总是趋向于有更大的类、更长的方法、更多的开关语句和更深的条件嵌套。重复代码随处可见,特别是那些初看相似细看又不同的代码泛滥于整个系统:条件表达式,循环结构、集合枚举….信息被共享于系统一些关系甚少的组成部分之间,通常,这使得系统中几乎所有的重要信息都变成全局或者重复。你根本不能看到这种代码还有什么良好的设计。(如果有的话,也已经不可辨识了。) 这样的代码难以理解,更不要说对它加以修改。如果你关心系统体系结构、设计,或者是一个好程序,你的第一反应就是拒绝工作于这样的代码。你会说:"这么烂的代码,让我修改,还不如重写。"然而,你不大可能完全重写已经能够甚至是正在运作的系统,你不能保证新的系统能够实现全部的原有功能。更何况,你不是生活在真空,还有更多的投资、交付、竞争压力。 于是你使用一种quick-and-dirty的方法,如果系统有问题,那么就直接找到这个问题,便当地修改它。如果要增加一个新功能,你会从原来的系统中找到一块相近的代码,拷出来,作些修改。对于原来的系统,你想,既然我不能重头写过,而且它们已经在运作,让它去吧。然后,你增加的代码变成了下一个程序员咒骂的对象。系统越来越难以理解,维护越来越困难、越来越昂贵。系统变成了一个十足的大泥球。 这种情况是每一个人都不愿意碰到的,但是奇怪的是,这样的情景一次又一次出现在大多数人的编程生涯中。这是因为我们不知道该如何解决。 解决这个问题的最好办法当然是让它不要发生。然而,要阻止代码的腐化,你需要付出额外的代价。每次在修改或增加代码之前,你都要看一看手上的这些代码。如果它有很好的味道,那么你应该能够很方便地加入新的功能。如果你需要花很长的时间去理解原来的代码,花更长的时间去增加和修改代码。那么,先放下手里的活,让我们来做Refactoring。 什么是Refactoring? 每个人似乎都有自己的Refactoring的定义,尽管他们讲的就是同一件事情。在那么多的定义中,最先对Refactoring进行理论研究的Raloh Johnson的话显然更有说服力: Refactoring是使用各种手段重新整理一个对象设计的过程,目的是为了让设计更加灵活并且/或者更可重用。你可能有几个理由来做这件事情,其中效率和可维护性可能是最重要的原因。 Martin Fowler[Fowler]把Refactoring定义为两部分,一部分为名词形式: Refactoring(名词): 在不改变可观察行为的前提下,对软件内部结构的改变,目的是使它更易于理解并且能够更廉价地进行改变。 另一部分则是动词形式: Refactor(动词): 通过应用一系列不改变软件可观察行为的refactoring来重构一个软件。Martin Fowler的名词形式就是说Refactoring是对软件内部结构的改变,这种改变的前提是不能改变程序的可观察的行为,这种改变的目的就是为了让它更容易理解,更容易被修改。动词形式则突出Refactor是一种软件重构行为,这种重构的方法就是应用一系列的refactoring。 软件结构可以因为各种各样的原因而被改变,如进行打印美化、性能优化等等,但只有出于可理解性、可修改、可维护目的的改变才是Refactoring。这种改变必须保持可观察的行为,按照Martin的话来说,就是Refactoring之前软件实现什么功能,之后照样实现什么功能。任何用户,不管是终端用户还是其他的程序员,都不需要知道某些东西发生了变化。 Refactoring原则 Two Hats(两顶帽子) Kent Beck提出这个比方。他说,如果你在使用Refactoring开发软件,你把开发时间分给两个不同的活动:增加功能和refactoring。增加功能时,你不应该改变任何已经存在的代码,你只是在增加新功能。这个时候,你增加新的测试,然后让这些新测试能够通过。当你换一顶帽子refactoring时,你要记住你不应该增加任何新功能,你只是在重构代码。你不会增加新的测试(除非发现以前漏掉了一个)。只有当你的Refactoring改变了一个原先代码的接口时才改变某些测试。 在一个软件的开发过程中,你可能频繁地交换这两顶帽子。你开始增加一个新功能,这时你认识到,如果原来的代码结构更好一点,新功能就能够更方便地加入。因此,你脱下增加功能的帽子,换上refactoring的帽子。一会儿,代码结构变好了,你脱下refactoring的帽子,戴上增加功能的帽子。增加了新功能以后,你可能发现你的代码使得程序的结构难以理解,这时你又交换帽子。 关于两顶帽子交换的故事不断地发生在你的日常开发中,但是不管你带着哪一定帽子,一定要记住带一定帽子只做一件事情。 Unit Test 保持代码的可观察行为不变称为Refactoring的安全性。Refactoring工具用半形式化的理论证明来保证Refactoring的安全性。 但是,要从理论上完全证明系统的可观察行为保持不变,虽然不是说不可能,也是十分困难的。工具也有自己的缺陷。首先,目前对于Refactoring的理论研究并非十分成熟,某些曾经被证明安全的Refactoring最近被发现在特定的场合下并不安全。其次,目前的工具不能很好地支持"非正式"的Refactoring操作,如果你发现一种新的Refactoring技巧,工具不能立即让这种refactoring为你所用。 自动化的测试是检验Refactoring安全性非常方便而且有效的方法。虽然我们不能穷尽整个系统中所有的测试,但如果在Refactoring之前成功的测试现在失败了,我们就会知道刚刚做的Refactoring破坏了系统的可观察行为。自动化测试能够在程序员不进行人工干预的情况下自动检测到这样的行为破坏。 自动化测试中最实用的工具是XUnit系列单元测试框架,该框架最初由Kent Beck和Eric Gamma为Smalltalk社团而开发。 Eric Gamma对测试的重要性曾经有过这样的话: 你写的测试越少,你的生产力就越低,同时你的代码就变得越不稳定。你越是没有生产力、越缺少准确性,你承受的压力就越大...... 下面的片断来自Javaworld,两个Sun开发者展示了它们对单元测试的狂热以及展示了它们扩展单元测试来检查象EJB这样的分布式控件: 我们从来没有过度测试软件,相反我们很少做得足够。。。但愿测试是软件开发过程中关键但却经常被误解的一部分。对每一个代码单元而言,单元测试确保他自己能够工作,独立于其他单元。在面向对象语言中,一个单元通常,但并不总是,一个类的等价物。如果一个开发者确信应用程序的每一个片断能够按照它们被设计的方式正确工作,那么他们会认识到组装得到的应用程序发生的问题必定来自于把所有部件组合起来的过程中。单元测试告诉程序员一个应用程序' pieces are working as designed'。 我曾经认为自己是很好的程序员。认为自己的代码几乎不可能出错。但事实上,我没有任何证据可以证明这一点,同样我也没有信心我的代码就一定不会出错,或者当我增加一项新功能时,原先的行为一定没有遭到破坏。另一方面,我认为太多的测试于事无补,测试只能停留在理论之上,或只有那些实力强劲的大公司才能做到。 这个观点在1999年我看到Kent Beck和Gamma的Junit测试框架之后被完全推翻了。JUnit是XP的重要工具之一。XP提倡一个规则叫做test-first design。采用Test First Design方法,你在编写一个新功能前先写一个单元测试,用它来测试实现新功能需要但可能会出错的代码。这意味着,测试首先是失败的,写代码的目的就是为了让这些测试能够成功运行。 JUnit的简单、易用和强大的功能几乎让我立刻接纳了单元测试的思想,不但因为它可以让我有证据表明我的代码是正确的,更重要的是在我每次对代码进行修改的同时,我有信心所有的变化都不会影响原有的功能。测试已经成为我所有代码的一部分。关于这一点,Kent Beck在它的《Extreme Programming Explained》中指出: 简直不存在一个不带自动化测试的程序。程序员编写单元测试,因而他们能够确信程序操作的正确性成为程序本身的一部分。同时,客户编写功能测试,因而他们能够确信程序操作的正确性成为程序本身的一部分。结果就是,随着时间的推移,一个程序变得越来越可信-他变得更加能够接受改变, 而不是相反。 单元测试的基本过程如下: 设计一个应当失败的测试 编译器应当立刻反映出失败。因为测试中需要使用的类和方法还没有实现。 如果有编译错误,完成代码,只要让编译通过即可,这时的代码只反映了代码的意图而并非实现。 在JUnit中运行所有的测试,它应当指示测试失败 编写实际代码,目的是为了让测试能够成功。 在Junit中运行所有的测试,保证所有的测试全部通过,一旦所有的测试通过,停止编码。 考虑一下是否有其他情况没有考虑到,编写测试,运行它,必要时修改代码,直至测试通过 在编写测试的时候,要注意对测试的内容加以考虑,并不是测试越多越好.Kent Beck说: 你不必为每一个方法编写一个测试,只有那些可能出错的具有生产力的方法才需要。有时你仅仅想找出某些事情是可能的。你探索一半个小时。是的,它有可能发生。现在你抛弃你的代码并且从单元测试重新开始。 另一位作者Eric Gamma说: 你总是能够写更多的测试。但是,你很快就会发现,你能够想象到的测试中只有一部分才是真正有用的。你所需要的是为那些即使你认为它们应当工作还会出错的地方编写测试,或者是你认为可能会失败但最终还是成功的地方。另一种方法是以成本/收益的角度来考虑。你应该编写反馈信息物有所值的测试。 你可能会认为单元测试虽然好,但是它会增加你的编程负担,而别人花钱是请你来写代码,而不是来写测试的。但是WILLAM WAKE说: 编写单元测试可能是一件乏味的事情,但是它们为你节省将来的时间(通过捕获改变后的bug).相对不明显,但同样重要的是,他们能够节约你现在的时间:测试聚焦于设计和实现的简单性,它们支持refactoring,它们在你开发一项特性的同时对它进行验证。 你还会认为单元测试可能增加你的维护量,因为如果代码发生了改变,相应的测试也需要做出改变。事实上,测试只会让你的维护更快,因为它们让你对你所做出的改变更有信心,如果你做错了一件事,测试同时也会提醒你。如果接口发生了改变,你当然需要改变你的接口,但这一点并非太难。 单元测试是程序的一部分,而不是独立的测试部门所应完成的任务。这就是所谓的自测试代码。程序员可能花费一些时间在编写代码,花费一些时间在理解别人的代码,花费一些时间在做设计,但他们最多的时间是在做调试。任何一个人都有这样一种遭遇,一个小小的问题可能花费你一个下午、一天,甚至是几天的时间来调试。要改正一个bug往往很简单,但是要找到这样的bug却是一个大问题。如果你的代码能够带有自动化的自测试,那么一旦你加入一个新的功能,旧的测试会告诉你那些原来的代码存在着bug,而新加入的测试则告诉哪些新加入的代码引入了bug。 Small step Refactoring的另一个原则就是每一步总是做很少的工作,每做少量修改,就进行测试,保证refactoring的程序是安全的。 如果你一次做了太多的修改,那么就有可能介入很多的bug,代码将难以调试。如果你发现修改并不正确,要想返回到原来的状态也十分困难。 这些细小的步骤包括: 寻找需要refactoring的地方。这些地方可能在理解代码、扩展系统的时候被发现。或者是通过闻代码的味道而找到。或者通过某些代码分析工具。 如果对需要Refactoring的代码还没有单元测试,首先编写单元测试。如果已经有了单元测试,看一看该单元测试是否考虑到了你所面对的问题,不然就完善它。 运行单元测试,保证原先的代码是正确的。 根据代码所呈现的现象在头脑中反映该做什么样的refactoring,或者找一本关于Refactoring分类目录的书放在面前,查找相似的情况,然后按照书中的指示一步一步进行Refactoring。 每一步完成时,都进行单元测试,保证它的安全性,也就是可观察行为没有发生改变。 如果Refactoring改变了接口,你需要修改测试套件 全部做完后,进行全部的单元测试,功能测试,保证整个系统的可观察行为不受影响。如果你按照这样的步骤去做Refactoring,那么可能出错的机会就很小,正如Kent Beck所说:"I'm not a great programmer; I'm just a good programmer with great habits". 要求使用小步骤渐进地Refactoring并不完全出于对实践易行的考虑。 Ralph Johnson在伊利诺斯州立大学领导的一个研究小组是Refactoring理论的引导者和最重要的理论研究团体。其中William Opdyke 1992年的博士论文《Refactoring Object-Oriented Framework》是公认的Refactoring第一位正式提出者。在那篇论文中,Opdyk描述他对refactoring重构层次的看法: 通常,人们要么在按照增加到系统的特性这样一个高层次上,要么按照被改变的代码行这样一种低层次来看待软件的变化。Refactorings是一种重组织计划,它支持在一个中间层次上的改变。例如,考虑一下,refactoring把一个类的成员函数移到另外一个类。。。。 为了实现这样的intermediate level操作,Opdyke提出了原子atomic refactoring的概念,他指出: 下面列出的支持refactoring最终的分类是原子的;也就是说,它们是最原始级别的refactorings。原子refactoring创建、删除、改变及移动实体… … 高层refactoring通过这26个低层(原子)refactoring得到支持 论文中,Opdyke 首先证明在一定的前提之下,这些原子refactoring将不会改变程序的Observable behaviour。更高层的refactoring可以通过分解为这些原子的refactoring加以证明。Opdyke也证明了他所提出的高层refactoring如何在每一步原子atomic之后都符合后续原子atomic所需要的前提。 小步前进使得对每一步进行证明成为可能,最终通过组合这些证明,可以从更高层次上来证明这些refactoring的安全性和正确性。 Refactoring工具依赖于这些理论研究进行Refactoring。如果每个人能够按照这样的一小步一小步进行Refactoring,那么极有希望他的refactoring能够被正确地记录下来,为整个面向对象社团所用。同时,对他理论正确性地证明可以促使refactoring工具得到进一步的发展。 也许你会认为,随着工具的发展,程序员将变成Refactoring机器人。这样的看法是不正确的。 虽然使用一个refactoring工具能够避免介入使用手工方式可能产生的各种各样bug,减少编译、测试和code review。但是正如Smalltalk Refactory Browser的作者Don Roberts所说,Refactoring工具不打算用来代替程序员,程序员需要自己来决定什么地方需要refactoring,做什么样的refactoring。而在这一点上,经验是不可代替的。 Code Review和Pair Programming 要保证refactoring的正确性,还有一种很有用的方法就是进行Code Review。 Code Review原先一般都在一些大公司实行,他们可能聘请专家对项目进行Code Review,以发现代码中存在的问题,改良系统的设计,提高程序员的水平。 同样在refactoring过程中,我们也可以使用Code Review的方法。问题是,我们是否有足够的精力和人员配备来进行这样的Review呢? XP成功经验表明,Code Review不应当是只有大公司才能做的。甚之,XP中的Pair Programming其实就是对Code Review的极端化,它也更加适合于表达Code review在refactoring过程中所能起到的作用。Kent Beck说: 在每一对中有两个角色。一个合作者,把持键盘和鼠标,正在考虑该处所实现方法的最佳途径,。另一个合作者,则更多考虑策略性方面的问题: 这是完成工作的所有过程吗? 还有没有其他的测试套件还不能工作? 还有没有其他的方法可以简化整个系统,从而使得当前的问题不再出现? 使用这种方法进行refactoring,可以在一个程序员没有想到一个应当有的单元测试时,当一个程序员无法找到合适的Refactoring方法或者当一个程序员没有按照正确的方法进行refactoring时,另外一个程序员可以提出自己的观点和建议。甚至在极端情况下,当拥有键盘的程序员对如何完成这个refactoring没有概念时,另外一个程序员可以接过键盘,直接往下做。 XPChina的notyy认为Code Review不应当属于refactoring的原则之一。严格来你可以在不实行Pair Programming或者Code Review的情况下进行refactoring.但是由于refactoring的特殊性,它不是增加新的代码,而是修改已经存在、很可能已经被其他许多模块依赖的代码,所以Pair Programming在这里比一般的新代码更重要。从另一个方面来讲,如果你正在做big refactory,如refactor to Design pattern,此时Pair Programming更有助于交流双方对于被修整代码将refactor成为何种设计模式的意见。 因此,尽管这不是一条必要的原则,我还是把它作为原则之一进行描述。 The Rule of Three Don Roberts提出的The Rule of Three好像和Pattern社团对模式的验证十分相似: 第一次做某件事,你直接做就是了。第二次你做某件事,看到重复,你有些退缩,但不管怎样,你重复就是了。第三次你做类似的事情,你refactor。 关于作者 石一楹,现任浙江大学灵峰科技开发公司技术总监。多年从事OO系统分析、设计。现主要研究方向为Refactoring和分析模式。你可以通过shiyiying@hotmail.com和我联系。
 

代码太容易变坏,重复代码随处可见,特别是那些初看相似细看又不同的

代码泛滥于整个系统:

条件表达式,循环结构、集合枚举.....信息被共享于系统一些关系甚少的

组成部分之间,通常,这使得系统中几乎所有的重要信息都变成全局或者重复。

解决这个问题的最好办法当然是让它不要发生。然而,要阻止代码的腐化,

你需要付出额外的代价。每次在修改或增加代码之前,你都要看一看手上的这些代码。

如果它很好的话,那么你应该能够很方便地加入新的功能。如果你需要花很长的时间

去理解原来的代码,花更长的时间去增加和修改代码。

那么,先放下手里的活,让我们来做 Refactoring。 



一.Refactoring 介绍 

二.Refactoring 理由 

三.Refactoring 问题 

四.Refactoring 困难 

五.Refactoring 方法 

六.Refactoring 与软件设计 

七.Refactoring 场合与命名规则 



中文JAVA技术网重新整理发布

七天征服AutoSAR/SomeIP_04理解SoAD_LdCom_SD模块 本文深入解析了AUTOSAR平台下SOME/IP协议栈的架构设计与模块交互逻辑。重点剖析了SD模块(服务发现)和LdCom模块(通信适配层)与SoAD(Socket适配层)之间的复杂关联关系。文章通过详细配置表格和代码示例,阐述了服务注册发现机制、PDU路由控制策略、数据收发流程等核心功能,并形象地将三模块关系类比为"三极管结构"。特别强调了SD模块通过RoutingGroup实现通信路径的动态开关控制,以及LdCom模块在协议栈中的透传转发作用,帮助开发者理解配置规则背后的底层原理,提 阅读详情

相关推荐

verilog常用模块1——按键消抖模块详解

按键消抖模块key_filter 1. 原理介绍 如图,按键未按下时keys信号为高电平,按下则为低电平;通过检测keys信号电平,就可以判断按键状态。 但反作用弹簧会导致抖动现象,电平信号出现一段不确定波形 一般情况下,抖动的电平信号为1的持续时间不会超过20ms,只要通过对抖动波形的发生时长计时(计数),当为1的时长超过20ms,则可判定 进入了发生了按键按下/释放动作,并确定按键状态...

coin的博客 1万+

重构模式(一)---- 介绍

                 石一楹 (shiyiying@hotmail.com)        浙江大学灵峰科技开发公司技术总监        2001 年 12 月                这是关于refactoring思考的第一部分内容。本文将介绍refactoring的基本概念、定义,同时解释正确、安全进行refactoring需要坚持的几个原则。               

幽客独往 2348

记一次在JAVA中客户端使用axis调用webservice服务端出现的异常:Unmarshalling Error: For input string: ""

在使axis调用webservice服务端,参照网上给的demo: Call call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint);//设置服务请求路径 QName qn = new QName(name); call.setOperationName(qn); call.addParamet

kry1201的专栏 8082

C++课堂学习笔记

一、第一个C++程序 在IDE里新建一个project,跑起来。 IDE用法: refactor:动词,重构。 bug: 1、eclipse-->debug之后,报错:“无法打开文件“kernel32.lib””。 解决办法:在:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib目录下,复制kernel

monkey2016的博客 600

基于ABCDRez的激光谐振腔设计与热透镜效应仿真实践

本文详细介绍了如何利用ABCDRez代码包进行激光谐振腔设计与热透镜效应仿真。通过ABCD矩阵理论和高斯光束q参数,该工具能有效模拟热透镜动态变化对腔稳定性的影响,指导腔型优化与热补偿设计,是固体激光器预研与调试的高效辅助手段。

weixin_29093017的博客 290

稳压二极管选型指南:关键参数与电路稳定性优化

本文深入解析了稳压二极管在电路设计中的核心作用与选型要点。文章详细阐述了稳定电压、动态电阻、额定功耗等关键参数对电路稳定性的影响,并结合实战案例,提供了从需求分析到参数验证的系统化选型流程与优化策略,帮助工程师避免常见设计陷阱,实现电路稳定性优化。

weixin_29196891的博客 688

第2章 逻辑架构设计

业务需求是所有架构设计的依据。架构设计必然是从需求分析开始的。 1、怎么进行逻辑架构的分析? 答:解决思路是“粗 – 细 – 粗”。首先从整体、大局、宏观的角度去思考问题,进行逻辑架构分析。 (1)粗 1)从需求文档的目录章节中分析 通过阅读目录,了解各章节、功能模块的划分,通过功能模块中的功能命名,猜测功能背后的内容;从而对整个系统 有一个整体的、直观的认识 2)从需求文档的概述部分分析 通过概述了解客户的建设目标,根据建设目标为每个功能设定优先级(不能让客户设定优先级),实...

wyz191的专栏 8226

【仿真】Carla Python API实战:从零搭建自动驾驶测试环境

本文详细介绍了如何使用Carla Python API从零搭建自动驾驶测试环境。通过Carla仿真平台,开发者可以构建高度逼真的城市环境和车辆物理模型,利用Python API实现传感器配置、数据采集、场景构建及自动驾驶算法集成。文章还分享了实际项目中的调试技巧和性能优化经验,帮助读者快速掌握自动驾驶仿真测试的核心技术。

weixin_29050513的博客 217

《重构:改善既有代码的设计》读书笔记(上)

重构:改善既有代码的设计

行走 1477

Test-Time Adaptation Induces Stronger Accuracy and Agreement-on-the-Line

TTA不管是否提高了OOD的泛化性都增强了线性的趋势,TTA的初始目的是为了增强OOD的表现,一个人可能会觉得TTA使得ACL更强的原因是他消除了ID和OOD之间的差距,因此所有模型间ID vs OOD的准确率接近于y=x这条线,但是实际上这个解释不能够反映我们的经验发现,因为虽然TTA将分布之间的偏移简化为一种放缩的分布,但是这个放缩的因子幅值可能很大,也就是α<<1但是r>>1,这就会导致很偏离y=x这条线,而且理论分析也是,虽然ID和OOD的差距很大,但是线性关系还在。

m0_62673638的博客 149

无人驾驶Autoware导读

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对无人驾驶Autoware介绍做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 2398

重构模式7

refactoring Patterns:第七部分 内容:Refactoring 应用的场合Refactoring和命名参考资料关于作者相关内容:该系列的其他部分

xxcc的专栏 1258

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3231

Refactoring to Patterns 读书笔记(一)

应用 Create Methods 模式代替构造器(constructor)在面向对象的语言中,类的构造都是通过类的构造器完成的。但是OOP技术经过这么多年的发展,发现直接把构造器暴露给客户使用,在实践中并非一个很好的技术方式,故此各种 Factory 模式应运而生。就 Java 语言而言,构造器的缺点或者限制至少有如下三点:1.应为构造器的名字是不能随意选择的,只能和类名保持一致。因

I SEE STARS 1591

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

书评: Refactoring to Pattern

[color=red][b]请注意:本文的版权归作者所有,如转载请注明出处。[/b][/color] 陆陆续续又看了一些技术书,加上最近工作任务繁重,实在没时间写技术类的博文,计划断断续续写一些书的阅读评论。今天先写一本, 最近阅读的书并不都是最新的,因为些书的确是需要花时间反复研读,仔细思考的,例如关于设计模式的书。 Refactoring to Patterns就是这样一本书...

一夜清粥 223

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

把重构看完了

开始看《Refactoring to Patterns》了。在译者序中,译者这么说:{从本书的第一个重构直到最后一个,一切都显得那么自然;作者给出的每一个建议,每一个告诫,每一次小的 改动,给我的感觉都是水到渠成。有句话叫“绚烂之极归于平淡”,用来形容重构,真是再适合不过了。}。这种感觉正是我在看重构中的感觉,一切都是那么地自 然。太自然了,就显得有些失望,呵呵。一部平淡无奇的电影,尽管它是真理

Kisser Loves C++ 903

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

冬眠结束

整个寒假就像是在冬眠,春节时外面隆隆的炮声也无法赶走睡神对我的控制。就在吃、睡、再吃、再睡……的循环中长了8斤,基本达到了老爸的“喂养”目标,但还是没有达到130斤这个历史最高值,带着2斤的遗憾和依然惺忪的睡眼回到了阴冷潮湿的cs。又开学了…… 还别说,一开学,人马上就精神了,这两天在看《Refactoring to Patterns》,看到里面一句话,很有感触: To...

weixin_30780649的博客 173

每日一书:《设计模式》三问法阅读版

为什么最常用?✅ 数据库连接池:全局只需要一个✅ 日志记录器:全局只需要一个✅ 配置管理器:全局只需要一个✅ 缓存管理器:全局只需要一个# 数据库连接池(单例) classDatabaseConnectionPool: _instance = None。

mbzx10的博客 473

refactoring Patterns第七部分

虽然refactoring几乎可以随时进行,然而,按照我们关于两顶帽子的原则,在某些场合下,refactoring的介入显得更加实际、有意义、富有成效。另外,在最后进入Refactoring实践之前,我把Kent Beck和Martin Fowler给我们的忠告和建议放在这里。这些内容,特别是Code Smell和命名规则不但对我们进行refactoring具有很强的实践意义。同时,他们也促使

flyelf的专栏 1005

【重构获得模式 Refactoring to Patterns】

现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点,然后在变化点处应用设计模式,从而更好地应对需求的变化”。“什么时候、什么地点应用设计模式”比“理解设计模式结构本身”更为重要。

代号1998的专栏 1538

refactoring Patterns:第二部分

refactoring Patterns:第二部分为什么要 Refactoring  为什么要去改变已经可以正确运行的软件?这样的改变是否影响到我们的设计,从而进一步改变我们对于面向对象系统进行设计的方法和思路?本部分试图回答这些问题。Refactoring虽然需要更多的"额外工作",但是它给我们带来的各种好处显然值得我们做出这样的努力:简化测试一个好的Refactoring实

flyelf的专栏 966

refactoring Patterns:第三部分

本文紧接第二部分,继续讲述应用 refactoring 应该考虑的问题。任何一种技术都可能有它自己的麻烦。但是往往在我们使用一种新技术的时候,可能还不能深入到发现它带来的问题,正如Martin Fowler所说:在学习一种能够极大提高生产力的新技术时,你很难看到它不能应用的场合。他把Refactoring的情景和面向对象出现使得情景相比较:情况恰如10年前的对象。不是我不考虑对象有限制。只

flyelf的专栏 1040

refactoring Patterns:第一部分

refactoring Patterns:第一部分       这是关于refactoring思考的第一部分内容。本文将介绍refactoring的基本概念、定义,同时解释正确、安全进行refactoring需要坚持的几个原则介绍代码太容易变坏。代码总是趋向于有更大的类、更长的方法、更多的开关语句和更深的条件嵌套。重复代码随处可见,特别是那些初看相似细看又不同的代码泛滥于整个系统:条件表达

flyelf的专栏 1085

《Refactoring to patterns》

同学推荐的一本书,看完觉得挺不错的,作者的一个重要思想是应当在出现性能、复杂度较高难于维护等问题时,利用patterns对代码进行重构。和《Refactoring》一书类似,全书对于重构过程的描述非常细致,不同的是书中示例都是作者的经验结晶,重构过程浓缩着作者对于模式的深刻理解,读起来更为生动、自然。实践和理论相结合,是计算机这行必须遵循的一个原则,如果不能像书中所述那样细致的一步一步进行重构,就

飞光流影 1025

Refactoring Patterns (Second Part)

为什么要 Refactoring 石一楹 (shiyiying@hotmail.com)浙江大学灵峰科技开发公司技术总监2001 年 12 月为什么要去改变已经可以正确运行的软件?这样的改变是否影响到我们的设计,从而进一步改变我们对于面向对象系统进行设计的方法和思路?本部分试图回答这些问题。Refactoring虽然需要更多的"额外工作",但是它给我们带来的各种好处显然值得我们做出这样的努力:简化

glietpku的专栏 774

refactoring Patterns:第四部分

任何一种技术都不是万能的。正象设计模式,合理的运用可以极大地提高设计的效率和美感,再不适当的场合运用就会产生所谓的反模式。我们的refactoring亦然。但是,作为一种强有力的设计演变工具,refactoring值得我们付出努力。不能因为对新技术的恐惧而放弃这样的工具,我在这里对可能出现抗拒情绪的一些问题进行了解释。不应 Refactoring 的场合程序原型当你原型化一个系统时,你

flyelf的专栏 1046
上一篇: 关于数据库连接池
下一篇: 步入J2EE架构和过程(2)
java169
博客等级 码龄19年 27粉丝 2568原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值