与对象的多对多关系,其中存在中间字段?

时间:2012-08-23 06:36:09

标签: oop list relationship object-model object-object-mapping

我正在尝试在我的工作场所构建服务器和应用程序的模型。服务器可以托管许多应用程序。可以跨多个服务器托管应用程序。

通常我会让主机类包含List,而应用程序类包含List。但是,有一些特定于特定主机 - 应用程序关系的字段。例如,UsedMb表示应用程序在主机上使用的磁盘空间量。

我当然可以使用HostedApplicationclass来表示一个中间对象,它将保存UsedMb字段。然后Host和Application类都包含List。

但问题是,应用程序还需要了解其主机的某些方面,这些方面将包含在Host类中(例如,主机在地理位置上是分布式的;应用程序需要知道它有多少数据中心托管在,因此它需要能够检查其所有主机的DC名称。

因此,我可以让HostedApplication类保持对它引用的Host对象和Application对象的引用。但在某些情况下,我需要遍历所有应用程序(在其他情况下,所有主机)。因此,我需要3个单独的列表,List,List和List,以便能够根据需要遍历所有这三个。

我的基本问题是,处理这种配置的标准方法是什么?所有选项都有优点和缺点。我提到的最后一个选项似乎最正确,但有三个列表是否过度杀伤?有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

理想情况下,我可以和你谈谈这个问题,但这里有一个潜在的解决方案,基于我对需求的粗略理解(c ++风格,但很多实现都被遗漏了)

class Host {
public:

  string GeographicLocation() const;
  string DCName() const;
};

class HostAsAppearsToClient : public Host {

  HostAsAppearsToClient(const Host&);
  // Allows Host -> HostAsAppears... conversion

  size UsedMB() const;
  void UseMoreMB(size) const;
};

class Client {
  HostAsAppearsToClient* hosts;

  void AddHost(const Host& host) {
    // Reallocate enough size or move a pointer or whatever
    hosts[new_index] = HostAsAppearsToClient(host);
    hosts[new_index].UseMoreMB(56);
  }

  void DoSomething() {
    hosts[index].UsedMB();
    // Gets the MB that that host is using, and all other normal host data if
    // we decide we need it ...
    print(hosts[index].DCName());
  }
};

int Main() {
  Host* hosts = new Host[40];
  Client* clients = new Client[30];

  // hosts[2].UsedMB() // Doesn't allow
}

我完全希望这不符合您的要求,但请以何种方式告诉我,以便我能更好地了解您的问题。

编辑:

VBA ......不走运:-P

可以在VBA中加载dll,这样就可以用任何其他语言编写和编译代码,只需将输入和输出通过VBA从UI转发到DLL,但我想这取决于你如果值得的话。有关如何在VBA Excel中使用dll的文档:link

祝你好运!