I';我维护了一个Java类';4万行长。。问题

I';我维护了一个Java类';4万行长。。问题,java,maintenance,legacy-code,Java,Maintenance,Legacy Code,这可能是一个导致删除的主观问题,但我真的希望得到一些反馈 最近,我转到另一个非常大的企业项目,在那里我作为一名开发人员工作。我惊讶地发现项目中的大多数类都有8K到50K的行长,方法的行长都是1K到8K。它主要是处理DB表和数据管理的业务逻辑,充满了处理用例的条件语句 这样大的类在大型企业系统中常见吗?我意识到不看代码就很难做出决定,但是你有没有在一个类这么大的系统上工作过?哦,我认为这是一个可怕的迹象,我不需要看代码就可以这么说。听起来需要进行大规模的重构工作 让我猜猜——您也没有编写系统的单元

这可能是一个导致删除的主观问题,但我真的希望得到一些反馈

最近,我转到另一个非常大的企业项目,在那里我作为一名开发人员工作。我惊讶地发现项目中的大多数类都有8K到50K的行长,方法的行长都是1K到8K。它主要是处理DB表和数据管理的业务逻辑,充满了处理用例的条件语句


这样大的类在大型企业系统中常见吗?我意识到不看代码就很难做出决定,但是你有没有在一个类这么大的系统上工作过?

哦,我认为这是一个可怕的迹象,我不需要看代码就可以这么说。听起来需要进行大规模的重构工作


让我猜猜——您也没有编写系统的单元测试。我很同情你。

不看代码,实际上仍然很容易做出决定。类永远不应该是40K行,方法永远不应该是1K行。通常,如果我不能在一张纸上打印出一个方法,并且不能同时看到开始和结束括号,我会找到一种方法将其拆分


我想问一下,他们到底是在使用OOP原则,还是在尝试将Java更多地用作函数式语言或过程式语言?我无法想象一个真正的OOP项目有一个40K行的类。

这绝对是不对的。一个方法包含的代码不应超过单个工作单元所需的数量。一个类包含的方法不应多于与该类实例状态相关的方法


这太像了。我个人会放弃这个项目,寻找另一个。

这里是JDK 6中最大的十个类,按行数计算,有7209.java文件。这些类包含大量注释,这些注释可能比代码长

4495 ./javax/sql/rowset/BaseRowSet.java
4649 ./java/awt/Container.java
5025 ./javax/swing/text/JTextComponent.java
5246 ./java/util/regex/Pattern.java
5316 ./javax/swing/JTree.java
5469 ./java/lang/Character.java
5473 ./javax/swing/JComponent.java
9063 ./com/sun/corba/se/impl/logging/ORBUtilSystemException.java
9595 ./javax/swing/JTable.java
9982 ./java/awt/Component.java

我同意一个打印页面对于一个方法来说是足够长的。真的不需要超过10K行的IMHO。

作为一名年轻的程序员,我仍然记得我的老师告诉我们,在编写代码之前,要分解大函数并进行良好的OO设计

所以,除非在你的设计中有很好的理由强加40k行(我强烈怀疑),否则你已经有了答案:你的类太大了

我会引用我的妻子(她是化学家,不会编程):“4万行代码,真的出了问题!”

我有一些朋友在他们的公司从事一些非常古老的项目,从一个程序员到另一个程序员,我们都同意,一个如此规模的类仅仅意味着:

-补丁和修复:人们不得不在这里和那里做一些小的改变,不想/没有时间正确地做

在运行时,该代码可能不会出现任何问题,一切正常,但通常在需要进行任何形式的修改时会出现问题:

  • 找东西要花很长时间

  • 当有一个bug时,你不能轻易地锁定它


总之,我会坐下来重新思考您项目的oo设计,并进行重组(至少从1k~5k行类开始),我知道这样做很烦人,但从长远来看会更好,在12年的Java开发中,我可以诚实地说这是不寻常的

其实,;在超过25年的开发过程中,我从未在任何语言中遇到过如此大小的文件或类


破解重构工具

50K行代码?我认为KLOC是项目大小的度量,而不是文件大小。这就像我们的整个代码库(包括测试)


我使用的是JavaScript,因此无法直接比较,但我们只有很少几个超过500行的文件,而这些都是非常有问题的文件。

我知道,当我在尝试弄清楚它的功能和方式时,一些代码部分需要分解。或者如果它比屏幕截图大

通常,如果它让我感觉不好,我会重构它。我不喜欢感觉不好:-(

我怀疑代码失去了控制,因为管理层只想修复错误/功能,而不想做其他事情,然后一点一点地慢慢变得更糟

重构代码以简化程序员的工作可能不是他们优先考虑的事情。管理层昨天总是希望他们的错误修复/功能:-(


此外,一个运行的程序显然比一个坏掉的程序要好,如果不进行单元测试,那么分解那么大的代码将导致灾难。因此,所有的测试都必须在接触代码之前进行。管理层不允许这样做的另一个原因是。

需要注意的一点是
行与
行之间的差异代码行
和语句行
。如果使用声纳等工具分析项目,您可以很容易地看到它们之间的差异

然而,无论精确的度量是什么,40k行业务代码都是可怕的

在我开发的企业应用程序的业务模块中,代码行数最多为444行。这是一个相当大的服务。大多数服务类的代码行数在200到100行之间。在我们的情况下,实体(模型对象)大多在40到100行之间

在同一个应用程序的另一部分中,我们有一个类,它包含1224行代码(总共2477行,706条语句)。这个类在团队中几乎是普遍讨厌的,因为它的大小。它被认为是臃肿的、复杂的,而且做得太多了


现在,如果整个团队都在考虑一个总共只有2477行的类,那么这可能会让你对40k行的类是什么样的讨厌有一些看法。

除了在其他答案中描述的软件维护问题之外,请注意编译的Java方法不能超过64k字节的技术限制。(需要多少行代码