区分敏捷中的数据类和逻辑类

Differentiating between data class and logic class in agile

本文关键字:数据      更新时间:2023-10-16

我一直在读一本关于干净编码的敏捷书籍,主要是用Java和c#编写的。考虑区分数据类和逻辑/对象类的概念。我在c++中遇到了以下情况,我无法决定哪个变体是干净的代码。我有一个Plane类,它有一些属性,当其中只有一个属性改变时,这些属性就会改变,所以

第一种方法

class Plane3D {
   public:
      BBox bbox;
      float l,w,h;
      void setbbox(BBox bbox) {
         this->bbox = bbox;
         recalculateLWH();
      }
      void setLWH(float l, float w, float h) {
          //set here
          recalculateBBOX();
      }
};

这对我来说是有意义的,因为对用户来说,他只是在调用一个方法,而不必关心类的内部工作。但这违反了数据类,因为它包含逻辑现在

第二种方法

class Plane3D {
   public:
     BBox bbox;
     float l,w,h;
     void setbbox(BBox bbox) {
             this->bbox = bbox;
          }
     void setLWH(float l, float w, float h) {
      //set here LWH
     }  
};
int main() {
  BBox bbox;//init here
  Plane plane;
  plane.setBBox(bbox);
  recalculateLWH(plane);
}

现在,第二种方法实际上将数据类与实现分离,但它增加了类用户的责任,并迫使他进行额外的调用。据我所知,第二种方法是敏捷POV中的正确方法,但我发现第一种方法更符合逻辑。

我想知道这两种方法中哪一种对你们来说更有意义

问候

在这种情况下,我认为您应该更喜欢第一种方法而不是第二种方法。

  • 方法调用应该将对象从一个正确的状态转换为另一个正确状态。在setBBox(bbox);调用后使用第二种方法,对象确实会移动到一些不正确的状态

然而,"逻辑课堂方式"可能发生在另一种情况下。

  • 考虑一下你应该把飞机从机库移到停机坪。现在,引入名为Tractor的新类并像使用tractor.move(plane)一样使用它将是很自然的