Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 助手/存储类的内聚性低,这真的错了吗?_C#_Oop_Metrics_Cohesion - Fatal编程技术网

C# 助手/存储类的内聚性低,这真的错了吗?

C# 助手/存储类的内聚性低,这真的错了吗?,c#,oop,metrics,cohesion,C#,Oop,Metrics,Cohesion,有这样一个类,两个实例变量有两个getter: class A { _fieldA; _fieldB; GetA() GetB() GetSpecialNumber(int a) { //calculation not requiring any fields } } 这个班级将被归类为完全缺乏凝聚力。然而,我相信在某些情况下,这样的无状态对象是需要的,因此不应该应用内聚度量。或者这是一种错误的方法/想法? 事实上,我从来没有读过关于低内聚性是好

有这样一个类,两个实例变量有两个getter:

class A
{
   _fieldA;
   _fieldB;

  GetA()
  GetB()

  GetSpecialNumber(int a)
  {
      //calculation not requiring any fields
  }
}
这个班级将被归类为完全缺乏凝聚力。然而,我相信在某些情况下,这样的无状态对象是需要的,因此不应该应用内聚度量。或者这是一种错误的方法/想法?
事实上,我从来没有读过关于低内聚性是好的,除了本材料末尾提到的一些情况:

对于这种情况,我会使用属性而不是字段,这有助于一些工具理解这是一种DTO(这是正确的事情),所以他们不再抱怨内聚性和代码质量

struct X
{
    public int A { get; private set; }
    public int B { get; private set; }
}
如果
GetSpecialNumber(int a)
不使用任何字段/属性,则可以是静态方法:

public static int GetSpecialNumber(int a)
如果它将从其他地方使用,我也会将它移动到一个helper类

public static class SpecialNumberHelper
{
    public static int GetSpecialNumber(int a)
    {
        // calculation not requiring any fields
    }
}

不,低内聚性是不好的,至少如果你的目标是面向对象的话

现在,公平地说,并警告您,这可能不是大多数人的意见,但DTO、bean、属性或任何您称之为它们的东西都没有经过良好的设计(正如链接文章所显示的)。同样,只有在您关心对象方向的情况下。如果你不太在乎,那么你当然可以决定你想做什么

显然有一些微妙之处,比如给定的度量是否真的正确,或者外力(需求)是否会将您拉向低耦合。然而,我们希望避免低耦合的原因是,为了可维护性,我们希望在一个地方一起改变。低耦合的事物可能不会一起改变,因此可维护性较低


低内聚力有时会导致高耦合。例如,DTO(低内聚性对象)通过设计导致高度耦合。每当DTO中的任何内容发生更改时,都需要检查使用该DTO的所有位置。也就是说,这些位置与DTO高度耦合。

我看到的是具有只读属性的DTO。DTO有什么问题?这里提供的不是真正的方法,而是只读属性。所以,不。内聚性指标在这里不适用,伊姆霍。(“不是真正的方法”=它们不包含任何与字段相关的逻辑。)@Fidor,对,那么让我们假设这些方法对各自的字段进行处理。因为它们不能和另一个一起工作,所以内聚度为0。@user970696不要太专注于度量。它们不是用石头写的。他们应该让您大致了解解决方案中的情况。如果您必须保持较高的内聚性,那么您唯一能做的就是将该类
A
分为两个类
X
Y
,这两个类只有fields@EmrahS是的。我只是想了解我提供的链接中的示例是否确实有效,以及在某些情况下,低内聚性是否真的是合理的。我主要感兴趣的是,低内聚性是否能够很好地用于实际方法。我修改了问题中的代码。现在有另一种方法不处理任何字段,即内聚仍然为0。如果GetSpecialNumber不需要任何字段,它应该作为静态方法移动到某个通用helperWell,但如果这就是那个helper?比如数学课,计算平方或阶乘,你所需要的只是一个输入。我认为在这种情况下,凝聚力也会很低。@IvanSanz不一定。这要看情况而定。想象一下:一个类有一个方法为您计算一些ID。它还提供了两个常量值:“EmptyID”和“toxinId”。我认为将它们放在一个(实用性)类中是完全合理的。@user970696帮助程序是静态类,具有静态方法,没有状态(好吧……它们可以包含用于缓存目的的静态并发内容等)。谢谢,非常有趣。另外,您对我在问题中提到的文章末尾提到的案例有何看法?我不同意这些案例代表良好的设计。您可能会发现这些设计可能有意义的非常具体的情况,但不是一般情况。为了方便而对数据或过程进行分组并不是设计的好坏。我不同意这一点,使用DTO可以帮助您以适当的方式组织代码,使每个对象对其内容负责。有了更多的抽象(DTO),代码中的定制点越多,可维护性也就越高。每个人都可以用一种或另一种方法编写糟糕的代码,但是如果你比较两种合适的设计,在定制点上,具有可靠原则的设计是最好的,即使它的成本很低cohesion@IvanSanz-卡拉萨:你不能对公开的东西负责,因为你根本无法控制它们的使用方式。DTO中的所有内容都是公开的,因此DTO不承担任何责任。而且,在我看来,这也意味着它们不应该存在。