我正在使用C#编程项目,对于OOP最佳实践我有两个问题。为了简化问题,我简化了代码示例。面向嵌套类和帮助函数的OOP最佳设计实践
我有一个类Map
它将信息保存到2D瓦片地图。将只有一个地图类的实例:
class Map {
int height
int width
InventoryGrid iGrid
TileGrid tGrid
public Map(int height, int width) { ... }
}
的Map
类包含2点涉及地图上的项目和瓷砖的网格。这些是技术上嵌套的类,因为它们不会在代码中的其他任何地方初始化。例如,InventoryGrid
类可能是这样的:
class InventoryGrid {
Dictionary<int, Item> inventory
public function SetInventory(int index, item) { ... }
public function GetInventory(int index) { ... }
}
假设我们有一个Job
类的情况下,动作完成后需要更新库存。
class Job {
public void FinishedJob()
{
// I need to update the inventory.
}
}
让我们假设Job
类使得事件的呼叫或访问该Map
实例。
第一个问题是,什么是最好的OO方式来调用内部类的InventoryGrid.SetInventory()函数:
- 在
Map
类创建一个getter函数并调用map.iGrid.SetInventory ()直接。 - 在
Map
类中创建一个新函数,例如map.SetInventoryAt(),该函数继而调用iGrid.SetInventory()函数。 - 其他解决方案?
现在在我们的例子中,地图需要x和y坐标。然而,“网格”采用一个唯一的确定性索引来存储他们的信息。需要将坐标转换为索引的函数。
public int CoordsToIndex(int x, int y) {...}
此功能将所有网格使用(InventoryGrid,TileGrid,等...)
我的第二个问题是,根据最佳实践OO设计应该在哪里居住功能?谁是责任呢?
- 我是否创建超类
Grid
包含所有“网格”继承的函数以避免重复?特定于C#:使用接口而不是超类? - 我是否把它放在
Map
班,并指出“网格”不应该意识到索引转换的坐标。这会影响第一个问题吗? - 我是否会制作一个名为
GridTools
的单独(静态)类,该类包含辅助方法? - 其他解决方案?