Design patterns 建造房屋的设计模式,构图?
我正在重构一个代码库,它有点像房子。房子有墙、窗、门等。目前,所有东西都放在house类中,例如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
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和字符串组合在一起并给它们起一个名称时,您开始考虑这个名称所暗示的约束
例如,当您有classWall
时,方法Delete
是否适合这个类?不,不是。更合适的是拆卸,对吗?这就是当你停止思考原语而开始思考类时会发生的事情
这就引出我的下一句话。您不应该只使用类型为Wall
、Window
或Door
的属性创建类。您可以通过有意义的方法将House
class设置为访问其他对象的访问点!您愿意看到这样的代码吗
Wall wall = new Wall();
house->setWall(wall);
或
哪一个更能告诉你发生了什么?什么在筑墙?构建它看起来更直观,对吗?不幸的是,设计这种API相当困难。为什么?如果没有更多的业务上下文,就无法判断您是否应该使用Wall-Wall=house->buildWall()代码>或可能施工队->建筑墙(房屋)代码>。房子应该知道所有的墙在哪里还是每堵墙都应该知道它的位置
即使遇到这样的困境,您也应该能够使用实际对象编写代码(因此具有行为的类,而不仅仅是具有getter和setter的数据结构!)。我认为,通过这个简短的示例,您可以自己判断,这种类型的代码更易于阅读和维护
这是一个非常宽泛的主题——我建议大家多读一些这方面的文章 在Wall
或Window
等类中包装基元类型非常有意义。您肯定应该这样做,因为当您将一些int和字符串组合在一起并给它们起一个名称时,您开始考虑这个名称所暗示的约束
例如,当您有classWall
时,方法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的实现领域驱动设计。我非常喜欢沃恩写代码的方式。这确实改变了我对优秀的面向对象代码的思考方式。这篇文章很长,讨论了领域驱动的设计,现在对你来说可能不太有趣,但它确实值得一读。非常感谢!关于阅读的任何建议,如书籍、博客等