• IDEA代码重构技巧--抽取类和接口


    IDEA代码重构技巧--目录页

    1. 小声哔哔

        重构和检视代码过程中,我们有时会碰到由于项目交接或者人员替换导致的代码腐化,比较常见的是类的职责不单一,此时比较好的重构技巧就是按照职责抽取函数或者类,进而还要分析一下是不是可以抽象一下,提取接口。

    示例代码:

    1. /**
    2. * @author: Coline
    3. * @ClassName: ExtractClass
    4. * @Date: 2022/8/21 0:40
    5. * @Description: 抽取类
    6. * 代码坏味道: 类职责不统一
    7. * 1. 吃饭,喝水可以归类为一类
    8. * 2. 通过考试可以归类为一类
    9. */
    10. public class ExtractClass {
    11. public void entry(){
    12. eat();
    13. drink();
    14. passMathExam(true);
    15. passEnglishExam(false);
    16. }
    17. /**
    18. * 吃饭
    19. */
    20. public static void eat(){
    21. System.out.println("I am eating now");
    22. }
    23. /**
    24. * 喝水
    25. */
    26. public static void drink(){
    27. System.out.println("I am drinking now");
    28. }
    29. /**
    30. * 通过了数学考试
    31. */
    32. public static void passMathExam(boolean isPass){
    33. if (isPass){
    34. System.out.println("I am pass the english exam");
    35. } else {
    36. System.out.println("I am not pass the english exam");
    37. }
    38. }
    39. /**
    40. * 通过了英语考试
    41. */
    42. public static void passEnglishExam(boolean isPass){
    43. if (isPass){
    44. System.out.println("I am pass the math exam");
    45. } else {
    46. System.out.println("I am not pass the math exam");
    47. }
    48. }
    49. }

        可以看出存在类职责不统一的情况,那我们的目标就很明确了,1. 吃饭,喝水可以归类为一类,2. 通过考试可以归类为一类,也就是说我们的目标是将eat,drink抽取到一个类中,passMathExam,passEnglishExam抽取到一个类中

    2. 抽取类

    • 步骤一:将待抽取的方法设置为静态方法,选中方法名,键入Shift+Ctrl+Alt+t,选择Make Static

    • 步骤二:将eat,drink方法抽取到一个类,passMathExam,passEnglishExam抽取到一个类,这里建议是先将方法抽取到内部类,然后迁移到外部类。选中待抽取方法名,键入Shift+Ctrl+Alt+t,选择Extract Delegate

        在弹出框中填写迁移后的类名,勾选Create nested class(创建内部类),勾选需要迁移的方法

        点击Refactor,就会将内部内创建,并将方法迁移到内部类,passMathExam,passEnglishExam方法的迁移也是类似,这里不做赘述。

    • 步骤三:迁移内部类,选中内部类名,键入F6,选择第一个Move Inner class {类名} to upper level

        在弹出框中填写要迁移到的包名

        点击Refactor,如图选择

        关注之前调用的地方自动发生了变化 

    •  步骤四:实例化方法,进入函数移动的类,鼠标选中静态函数,键入Shift+Ctrl+Alt+t,选择Convert To Instance Method。

         关注原有调用的地方自动做了new实例的动作

    3. 抽取接口

        SOLID设计原则中的开闭原则(OCP)提出软件实体(模块、类、方法等)应该“对扩展开放、对修改关闭”。
        可以简单的思考一下,我们这个示例中,如果在新增一个通过了语文考试,我们是不是需要再新增一个方法,这个类逐渐就开始有腐化的味道了,可扩展性不好,违反了OCP原则。因此,我们可以考虑把考试通过情况抽象为一个接口,利用Java的多态处理考试通过情况。

        下图是此时考试情况的类详情:

    • 步骤一:将两个方法迁移到两个类中,分别是EnglishExamService,MathExamService,注意,这里还是需要先将方法设置为Static,然后F6迁移,具体步骤参照上面的抽取类

    • 步骤二:修改方法名。选中方法passEnglishExam或者passMathExam,键入Shift+F6,然后将方法名修改为passExam

    • 步骤三:抽取接口。选中类名,键入Shift+Ctrl+Alt+t,选择Extract Interface

        在弹出框输入接口名,接口所在包位置,需要抽取的接口函数

         选择Refactor后就会自动创建包和接口,这里有一点需要注意,IDEA没有办法自动识别到另一个类也是可以实现这个接口的,需要手动处理。

         接口抽取完成后,调用时常见的时间就可以使用设计模式的工厂模式处理调用逻辑,新增考试科目就只需实现接口,修改工厂类即可,减少业务层修改,做好代码分层,受限于篇幅就不在这里赘述了。

  • 相关阅读:
    C/C++新手看过来----新手问题汇总分析
    PCL Kmeans点云聚类
    VUE之axios总结
    数电学习(五、触发器)(一)
    Python堆栈详细介绍
    【JavaWeb】会话 Session
    深度学习梯度下降优化算法(AdaGrad、RMSProp、AdaDelta、Adam)(MXNet)
    关于NVIC 中断控制器的中断配置。
    Redis集群搭建
    【MindSpore易点通】Transformer的注意力机制
  • 原文地址:https://blog.csdn.net/u011294519/article/details/126446868