建造房屋的设计模式,构图?

时间:2018-03-16 02:30:11

标签: design-patterns

我正在重构一个代码库,就像一个房子。房子有墙,窗户,门等。目前,所有东西都放在屋内,如

class House {
   public:
     void setDoorColor(int color);
     void setDoorWidth(int width);

     void setWallColor(int color);
     void setWallWidth(int width);
     ...
   private:
     int doorColor;
     int doorWidth;

     int wallColor;
     int wallHeight;
     ...
}

所以,它非常混乱。我能想到的是使用像合成这样的东西,例如,

class House {
   private:
      Wall wall;
      Window window;
      ...
}

在哪里放置公共API?在每个组件中,说窗口内的窗口相关API?事情是House作为参数传递给许多其他函数,例如void foo(const House& house, int, double)。如何使用House访问doorwall?比如house.getDoor().getDoorColor()?有什么好主意吗?

2 个答案:

答案 0 :(得分:1)

您的建议很好,对所有私有变量使用public getter,setter方法。然后你可以像你提到的那样访问。

class House {
   private:
      Wall wall;
      Window window;

    public:
     void setWall(Wall );
     Wall getWall ();

     void setWindow (Window  window);
     Window  getWindow ();

}

答案 1 :(得分:1)

WallWindow等类中包装原始类型非常有意义。你绝对应该这样做,因为当你将一些int和字符串组合在一起并给它们起一个名字时,你就会开始考虑这个名字所暗示的约束。

例如,当您有课程Wall时,方法Delete是否适合此课程?嗯,不,它没有。更合适的是Demolish,对吧?当你停止思考原语并开始思考课程时会发生什么。

这让我想到了下一个评论。您不应只使用类型为WallWindowDoor的属性创建类。您可以通过有意义的方法使House类成为您对其他对象的访问点!您更愿意看到像

这样的代码吗?
Wall wall = new Wall();
house->setWall(wall);

Wall wall = house->buildWall();

哪一个告诉你更多关于真正发生的事情?什么设置墙?构建它看起来更直观,对吧?遗憾的是,设计这种API非常困难。为什么?如果没有更多业务环境,就无法判断您是应该使用Wall wall = house->buildWall();还是constructionCrew->buildWall(house);。房子应该知道所有墙壁的位置,还是每个墙壁应该知道它的位置?

即使遇到这样的困境,您也应该能够使用实际对象编写代码(所以具有行为的类,而不仅仅是具有getter和setter的数据结构!)。我认为你只能通过这个简短的例子来判断,这种类型的代码更容易阅读和维护。

这是一个非常广泛的主题 - 我建议您阅读更多相关内容!