求求你,别再写上千行的类了好吗

2022-12-18 0 1,013

著眼于Java应用领域高质量控制技术,热烈欢迎高度关注

求求你,别再写上千行的类了好吗

译者:橙味菌

前段天数在对已近工程项目展开扩充的这时候,辨认出要更动的两个类长766行,对外开放了近40个publicUSB,我笑著把它给改完了。为的是避免这种的意外事件悲剧重演在我的身上,我真的有必要性写一则网志来让各阶层流程猿台湾同胞晓得标识符解构的必要性性

假如你身旁有两个类写上绝情的猿,很大要把该文转让给ta

为何类无法太长?

求求你,别再写上千行的类了好吗

类太长——读难通,扩充难通

读难通——间接用控制杆滚都得好几秒,即使是原作,天数长了更何况也无法厘清整座类,更别说是其它的听众扩充难通——两个Chlorophyta过多的USB,会让扩充那个类显得极度十分困难,不动绝情

类太长——可能将有输入输出标识符

这时CV技师发狠美苏

输入输出标识符,是多次重复标识符,通常出自于采用Ctrl+C,Ctrl+V来制造标识符的CV技师之手,输入输出标识符的危害性十分大:

输入输出标识符使方式、类太长,不简约输入输出标识符会导致收敛式修正(输入输出标识符须要发生变动时,每处Ctrl+V都须要修正)

类太长——大多是职能过多

求求你,别再写上千行的类了好吗

两个类对外开放几十个USB,绝对存在职能过多的问题,就像图中的Tom猫一样手忙脚乱,两个类的职能过多也有巨大问题:

违反设计原则——单一职能原则(单一职能原则要求两个类只实现两个职能,比如一只Tom只做扫地、擦桌、拖地中的一件事,而其它事的实现可以转移给史派克狗或肥胖女佣),违反了那个原则会导致收敛式变化、收敛式修正、类太长等标识符问题,还会让你的类无法扩充,甚至会让其它流程猿认为你不专业发散式变化(指引发此类修正的地方很多),假如两个类的职能很多,那它的扇入(调用者)很大很多,每个调用者的修正都有可能将让你那个类不得不随之修正,也是收敛式变化是说不管哪儿出了问题,你那个类都得遭殃收敛式修正(指此类修正引发修正的地方很多),相同的,假如两个类职能很多,那支撑它实现的下级,即扇出(被调用方)很大很多,假如此类逻辑发生发生变动,所有下级被调用者可能将都得随之修正,也是收敛式修正是说你那个类出了问题,不管哪儿都会遭殃无法扩充:假如你的两个类USB十分多,那它的子类怎么办?它的包装类怎么办?难道全部都要实现这么多USB,全部都要承担同样多的职能吗?扩充起来真的十分麻烦触发机关:【测试之怒】【运维之怒】

我已经写了几绝情了,怎么办?

求求你,别再写上千行的类了好吗

解构——抽取输入输出标识符

抽取输入输出标识符是将多次重复标识符抽取成两个独立的方式,之后再采用这段标识符时就不再须要Ctrl + C,Ctrl + V,而是间接调用对应的方式即可

这样做也可以缩短原方式,使原方式更加简约易懂

更值得一提的是假如这段标识符须要修正,也只需修正一处,而不是收敛式地到处修正

真是一箭三雕

采用IDEA展开输入输出标识符的抽取

1.找到多次重复标识符

求求你,别再写上千行的类了好吗

2.展开方式抽取 右键->选择解构->抽取->方式 (或者间接采用快捷键Ctrl + Alt + m)

求求你,别再写上千行的类了好吗
求求你,别再写上千行的类了好吗

3.自动检测出个别多次重复标识符的细微差别,有些标识符可能将只更动一两个变量,IDEA会自动检测出来,并在抽取方式时提醒我们,选择左侧Accept Signature Change(接受签名发生变动)可以使抽取的方式自动替换更多的多次重复点

求求你,别再写上千行的类了好吗

可以选择替换掉所有的多次重复标识符(竟然有18处)

求求你,别再写上千行的类了好吗

3.解构——更改方式签名假如你对抽取出的方式的名字、参数、返回值或是修饰符不满意,不要采用Ctrl + R 修正,IDEA提供了解构方式——更改签名(快捷键Ctrl + F6)

注意:方式的名字指的是方式做了什么,而非怎么去做,最好是 动词+名词 格式。比如:Tom.扫地() √ Tom.扫地With扫把() × Tom.用扫把扫地() ×

解构——转移成员变量+函数(转移职能)

将不应该由自己管理的成员变量和函数转移出去

那就要考虑两个问题:该转移谁?转移给谁?

来看两个图

求求你,别再写上千行的类了好吗
图中成员【偏A】被类【A】调用两次,而只被它所在的类【太长类】调用1次,因而应该转移给【A】去管理由于函数【偏A】与成员【偏A】的亲密度较高(只调用了【偏A】),因而应与【偏A】共进退,同去留,转移给【A】成员【偏B】和函数【偏B】也是相同道理职能1(函数【1】和成员【偏职能1】)和职能2(函数【2】和成员【偏职能2】)由于找不到可转移的合适的类,所以应抽取出两个新的类

注意,先决定移动哪个成员变量,然后再决定移动哪个函数

采用IDEA转移成员变量和函数

1.移动成员变量,鼠标选择成员变量->右键->Refactor->Move,然后选择转移至哪个类

求求你,别再写上千行的类了好吗

2.移动函数(与移动成员变量步骤相同)

解构——抽取类

当你辨认出要转移的成员变量和函数找不到合适的类时(转移职能却找不到下家),要想起来,这里是流程世界,而我们流程猿是类和对象的造物主,是这时候创建两个新的类,让它来替我们分担职能(成员变量和函数)了

采用IDEA抽取类

解构 选中要搬的成员变量和函数,右键->Refactor->Extract->Delegate(抽取两个委托者,委托他来管理这部分变量和函数,假如只有变量或只有函数,可以抽出参数对象Paramater Object或方式对象Method Object)不推荐抽取参数对象,因为一般参数对象是给参数多的方式用的(用参数对象取代一长溜的参数),而且假如成员变量抽取了也不会影响任何函数的话,那是无用对象了,不如间接把他们删除掉
求求你,别再写上千行的类了好吗

2.为新类起个名,选个包吧

求求你,别再写上千行的类了好吗

3.注意,抽取的函数和成员很大要符合两个原则,那是被抽取函数采用被抽取成员的次数很大高于剩余函数的次数,不然违反亲密性原则(成员应归于调用它最多的类,没有理由你用的比我多还让我来管理)

4.一些小问题

由于抽取的函数间接采用了未抽取的对象而导致解构失败,涉及到另两个解构(采用get方式而非间接采用私有成员变量),采用此解构即可解决

求求你,别再写上千行的类了好吗

来自:掘金 原文:

https://juejin.im/post/5e11dd736fb9a047f42e61ad

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务