【问题标题】:Many-to-many relationships with objects, where intermediate fields exist?与对象的多对多关系,其中存在中间字段?
【发布时间】:2012-08-18 15:19:11
【问题描述】:

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

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

当然,我可以有一个 HostedApplication 类来表示一个包含 UsedMb 字段的中间对象。 Host 和 Application 类都将包含一个 List。

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

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

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

【问题讨论】:

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


    【解决方案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

    祝你好运!

    【讨论】:

    • sji,这是一个好主意,而且是理想的,但是对于我忽略的一个问题......这必须在 VBA 中完成。所以继承是不允许的:(。但是,我可以使用包装类而不是直接持有主机的应用程序来做类似的事情。我相信在未来,一旦所有关于主机和应用程序的数据最终安装在数据库中,我们可能会将其转换为更通用的语言,所以我会记住这一点。但现在我坚持使用 excel。
    • @Swiftslide 我已添加到我的答案中以提供另一种可能的解决方案。如果您只需要使用 VBA,我认为包装类将是您可以使用的最佳解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2012-03-25
    • 2011-05-25
    相关资源
    最近更新 更多