我希望获得有关如何在C ++中实现具有内部依赖性的分层数据模型(树)的建议。 我的具体问题主要是关于应用封装的需求以及C ++必须提供的内容。
对于初学者,让我们举一个虚拟的例子。想象一下一个我们希望用户在其中操纵房屋(class
)的API。
房屋将具有std :: vector的客房(class
)。一个房间的std :: vector为4面墙(class
)。
我们希望API用户能够使用128种可用颜色(颜色是int
)中的一种来绘制房屋的任何墙壁。
但是,我们设置了一些限制:
比方说,房屋的构造商已经创建了一个房屋,其中有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适合我:
选项#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非常繁琐。
以下是问题: