该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

1

大多数人都会说,方法不能太长,但也不能定死,要具体问题具体分析。

再追问一下,有人会说,不超过200行,100行,50行,30行都有。

另有人说,面向对象风格的可以短些,面向过程风格的可以长些。

也有人说,一个方法不超过一屏幕就行(姑且不论显示器大小,字体大小和分辨率问题)。

先摘录一段Martin Fowler《重构》P110-P111 中的一段话:

人们有时会问我,一个函数多长才合适?

在我看来,长度不是问题,关键在于函数名称和函数本体之间的语义距离(semantic distance)。

如果提炼动作(extracting)可以强化代码的清晰度,那就去做,就算函数名称比提炼出来的代码还长也无所谓。

说了直白点,函数名是干什么,函数体是怎么干。

当 2 者不是那么能容易分辨出来时,就需要提炼出函数来,让代码更好懂。

既然大师都说了,长度不是问题了吗,那干嘛还要追究函数长度规范呢?

其实大师讲的是对于懂得编程之道的人而言,不用关心长度,因为小函数是必然的结果。

但在开发实践中,适当的函数长度限制值,可以给予我们警示,为什么这个方法写长了?哪里不对劲了?

对于这个问题我的回答是:Java函数不应超过15行。

为什么定这个数呢?

一方面,这个是基于多年开发实践的总结。

15行其实已经是一个比较宽松的标准,开发人员稍加培训就可以实际贯彻,而符合这个标准的函数也能达到良好的可读性。

2

另一方面,这是基于对函数复杂度和代码行数之间关联关系的认识。

我采用一个简单的数学公式:

方法复杂度 >= 代码行数^2

以下为了简化,只以最低增长方式,平方数进行计算。

当函数行数到达10行以上,函数复杂度就开始大幅度攀升。

当代码行数达到20行时(复杂度400),其复杂度已经是14行时(复杂度 196)的2倍。

因此我将代码规范定在15行。

下面我们运行此公式,来分析一下提炼小函数的好处。

例如,有1个100行的函数,分解为11(含自身)个10行的函数。

原复杂度= 100^2=10000。

分解后复杂度= 11×(10^2)= 1100。

分解后的复杂几乎是分解前的 1/9,几乎降低了1个数量级。

这就解释了为什么长方法分解之后,可维护性大幅度提高。

也就无怪乎有同学表示维护1000行以上的函数,有种生不如死的感受。

java方法建议不超过多少行,Java方法不应超过15行相关推荐

  1. java设计建议植物大战僵尸_基于Java的游戏设计之植物大战僵尸

    植物大战僵尸这款游戏相信大家或多或少都玩过,那么大家有没有想过自己尝试着做一下植物大战僵尸的游戏设计呢.本文将基于Java语言为大家展示如何开发出植物大战僵尸游戏的简易版本,主要内容包括规则.对象.功 ...

  2. Java方法01 方法(函数)定义、调用、值传递、重载、命令行传递参数

    Java 方法的定义.调用.值传递.重载.命令行传递参数 1. 什么是方法? 2. 方法的定义和调用 3. 值传递和引用传递 4. 方法的重载 5. 命令行传递参数 6. 可变参数(输入参数的数量不确 ...

  3. Java学习第八天<什么是方法><方法的定义和调用><方法的重载><命令行传参><可变参数><递归详解>

    什么是方法 System.out.println(); 调用系统类里的标准输出对象(out)中的方法println public class Demo01 {//main 方法public stati ...

  4. 编写高质量代码:改善Java程序的151个建议 (第1章 Java开发中通用的方法和准则)

    第1章 Java开发中通用的方法和准则 The reasonable man adapts himself to the world;the unreasonable one persists in ...

  5. java学了之后老忘_老程序员的建议,零基础学java,常见的误区和解决方法

    写一篇经验分享的文章,现在很多人学习java 第一,觉得java很难, 第二,觉得java 找工作不好找, 第三,也有人说java饱和了, 现在确实是行业的要求越来越高了, 早在07年的时候把java ...

  6. 《Effective Java》阅读体会之四--通用方法(建议覆盖toString,compare排序的比较)

    1. Object的toString方法返回的格式是 类名+@+散列码的十六进制表示.toString约定我们必须覆盖这个方法. 例如在PhoneNumber的toString方法里可以 写成 区号- ...

  7. java 俄罗斯方块消除整行,帮忙看下我的俄罗斯方块满行删除方法,为嘛一次只能删除1行。。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //满行删除方法 void deleteFullLine(){ int full_line_num = 0; int k = 0; for (int i= ...

  8. java 俄罗斯方块消除整行_帮忙看下我的俄罗斯方块满行删除方法,为嘛一次只能删除1行。。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //满行删除方法 void deleteFullLine(){ int full_line_num = 0; int k = 0; for (int i= ...

  9. linux运行java程序引用jar包,ubuntu下java 命令行引用jar包的方法

    推荐文章 Ubuntu常用快捷键总结 桌面常用快捷键 Alt + F1:聚焦到桌面左侧任务导航栏,可按上下键进行导航 Alt + F2:运行命令 Alt + F4:关闭当前窗口 Alt + Tab:切 ...

  10. 一文简单理解《Effective Java》建议

    考虑用静态工厂方法替代构造方法 传统的获取一个对象实例,通常是通过构造方法,new一个对象:不同数量的入参,会有不同的构造方法: 例如,统一的返回结果类,传统方式(伪代码)如下: //成功 retur ...

最新文章

  1. 物体的三维识别与6D位姿估计:PPF系列论文介绍(四)
  2. soft_argmax
  3. 制作空镜像与一个run的共享文件错误解决
  4. 集成 jpush-react-native 常见问题汇总 ( iOS 篇)
  5. esjava 同步mysql_Elasticsearch和mysql数据同步(elasticsearch-jdbc)
  6. 我的第一份vim程序
  7. 一文讲透大型网站架构模式核心原理与案例分析
  8. Team photo的新api
  9. Maven父子结构的项目依赖使用以及打包依赖_微服务项目(maven父子级项目)怎么打包
  10. 从零开始学Pytorch(六)之梯度消失、梯度爆炸
  11. 在Visual Studio Code运行单个js文件需要用到插件
  12. Dynamics Ax 2012中调用外部web服务
  13. 一周项目实战系列--SpringBoot实现微信点餐系统(1)
  14. exosip 对比osip
  15. Cents7 查看当前版本
  16. 时间管理类入门书籍分享
  17. telnet与ssh远程登陆配置方法
  18. ios开发聊天气泡实现
  19. organization --form 表单中organization 数据来源
  20. DIV+CSS解决IE6,IE7,IE8,FF兼容问题

热门文章

  1. Word——从任意页开始设置页码的方法
  2. 阿里云对象存储OSS是怎么收费的?
  3. c语言如何画函数图形,c语言绘制函数曲线
  4. Android获取手机Cpu温度
  5. 1999-2019中国互联网发展二十年趋势
  6. LARGE SCALE IMAGE COMPLETION VIA CO-MODULATED
  7. Java: null是什么??
  8. 8192网卡linux,记录Ubuntu14.04安装Realtek USB无线网卡(RTL8192)驱动
  9. Java-模拟新浪微博用户注册功能实现(控制台程序)
  10. html日历页面节假日_基于jquery实现可查询节假日万年历代码