2012-08-23 34 views
2

我正在嘗試在我的工作場所構建服務器和應用程序的模型。服務器可以託管許多應用程序。應用程序可以託管在許多服務器上。與中間字段存在的對象的多對多關係?

通常我只是讓宿主類包含一個List,而應用程序類是一個List。但是,有幾個特定於特定主機 - 應用程序關係的字段。例如,UsedMb表示應用程序在主機上使用的磁盤空間量。

我當然可以有一個HostedApplicationclass,代表一箇中間對象,它可以容納UsedMb字段。 Host和Application類都會包含一個List。

但問題是,應用程序還需要了解將包含在Host類中的Host的某些方面(例如,主機在地理上是分佈式的;應用程序需要知道有多少個數據中心它需要能夠檢查所有主機的DC名稱

因此,我可以讓HostedApplication類持有對它引用的Host對象和Application對象的引用。在某些情況下,我需要遍歷所有應用程序(在其他情況下,所有主機)。因此,我需要3個單獨的列表,列表,列表和列表,以便能夠根據需要循環遍歷所有三個列表。

我的基本問題是,處理這種配置的標準方式是什麼?所有選項都有優點和缺點。我提到的最後一個選項似乎是最正確的,但是有三個列表矯枉過正?有沒有更優雅的解決方案?

回答

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

這是可能加載DLL的VBA中,這將讓你寫,在任何其他語言的編譯代碼,只是前進通過VBA從UI輸入和輸出到DLL,但我想它是由你自己決定的,如果那就值得。關於如何在VBA Excel中使用dll的文檔:link

祝你好運!

+0

sji,這是一個好主意,而且會是理想的,但對於我忽略提及的一個問題......這必須在VBA中完成。因此,不允許繼承:(但是,我可以使用包裝類來做類似的事情,而不是直接持有主機的應用程序。我相信未來,一旦所有關於主機和應用程序的數據最終都安裝在數據庫中,我們可能會把它轉換成更通用的語言,所以我會牢記這一點,但現在我堅持使用excel – Swiftslide

+0

@Swiftslide我已經添加到我的答案中,提供了另一種可能的解決方案。 VBA我認爲包裝類將是您可以獲得的最佳解決方案。 – sji

相關問題