-3

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

我想知道这两种方法中哪一种更适合你们理解和使用

问候

4

1 回答 1

-1

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

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

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

  • 考虑您应该将飞机:) 从机库移动到着陆跑道。现在很自然地会引入新的类命名Tractor并像使用它一样使用它tractor.move(plane)
于 2012-08-23T15:45:49.833 回答