在面向对象开发中,是否存在某些类中存在一些或一部分代码重复,而却没有任何比较好的办法复用抽象出来?

9eN7y_sky


其实不管在什么开发过程中,代码重复是不可避免的,出现代码重复的原因主要有以下几个方面:

1.设计的不合理

理论上来讲,重复的代码都是可以进行封装使用的,如果代码中出现大量重复的代码,那么只能说明,在设计时,对函数或类的定义不清晰。一般来讲,如果在设计初期能够明确的定义类和函数的,一些公用的函数能够很容易的识别出来,代码中也就不会出现大量重复的代码。

2.项目的协作的复杂性

任何一个项目,很少是由一个人独立完成的,很多时候需要相互配合完成任务,而每个项目经理在分配任务时,往往是按照功能模块来分配的,这样会导致在实现过程中出现一些重复的工作。

3.代码优化的成本

在开发过程中,一个函数往往会有独立的逻辑,在实现完所有函数后,往往会发现有一些代码能够重用,因为哪怕在设计时做了很细致的工作,但是在实现时往往会有一些变化,也就不能完全预料到会有哪些代码能够重用,当完成工作后,很少有人愿意再去花时间优化代码,一个是费时费力,另一个是在修改时可能会引入新的BUG。

4.重复代码块中间的差异

在一些环境中,可能会有几处代码块的大部分内容相同,但是在中间的处理中有一些差异,比如,在一个for循环中,对数据进行累加,在A代码块中,当累加值大于某个阈值时需要终止累加;在B代码块中,当循环的值小于某个阈值时需要忽略该值;在C代码块中,需要对类成员的某个变量进行设置。在这个循环中,大部分代码是一样的,但是差异被重复代码块包裹,这些代码去重新封装往往会比较困难,而且,哪怕能够封装出来,当过一段时间再去看代码时,往往会增加理解的难度,也就得不偿失了。

从理论上来讲,代码复用是被大家所提倡的,但是,也需要具体问题具体分析,而不是一概而论。


天码行空


您好很高兴回答您的问题

面向对象开发中,封装、继承、多态是基本思想,但是要正确理解和运用,设计和编程过程中并非封装的越严实越好,这个取决于您的整体业务逻辑和编程风格,有时我们阅读别人代码,也应该体验到过度封装和抽象带来的弊端:

  • 开发效率的影响

  • 编程逻辑很难把控

总之,如果一些类中存在共性部分,那肯定可以将这部分共性抽离复用,但共性抽离的程度,取决于你的编程逻辑,有时候留有一部分不抽离出来,会有意想不到的效果。




码龙之光


答案是”有“,但原因不是没有办法复用抽象,而是值不值得。


类的基本特性是抽象、封装、继承,将相关的数据和方法组织为一个整体来看待。所以视角决定粒度,不同级别,项目、模块、类、函数,复用都会带来耦合性的变化,是动态的。


所以在实际开发工作中,要根据实际情况而定,没有固定的答案,拆分到什么粒度、复用到什么程度,都要考虑成本和收益的。


举个例子,一个判断字符串是否为空的逻辑:

if (str == null || str.isEmpty()) {}


另一个要考虑空格字符串的判断逻辑:

if (str == null || str.trim().isEmpty()) {}


如果一定要抽象出来封装成一个函数复用,也行,但是整个项目中只有那么几个需要考虑空格字符串的地方,是不是就让它有两个重复的函数好了。


Web应用架构师


有好的办法可以抽象出来,重复代码可以大致分为如下两种情况: 1、类型体系之内(父类型和子类型、子类型之间)存在重复逻辑代码 2、类型体系之外的重复代码 【类型体系内的重复代码处理】 1、如果重复代码属于类型本身操作(即应该是以实例方法存在),则很自然的应用重构技巧,公共代码往上走。如果Sub Type之间有这种重复代码,把重复代码迁移到DefaultAdatper中。 2、如果重复代码不属于类型本身操作(即应该是以静态方法存在),则需要判断一下这种静态代码的功能使用范围


分享到:


相關文章: