代码重构的方法

见:http://blog.csdn.net/u011889786/article/details/51865344

见:http://blog.csdn.net/weiky626/article/details/1602691



一.提取子函数

说白了就是一个大函数里,可以根据不同功能分成几个小函数,因为说不定,其他函数也可能会用到其中的函数

二.把大家都要用的方法放到父类中

    所有对象都要执行同一个方法,那就把这个方法放到他们的父类中

三.下移函数到子类

   子类特有的方法就没必要放到父类中,单独实现就可以了

四.封装固定的调用逻辑(有点模板模式的意思)

代码会按照一定的逻辑执行,要完成这个功能,需要执行A,在执行B,最后执行C,这些逻辑通常比较固定,在实现了A,B,C功能之后就要调用它们实现功能,但是每次调用这三个功能函数,必然会造成代码重复

不科学的代码如下:


[java] view plain copy
  1. Car audi = new Audi();  
  2. audi.closeDoor();  
  3. audi.start();  
  4. audi.speedup();  
  5.   
  6. Car bmw = new BMW();  
  7. bmw.closeDoor();  
  8. bmw.start();  
  9. bmw.speedup();  

科学的代码如下:

[java] view plain copy
  1. public abstract  class SmartCar extends Car{  
  2.     public final  void autoSpeedup(int speed){  
  3.         this.closeDoor();  
  4.         this.start();  
  5.         this.speedup();  
  6.         System.out.println("xcqw 加速到 :"+speed);  
  7.     }  
  8. }  

可以看到我们在autoSoeedUp函数中按照顺序调用了关门,启动,加速3个操作,这样在其他地方只需要调用autoSpeedup函数即可autoSpeedup函数实际上运用了模板方法模式,它封装了3个逻辑流程,并且这个流程不能被修改,但是子类可以重写这三个过程


五.使用泛型去除重复逻辑

[java] view plain copy
  1. /存储Int的集合类  
  2. public class IntArrayList{  
  3.     private int[] dataSet;  
  4.     public  IntArrayList(int size){  
  5.         dataSet = new int[size];  
  6.     }  
  7.     public int get(int position){  
  8.         return dataSet[position];  
  9.     }  
  10.   
  11.     public void add(int pos ,int data){  
  12.         dataSet[pos] =data;  
  13.     }  
  14.     public int size(){  
  15.         return dataSet.length;  
  16.     }  
  17. }  
  18. //存储String的集合类  
  19. public class StringArrayList{  
  20.     private String[] dataSet;  
  21.     public StringArrayList(int size){  
  22.         dataSet = new String[size];  
  23.     }  
  24.     public String get(int position){  
  25.         return dataSet[position];  
  26.     }  
  27.     public void add(int pos ,String data){  
  28.         dataSet[pos] = data;  
  29.     }  
  30.     public int size(){  
  31.         return dataSet.length;  
  32.     }  
  33. }  


可以看到IntArrayListStringArrayList都实现了get,add,size三个函数,他们的代码都是一样的,只是具体类型不太一样

所以我们可以抽象集合类SimpleArrayList的实现:

[java] view plain copy
  1. public class SimpleArrayList<T> {  
  2.     private T[] dataSet;  
  3.     public SimpleArrayList(int size){  
  4.         dataSet = (T[]) new Object[size];  
  5.     }  
  6.     public T get(int position){  
  7.         return dataSet[position];  
  8.     }  
  9.     public void add(int pos ,T data){  
  10.         dataSet[pos] = data;  
  11.     }  
  12.     public int size(){  
  13.         return dataSet.length;  
  14.     }  
  15. }  
[java] view plain copy
  1. //方法一  
  2. //使用IntArrayList  
  3. IntArrayList intArr = new IntArrayList(2);  
  4. intArr.add(0,3);  
  5. intArr.add(1,55);  
  6. System.out.println(intArr.get(1));  
  7. //使用StringArrayList  
  8. StringArrayList strArr = new StringArrayList(3);  
  9. strArr.add(0,"hello");  
  10. System.out.println(strArr.get(0));  
  11.   
  12. //方法二  抽出来之后  
  13. //使用SimpleArrayList 存储整型  
  14. SimpleArrayList<Integer> intArrayList = new SimpleArrayList<>(3);  
  15. intArrayList.add(0,3);  
  16. intArrayList.add(1,55);  
  17. System.out.println(intArrayList.get(1));  
  18.   
  19. //使用SimpleArrayList存储String  
  20. SimpleArrayList<String> strArrayList = new SimpleArrayList<>(3);  
  21. strArrayList.add(0,"hello , SimpleArrayList");  
  22. System.out.println(strArrayList.get(0));  

六.函数避免过多的入参

[java] view plain copy
  1. //复杂版  
  2. public void shareToMoment(String title,String content,String thumbUrl,String targetUrl,String creator){  
  3.     System.out.println("分享到朋友圈:文章标题为:"+title+"内容为:"+content);  
  4. }  
  5. //简单版  
  6. public static void shareToMoment(ShareData shareData){  
  7.     System.out.println("分享到朋友圈:文章标题为:"+shareData.title+"内容为:"+shareData.content);  
  8. }  
  9. public class ShareData{  
  10.     public String title;  
  11.     public String content;  
  12.     public String thumbUrl;  
  13.     public String targetUrl;  
  14.     public String creator;  
  15. }  
  16. ShareData shareData = new ShareData();  
  17. shareData.title ="平凡之路";  
  18. shareData.content = "我曾经失落失望失掉所有方向,直到看见平凡才是唯一的答案";  
  19. shareData.targetUrl = "http://WWW.xxx.com";  
  20. //分享到朋友圈  
  21. ShareData(shareData);  


七.重构的支柱-----转移函数,函数要职责分明

如果一个类中有太多行为(即函数),或一个类与另一个类之间有太多的函数调用,导致高度耦合,我就会考虑转移该函数到更适合的类型中。(说白了就是要函数要职责分明

[java] view plain copy
  1. /班级类  
  2. public class AClass{  
  3.     public List<Student> students = new ArrayList<Student>();  
  4.     public void add(Student student){  
  5.         sudent.add(student);  
  6.     }  
  7. }  
  8.   
  9. public class Student{  
  10.     public String id;  
  11.     public String name;  
  12.     public Student(String sId,String sName){  
  13.         this.id = sId;  
  14.         this.name = sName;  
  15.     }  
  16.     //很明现在这个其实是遍历Aclass ,所以应该放在AClass中比较好  
  17.     public boolean isBelongTo(AClass class1){  
  18.         for(Student stu :class1.students){  
  19.             if(stu.id.equals(this.id)){  
  20.                 return true;  
  21.             }  
  22.         }  
  23.         return false;  
  24.     }  
  25.   
  26.     @Override  
  27.     public String toString() {  
  28.         return "Student[ id= "+id+",name="+name+"]";  
  29.     }  
  30. }  
  31.   
  32. //更改之后Aclass  
  33. public class Aclass{  
  34.     public List<Student> students = new ArrayList<Student>();  
  35.     public void add(Student student){  
  36.         sudent.add(student);  
  37.     }  
  38.     //放这里就比较好  因为是遍历students  
  39.     public boolean contain(Student  student){  
  40.         for(Student stu :students){  
  41.             if(stu.id.equals(student.id)){  
  42.                 return true;  
  43.             }  
  44.         }  
  45.         return false;  
  46.     }  
  47. }  

八.状态模式---参考设计模式中的介绍

状态模式介绍


九.避免对象为null,就写个什么都不做的对象,如果是null就把这个给他

十.把功能拆开

不要把所有功能放在一个函数中。




另:

1.重命名:对类,接口,方法,属性等重命名,以使得更易理解


2.抽取代码:将方法内的一段代码抽取为另一个方法,

以使得该段代码可以被其他方法调用,这是重构中很重要很常用的,

此举可以极大的精炼代码,减少方法的代码行数


3.封装字段:将类的某个字段转换成属性,可以更加合理的控制字段的访问


4.抽取接口:将类的某些属性,方法抽取组成个接口,该类自动实现该接口


5.提升方法内的局部变量为方法的参数:这主要是在写代码的过程中会使用到


6.删除参数:将方法的一个或多个参数删掉


7.重排参数:将方法的参数顺序重新排列


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 去掉标题栏、状态栏、横屏

// 去掉标题栏supportRequestWindowFeature(Window.FEATURE_NO_TITLE);// 全屏、隐藏状态栏getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 横屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION…

Spring Boot 整合Mybatis (一)

2019独角兽企业重金招聘Python工程师标准>>> 新建spring-boot项目&#xff0c;相关依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><de…

x264 的 cache详解

在这里和下一级别的分析中有必要先讲一下这个h->mb.cache&#xff08;没法讲&#xff0c;就是cache!&#xff09;。 x264_macroblock_cache_load将参考帧中某位置的&#xff08;重建后&#xff09;数据保存进cache&#xff0c;供参考和反复使用。 x264_macroblock_cache_s…

同步/异步阻塞/非阻塞

平时开发中经常会听大家说到什么同步阻塞、异步非阻塞等等名词&#xff0c;这里我谈下自己对这两个名词的理解&#xff0c;仅仅是个人观点&#xff0c;并不一定正确。 1.阻塞/非阻塞 我认为判定阻塞还是非阻塞&#xff0c;取决于线程所做的操作是否需要将线程挂起等待。 举个…

Repeater的使用

1.页面代码 如果要分页&#xff0c;那么页面开头必须写&#xff08;<% Register Src"~/Controls/Page.ascx" TagName"Page" TagPrefix"uc1" %>&#xff09; 并且分页&#xff0c;页脚<uc1:Page ID"Page2" runat"server&…

springboot 整合 mongodb实现 批量更新数据

现需求&#xff1a;需要批量将1000个数据先查询在更新到mongodb&#xff08;如果查询不到数据&#xff0c;则添加数据&#xff09; 1&#xff1a;工具类BathUpdateOptions 1 import org.springframework.data.mongodb.core.query.Query;2 import org.springframework.data.mong…

【开题报告】基于微信小程序的校园资讯平台的设计与实现

1.选题背景与意义 随着移动互联网的快速发展&#xff0c;微信成为了人们日常生活中不可或缺的工具之一。在校园生活中&#xff0c;学生们对于校园资讯的获取和交流需求也越来越高。然而&#xff0c;传统的校园资讯发布方式存在信息不及时、传播范围有限等问题&#xff0c;无法…

三种Cache写入方式原理简介

三种Cache写入方式原理简介 在386以上档次的微机中&#xff0c;为了提高系统效率&#xff0c;普遍采用Cache&#xff08;高速缓冲存储器&#xff09;&#xff0c;现在的系统甚至可以拥有多级Cache。Cache实际上是位于CPU与DRAM主存储器之间少量超高速的静态存储器&#xff08;S…

Minor GC和Full GC

我们在日常开发中可能经常会听大家谈论GC&#xff0c;但是其实很多人对GC的种类其实并不是很了解&#xff0c;接下来我们简单介绍下Minor GC和Full GC及他们的区别。 MinorGC&#xff1a; 也可以叫作新生代GC&#xff0c;指的是发生在新生代的垃圾收集动作。因为新生代中对象大…

linux安装软件的几种方法

见&#xff1a;http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安装方式步骤&#xff1a; 1、找到相应的软件包&#xff0c;比如soft.version.rpm&#xff0c;下载到本机某个目录&#xff1b; 2、打开一个终端&#xff0c;su -成root用户&#xff1b; …

Android NDK MediaCodec在ijkplayer中的实践

https://www.jianshu.com/p/41d3147a5e07 从API 21&#xff08;Android 5.0&#xff09;开始Android提供C层的NDK MediaCodec的接口。 Java MediaCodec是对NDK MediaCodec的封装&#xff0c;ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要内容是&a…

leetcode-49-字母异位词分组(神奇的哈希)

题目描述&#xff1a; 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [[&quo…

【精心总结】java内存模型和多线程必会知识

内存模型 &#xff08;1&#xff09;java内存模型到底是个啥子东西&#xff1f; java内存模型是java虚拟机规范定义的一种特定模型&#xff0c;用以屏蔽不同硬件和操作系统的内存访问差异&#xff0c;让java在不同平台中能达到一致的内存访问效果&#xff0c;是在特定的协议下…

工作流 activity 视频教程 + redis 视频教程 百度网盘分享地址

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 云盘下载都没有密码&#xff0c;直接下载&#xff0c;解压有密码&#xff1a;chongxiangmengxiangjiaoyu&#xff0c; 解压完成后就可以…

快速解决 GRADLE 项目下载 gradle-*-all.zip 慢的问题

1、首先根据项目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 属性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序结构与控制流

1. 条件语句 if、else与elif语句用于控制条件代码的执行。条件语句的一般格式如下&#xff1a; if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要执行任何操作&#xff0c;可以省略条件语句的else和elif子句。…

webrtc 源码结构

apiWebRTC 接口层。包括 DataChannel, MediaStream, SDP相关的接口。各浏览器都是通过该接口层调用的 WebRTC。call存放的是 WebRTC “呼叫&#xff08;Call&#xff09;” 相关逻辑层的代码。audio存放音频网络逻辑层相关的代码。音频数据逻辑上的发送&#xff0c;接收等代码。…

mysql查询流程解析及重要知识总结

时光荏苒啊&#xff01;在过两个月我就工作满三年了&#xff0c;大学毕业的情景还历历在目&#xff0c;而我已经默默的向油腻中年大叔进发了。作为一名苦逼的后端工程师&#xff0c;我搞过一段时间python&#xff0c;现在靠java糊口&#xff0c;但后来才发现&#xff0c;始终不…

界面无小事(八):RecyclerView增删item

界面无小事(一): RecyclerViewCardView了解一下 界面无小事(二): 让RecyclerView展示更多不同视图 界面无小事(三):用RecyclerView Toolbar做个文件选择器 界面无小事(四):来写个滚动选择器吧! 界面无小事(五):自定义TextView 界面无小事(六):来做个好看得侧拉菜单! 界面无小事…

Failed to install Tomcat7 service 解决

见&#xff1a; http://blog.csdn.net/desow/article/details/21446197 tomcat 安装时出现 Failed to install Tomcat7 service 今天在安装tomcat时提示 Failed to install Tomcat7 service了&#xff0c;花了大半天的时间找到了原因&#xff0c;下面分享给大家&#xff0c;希望…