我正在重构一个代码库,就像一个房子。房子有墙,窗户,门等。目前,所有东西都放在屋内,如
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
访问door
和wall
?比如house.getDoor().getDoorColor()
?有什么好主意吗?
答案 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)
在Wall
或Window
等类中包装原始类型非常有意义。你绝对应该这样做,因为当你将一些int和字符串组合在一起并给它们起一个名字时,你就会开始考虑这个名字所暗示的约束。
例如,当您有课程Wall
时,方法Delete
是否适合此课程?嗯,不,它没有。更合适的是Demolish
,对吧?当你停止思考原语并开始思考课程时会发生什么。
这让我想到了下一个评论。您不应只使用类型为Wall
,Window
或Door
的属性创建类。您可以通过有意义的方法使House
类成为您对其他对象的访问点!您更愿意看到像
Wall wall = new Wall();
house->setWall(wall);
或
Wall wall = house->buildWall();
哪一个告诉你更多关于真正发生的事情?什么设置墙?构建它看起来更直观,对吧?遗憾的是,设计这种API非常困难。为什么?如果没有更多业务环境,就无法判断您是应该使用Wall wall = house->buildWall();
还是constructionCrew->buildWall(house);
。房子应该知道所有墙壁的位置,还是每个墙壁应该知道它的位置?
即使遇到这样的困境,您也应该能够使用实际对象编写代码(所以具有行为的类,而不仅仅是具有getter和setter的数据结构!)。我认为你只能通过这个简短的例子来判断,这种类型的代码更容易阅读和维护。
这是一个非常广泛的主题 - 我建议您阅读更多相关内容!