实施具有内部依赖性的分层数据模型(树)

时间:2019-11-15 15:02:41

标签: c++ architecture encapsulation

我希望获得有关如何在C ++中实现具有内部依赖性的分层数据模型(树)的建议。 我的具体问题主要是关于应用封装的需求以及C ++必须提供的内容。

对于初学者,让我们举一个虚拟的例子。想象一下一个我们希望用户在其中操纵房屋(class)的API。
房屋将具有std :: vector的客房(class)。一个房间的std :: vector为4面墙(class)。 我们希望API用户能够使用128种可用颜色(颜色是int)中的一种来绘制房屋的任何墙壁。
但是,我们设置了一些限制:

  • 对于给定房间的墙壁,用户不能使用超过2种不同的颜色
  • 用户无法用相同的墙壁颜色绘制2个房间

比方说,房屋的构造商已经创建了一个房屋,其中有4个房间,墙壁颜色不同。 基于此示例,我将为用户描述将房间2的墙壁3的颜色更改为45的几种选项。

选项1
我的直觉是,如果我们让API用户在房屋(树)中导航到他想要的房间(层),那么代码将易于编写(这是一个API)并且可读。 当然,以下选项意味着树中的任何元素都可以访问某种控制器,以确保约束始终有效。

house House;
house.navigateInRoom(2).selectWall(3).paint(45);

我不习惯C ++,同事告诉我,对象上的GETTER不应允许调用者修改对象(封装原理)。换句话说,get函数(此处为:NavigationInRoom)应返回一个const房间。

在这种情况下,有两个选项可用。

选项#2.A
让树的根(房子)完成所有工作。

house House;
house.paintWall(2, 3, 45);  //paintWall(int roomIndex, int wallIndex, int color);

选项#2.A适合我:

  • 以某种方式合乎逻辑,因为房子可以进入其房间,所以 最适合处理依赖项的地方
  • 对于API用户和大多数用户来说都不实用 API用户的同事,将在6个月后阅读该功能。 此外,在API丰富了其他功能的情况下, 每个功能都可以通过House类获得,即 在我看来还是非常不切实际的

选项#2.B
不要返回对象或引用,而要返回副本。

house House;
Room selectedRoomCopy = house.getRoomCopy(2);
Wall selectedWallCopy = room.getWallCopy(3);
selectedWallCopy.paint(45);
selectedRoomCopy.updateWall(3, selectedWallCopy);
house.updateRoom(2, selectedRoom);

对我来说,选项#2.B非常繁琐。

以下是问题:

  • 选项1真的是一个坏的实现吗?
  • 还有其他选择吗?设计模式?标准班?
  • 您会推荐什么?

0 个答案:

没有答案