刚进公司的时候,经常听到老同事的告诫:DRY(Don't Repeat Yourself),著名的四人帮(GOF)大作《设计模式》的小标题是“Elements Of Reusable Object-Oriented Software”-可复用面向对象软件的基础。可复用可谓程序员写代码的一致追求。那么可以从哪些角度去思考代码复用呢?
变量级别的复用:
这主要涉及的是常量的复用,字符串抽取常量的重构技巧大部分程序员都会使用,但是很多同志往往会忽略多个类之间的常量重复,比方说,某个产品的类别,这在整个系统中都是统一的,这种情况下,使用一个Enum来表示这个类别,或者使用一个统一的常量类来管理所有的常量字符串或许是一个更好的选择。
方法级别的复用:
方法复用的前提是方法要小,功能要单一;你很难复用一个上100行的方法,因为每个方法总有自己独特的一部分逻辑,也很难从两个大方法中看出其中重复的逻辑。因此,抽取方法,把每个方法的功能做到足够单一,然后,你自然就能发现其中重复的代码,然后,删除重复代码,一了百了。另外,把方法变小,功能变单一之后, 你还会发现很多代码不应该属于当前类,这会帮助我们改善对象设计,从而发现多个类中的重复方法,进一步的去除重复。
类级别复用:
类复用主要就是2个手段:继承和组合,优先使用组合。通过对方法级别复用的追求可以一步步驱动出类级别的复用。在多个类中,通过Extract Method和Move Method的重构技巧,可以把一些方法聚合到一个类中,然后通过组合的方式共享给所有需要这些方法的类。另外,在类继承结构中,使用pull members up的重构技巧,把子类函数推上父类,在各子类中共享也是经常使用的手段。
库级别的复用:
即把自己开发的代码变成第三方库,这种类型的复用主要需要考虑是如何让别人更方便的使用自己的类库?在Java的世界中,第三方依赖库管理无疑是Maven的天下,因此把自己的类库打包放到Maven中央库是实现库复用的基本手段。我之前写过一篇如何使用Gradle把自己开发的类库部署到Maven中央库中(http://ningandjiao.iteye.com/blog/1846441), 在Ruby的世界,当然是Gem包了,node.js的世界就是npm,而Object-C的世界就是类库,总之,类库级别的复用已与代码无关,重要的是了解业界当前的生态系统,然后让自己的类库能够非常方便的被别人集成,另外,有点说明文档总是好的,帮助别人更容易的理解和使用你的类库。
软件级别的复用:
这个就是所谓的SaaS(Software as a Service)了,把自己的开发的功能以API的形式暴露给别人使用, 在公司内部,各个功能模块以这样的方式相互协作,最后整个公司的架构就是所谓的SOA(Service Oriented Architecture)了。做这个级别的复用其实就是API文档要详细,易懂,便于别人使用,同时最好API说明文档是可执行的,即别人可以直接在说明文档上验证自己对说明文档的理解,对于以REST形式开放的API接口,建议看看Swagger-UI(https://github.com/wordnik/swagger-ui), 至于其它形式的API接口,抱歉,我还没涉猎到。
分享到:
相关推荐
他认为,这包括改进设计方法、强化团队协作、提高软件复用以及发展更好的软件工程教育等。 这一观点引发了广泛的讨论和反思,其中Brad Cox的观点尤为突出。Cox不完全同意Brooks的结论,他主张通过建立强大的市场...
JeCat-Jabber(简称:JJ) 是一款完全由 PHP 开发的即时通讯软件。JJ 采用 Gtk2 图像界面库来实现用户界面。顾名思义 JJ 使用 Jabber 协议(XMPP) ,因此可以 和 包括 GTalk 在内...我的ID是sedhappy,欢迎通过jecat加我。
模块化设计允许代码复用,降低维护成本,同时提高软件的可扩展性和可维护性。C# 5.0中的异步编程模型(async/await)能帮助开发者编写流畅的并发代码,提高用户体验,尤其是在多线程和网络交互的应用中。 此外,...
以下是我根据标题和描述提炼出的一些关键点: 1. **宏定义的管理**:宏定义是预处理器指令,用于在编译时替换文本。良好的习惯是将所有宏定义集中在一个文件中,便于维护和查找,避免宏定义分散导致的混乱。 2. **...
7. **模板与STL(Standard Template Library)**:模板是C++的泛型编程工具,STL则是包含容器(如vector、list)、算法和迭代器的标准库,掌握它们可以提高代码的复用性和效率。 8. **Windows API**:虽然MFC提供了...
软件架构的定义在不同人眼中可能有所不同,有人认为它是组件及其交互,有人认为是关键决策的集合。层次化和关注点分离是架构设计的重要准则,同时,软件单元的粒度也是需要考虑的因素。 软件架构设计的挑战在于跨越...
要成为一名优秀的工程师,需要掌握多个层面的技能与知识,包括代码编写、系统设计、团队协作、持续学习等。...只有在这些方面都有良好的掌握,才能够在软件开发工作中脱颖而出,成为同行眼中的佼佼者。
JeCat-Jabber(简称:JJ) 是一款完全由 PHP 开发的即时通讯软件。JJ 采用 Gtk2 图像界面库来实现用户界面。...Linux 的多路复用 是 更稳定和安全的 多任务模式,从 PHP5.0 开始 多路复用 支持 Windows 平台。
中国作为世界第二大经济体,拥有庞大的市场需求和日益增长的技术需求,成为印度软件公司眼中的重要市场。通过在上海这样的国际大都市建立研发基地,印度软件公司不仅能接触到中国本土客户,还能利用上海作为国际化大...
《我眼中的面向对象方法和结构化方法 - CSAI_cn软件工程.mht》和《再探索结构化与面向对象的设计方法.txt》等文件,作者分享了个人视角下对这两种方法的理解,探讨了它们的结合可能性。实际上,很多现代软件开发实践...
用户眼中的软件性能通常体现在应用程序的响应时间、并发处理能力以及系统的稳定性上。而软件人员则关注代码优化、内存管理、数据库查询效率等因素。性能测试涵盖负载测试、压力测试、耐久测试等,广泛应用于电子商务...
例如,配置SCK引脚为复用推挽模式,MISO和MOSI引脚也为复用推挽模式,然后使能SPI的时钟源。此外,还需要设置SPI的工作模式(CPHA和CPOL)、数据传输顺序(MSB First或LSB First)和其他选项,如CRC校验等。 在实际...
总的来说,面向接口编程是提升软件设计质量的有效手段,它能够帮助我们构建模块化、松耦合的系统,促进代码的复用和维护。通过理解和熟练运用接口,开发者可以设计出更易于扩展和适应变化的软件架构。
2. 配置GPIO引脚为复用推挽或开漏模式,根据应用需求设置速度和上下拉电阻。 3. 初始化SPI结构体,设置模式(CPOL和CPHA)、数据大小、NSS模式等。 4. 调用SPI初始化函数,例如`SPI_Init()`,将配置好的结构体传递...
在用户眼中,互联网是一个虚拟网络(Virtual Network),而非多个异构网络的互联。用户通过主机上的特定软件,无法区分是与独立的物理网络相连还是与互联网相连。 - **程序员视角**:程序员不仅要看到虚拟网络,还...
这些类可能继承自一个更通用的`Employee`类,展示了C++的继承特性,使得代码可以复用并实现不同级别的员工角色。 4. `worker.cpp`:代表普通员工类的实现,可能包含了员工的基本信息如姓名、工号、工资等。 5. 一...
MVC是一种常见的软件架构模式,最初由Xerox PARC在20世纪80年代为Smalltalk-80语言发明,后来被广泛应用于各种编程语言和平台。MVC模式将应用程序分为三个核心组成部分:模型(Model)、视图(View)和控制器(Controller...
这种技术与业务之间的脱节,使得业务架构在技术人员眼中显得更为抽象和难以捉摸。 #### 二、中台之上:企业级业务架构的实现需要不断沟通和调整 企业级业务架构的成功实施离不开不断的沟通和调整。在这个过程中,...
人们觉得自己在 Perl 里可以有创造力,因为它们有表达的自由:他们可以选择是为计算机速度优化还是为程序员的速度优化,是冗长还是简洁,是选择可读性还是可维护性,或者选择复用性,移植性,接受性和传授性等等。...
《阿里开发手册》是一份由阿里巴巴技术团队编写的文档,它为开发者提供了详细的行为准则和技术指导,旨在保证软件开发的质量和一致性。在该手册中,有许多细节性的规则和实践建议,这些内容对于广大开发者而言是一份...