Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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
Design patterns 建造房屋的设计模式,构图?_Design Patterns - Fatal编程技术网

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

Design patterns 建造房屋的设计模式,构图?,design-patterns,Design Patterns,我正在重构一个代码库,它有点像房子。房子有墙、窗、门等。目前,所有东西都放在house类中,例如 class House { public: void setDoorColor(int color); void setDoorWidth(int width); void setWallColor(int color); void setWallWidth(int width); ... private: int doorC

我正在重构一个代码库,它有点像房子。房子有墙、窗、门等。目前,所有东西都放在house类中,例如

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?在每个组件中,是否在窗口中显示与windows相关的API?问题是
House
作为参数传递给许多其他函数,例如
void foo(const House&House,int,double)
。如何使用
房屋
进入
?例如
house.getDoor().getDoorColor()
?有什么好主意吗

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

class House {
   private:
      Wall wall;
      Window window;

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

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

}

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

class House {
   private:
      Wall wall;
      Window window;

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

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

}

Wall
Window
之类的类中包装基元类型非常有意义。您肯定应该这样做,因为当您将一些int和字符串组合在一起并给它们起一个名称时,您开始考虑这个名称所暗示的约束

例如,当您有class
Wall
时,方法
Delete
是否适合这个类?不,不是。更合适的是拆卸,对吗?这就是当你停止思考原语而开始思考类时会发生的事情

这就引出我的下一句话。您不应该只使用类型为
Wall
Window
Door
的属性创建类。您可以通过有意义的方法将
House
class设置为访问其他对象的访问点!您愿意看到这样的代码吗

Wall wall = new Wall();
house->setWall(wall);

哪一个更能告诉你发生了什么?什么在筑墙?构建它看起来更直观,对吗?不幸的是,设计这种API相当困难。为什么?如果没有更多的业务上下文,就无法判断您是否应该使用
Wall-Wall=house->buildWall()或可能
施工队->建筑墙(房屋)。房子应该知道所有的墙在哪里还是每堵墙都应该知道它的位置

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


这是一个非常宽泛的主题——我建议大家多读一些这方面的文章

Wall
Window
等类中包装基元类型非常有意义。您肯定应该这样做,因为当您将一些int和字符串组合在一起并给它们起一个名称时,您开始考虑这个名称所暗示的约束

例如,当您有class
Wall
时,方法
Delete
是否适合这个类?不,不是。更合适的是拆卸
,对吗?这就是当你停止思考原语而开始思考类时会发生的事情

这就引出我的下一句话。您不应该只使用类型为
Wall
Window
Door
的属性创建类。您可以通过有意义的方法将
House
class设置为访问其他对象的访问点!您愿意看到这样的代码吗

Wall wall = new Wall();
house->setWall(wall);

哪一个更能告诉你发生了什么?什么在筑墙?构建它看起来更直观,对吗?不幸的是,设计这种API相当困难。为什么?如果没有更多的业务上下文,就无法判断您是否应该使用
Wall-Wall=house->buildWall()或可能
施工队->建筑墙(房屋)。房子应该知道所有的墙在哪里还是每堵墙都应该知道它的位置

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


这是一个非常宽泛的主题——我建议大家多读一些这方面的文章

我通常认为这是一个暗示,当我看到二传手时,设计可以改进。类应该具有一个有意义的服务接口,而不是getter和setter,该接口对内部状态的操作进行建模。
House
正在传递给其他函数。其他函数可以首先从
House
获取引用,然后使用此引用访问其方法。我走对了吗?例如在
foo()
Wall-Wall=house->getWall()中;wall->setColor(灰色)
?我通常认为这是一个暗示,当我看到setter时,设计可以得到改进。类应该具有一个有意义的服务接口,而不是getter和setter,该接口对内部状态的操作进行建模。
House
正在传递给其他函数。其他函数可以首先从
House
获取引用,然后使用此引用访问其方法。我走对了吗?例如在
foo()
Wall-Wall=house->getWall()中;墙->设置颜色(灰色)
?非常感谢!关于阅读的任何建议,如书籍、博客等。我有《四人帮》一书,但没有读过。:)@超级秃头,很抱歉回答晚了!我建议您阅读Vaughn Vernon的实现领域驱动设计。我非常喜欢沃恩写代码的方式。这确实改变了我对优秀的面向对象代码的思考方式。这篇文章很长,讨论了领域驱动的设计,现在对你来说可能不太有趣,但它确实值得一读。非常感谢!关于阅读的任何建议,如书籍、博客等