我正在学习罗伯特·C·马丁(Robert C.Martin)2009年出版的《干净的代码》(Clean Code)一书,我偶然发现了衔接的概念(第10章)。罗伯特引用:
每个方法使用每个变量的类具有最大的内聚性。一般来说,创建这样的最大内聚类既不可取,也不可能。。。
不幸的是,我没有找到详细的解释。有没有人用真实的代码示例来解释这一点?
非常感谢!!
把我的评论变成答案...
我能想到的一个简单而实用的例子是在计算机辅助设计中表示几何形状的类。
例如:
class Circle{
float[2] center;
float radius;
draw() {
hardware.draw(center[0], center[1], radius);
}
print() {
print('Cicrle at '+center[0]+','+center[1]+' with radius '+radius);
}
scale(s) {
center[0] *= s;
center[1] *= s;
radius *= s;
}
intersectLine(line) {
/* compute intersection based on line and circle coordinates using both cnter and radius variables */
}
}
class Bezier{
float[4] controls;
draw() {
/* .. */
}
print() {
/* .. */
}
scale(s) {
/* .. */
}
intersectLine(line) {
/* .. */
}
}
正如我们所看到的,形状类是最大的内聚性,考虑到对象及其方法的性质,这是完全正常的。任何实际利息的计算都需要它们的变量。
希望这些例子和解释有所帮助。
我在读关于不可变类的书,而使类不可变的方法据说是: 1-使类成为最终类以防止继承 我认为第三个条件是不必要的。当我们使一个变量最终并为它提供任何值时,在那之后,即使通过方法也不能给它赋值(因为一旦赋值给它,最终变量就不能改变)。那么为什么我们需要第三个条件没有setter方法呢? 我是不是理解错了?
问题内容: 我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些DAO服务。但是我不能。 为什么?我该如何解决? 当我注入一个例如它完美地工作。但是没有泛型… 问题答案: 当您要求 容器知道您要一个类型为的bean 。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带注释的方法中 容器使用反射来检索该参数化的类型,并将其与请求的
我已经阅读了这个问题的一些答案(为什么我不能创建大尺寸的数组https://bugs.openjdk.java.net/browse/JDK-8029587)我不理解以下内容。“在GC代码中,我们将对象的大小以单词的形式传递为int。”据我所知,JVM中单词的大小为4字节。根据这一点,如果我们将单词中的大尺寸长数组(例如MAX_INT-5)的大小作为INT传递,我们必须获得OutOfMemoryE
问题内容: 如下代码: 引发以下异常: 我猜内部类具有一个允许对其私有访问的字段和方法的字段。声明内部类static 可以解决它,但是如果需要此访问权限怎么办?有没有一种方法可以在不包含封闭类的情况下序列化非静态内部类,例如通过引用外部类? 编辑:例如,仅在序列化之前才需要访问外部类。好的,编译器不知道这一点,但是我认为这就是关键字存在的原因。 问题答案: 如果InnerClass需要此访问权限怎
问题内容: 这段代码: 印刷品: 我就是价值 但是,此代码: 导致编译错误: 为什么在我使用final类而不是隐式final枚举的同时,创建对我来说似乎是匿名子类的类,覆盖该方法,却抛出了编译时错误? 更具体地说,为什么可以覆盖中的任何内容?我对代码有印象 大致相当于 在这种情况下,匿名性质是不允许的。 有什么不同?为什么枚举很特别? 问题答案: 根据JLS: 枚举类型是隐式最终的,除非它包含至少
当使用Java8类时,有两种方法可以将值包装到Optional中。 我理解是使用的唯一安全方法,但为什么?为什么不直接使用