我被问到这个问题:我无法回答 - 这里有任何答案吗?
对于有1000行代码的java类,1-n方法有100行和n + 1到m方法有200行代码可以说什么?
我想,类应该可以有1000行代码和方法也可以有100-200行代码 - 所以我没有回答考虑到这个类完全可以。
是否存在与java类所具有的行数相关的编译时性能?还是java方法有?有没有标准 - 如果是这样的话,怎么能在技术上证明这一点?
谢谢!
答案 0 :(得分:14)
关于这一课,可以说它必须重构。每个类和每个方法都有太多的代码行。它不会引起任何技术问题,但会导致可读性和支持问题。
答案 1 :(得分:4)
我认为这里的主要问题不是编译时性能。 1000行级难以阅读和理解。
也许该类应该在其他类(或子类中,如果在您的情况下继承比组合更有价值)中分解,因此每个类在系统中都有明确定义的职责。
但是如果我不能查看课程的实现,我就不能说这个问题了。
有很多好书可以解释如何解决这个问题以及其他设计问题。两本着名的书籍是Code Complete 2nd Edition by Steve McConnell和Refactoring by Martin Fowler et al。
答案 2 :(得分:3)
我想到了什么:
n = 0, m-n = 5 --> 5 methods
n = 2, m-n = 4 --> 6 methods
n = 4, m-n = 3 --> 7 methods
n = 6, m-n = 2 --> 8 methods
n = 8, m-n = 1 --> 9 methods
n = 10, m-n = 0 --> 10 methods
其他回复中已经提到了其他所有内容。
答案 3 :(得分:3)
这听起来好像是god object - 一个违反single responsibility principle的非常大的类。这是对它的另一个很好的描述,包括如何重构它的想法:The Blob。
另请查看anti-patterns。
答案 4 :(得分:2)
这不是你应该知道的编译时间,而是维护问题。我最近遇到了更糟糕的问题 - 我接管了主类大约6000行的代码,有很长的方法,嵌套循环和if语句等等。相信我,新开发人员需要付出相当大的努力来理解发生了什么在那里。
理想情况下,每个类/方法应该只有一个责任,只能执行一个任务。所以,如果我是你,我肯定会回答这个课真的需要重构!
答案 5 :(得分:1)
可以说什么?那么,可以说该类中的方法数是:m <= 5 + n / 2
答案 6 :(得分:1)
上帝的大脑方法 - 绝对是反模式。 http://www.springer.com/computer/swe/book/978-3-540-24429-5
答案 7 :(得分:0)
这意味着虽然您已经使用过OOP语言,但您仍然可以像使用任何一种简单的非结构化编程语言那样进行编码。
答案 8 :(得分:0)
可以说,该课程是重构的候选人。但是,当然,关于一个类应该有多大或者它的方法,没有硬性规定。
答案 9 :(得分:0)
<强> 1。类的方法是 Candidates 用于重构
这并不意味着方法应该自动重构。在合法的情况下,精心设计的方法可能长达100行甚至200行。考虑一种实现更高数学函数的方法,该函数使用大型数组作为查找表来加速常见情况的处理。这些数组完全是方法体内部的,可能跨越多行代码,但不实际上可以为方法的复杂性添加更多。
然而,这些 的情况很少见,并且大多数时候你可以说跨越100多行的方法需要被分解以与良好的设计保持一致,原因有很多,这里已经提到过(可读性) ,可测试性,重用等)。理解并注意到这个长度实际上可能是合理的“极端情况”,而不是直接进入“任何时候X行长,你必须做Y”的教条绝对几乎肯定会更好地反映出来在你身上。
<强> 2。 Class Itself是重构的候选
正如others所指出的那样,就代码行而言,一个类的大小应该是绝对的。但是,Single Responsibility Principle表示一个班级应该做好一件事而且只做一件事。一个合理的假设是,这个类只根据其长度做了不止一件事,并且设计将受益于在几个较小的类中分解它。但是,这绝不是保证。千行不是荒谬的长,在某些情况下可能是值得的。方法的长度几乎总是比类的长度(代码行)更大。
第3。关于班级内容的推论
虽然我怀疑在OP的问题描述中可能存在拼写错误: 1-n方法有100行和n + 1 (考虑n是否是大于1-的正整数) - 你最终得到负数100线方法)。如果您可以快速计算每种方法的数量,就可以开始推理该类。
例如,如果2 * a + b = 5(其中 a 是100行方法的#,而 b 是200行方法的#),那么你知道整个类只包含这些方法,因为它们中的总行数= 1000.在这种情况下,你知道该类没有构造函数,字段或初始化。知道了这一点,每个方法都必须static
。然后你有一个类只存在以提供一些更长的静态方法:听起来像是一个实用程序/助手类。
你也知道反过来:如果2 * a + b!= 5,那么必须拥有至少一个字段,构造函数或初始化程序块。