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

时间:2012-08-23 15:03:30

标签: c++ coding-style agile

我一直在阅读一本关于清晰编码的敏捷书,主要是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中的正确方法,但我发现第一种方法更符合逻辑。

我想知道这两种方法中的哪一种对你们来说更有意义,并且使用

此致

1 个答案:

答案 0 :(得分:-1)

在这种情况下,我认为你应该更喜欢第一种方法。

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

但是,“逻辑课程方式”可以在另一种情况下发生。

  • 考虑你应该将飞机从机库移动到着陆跑道。现在,自然会引入名为Tractor的新类并将其用作tractor.move(plane)