2013-04-04 277 views
3

我遇到了兩個類之間的依賴問題。 問題是:類之間的循環依賴關係

我有兩個類,時間戳和異常。異常是抽象的,所有可能的異常都來自這個抽象類。每個異常都有一個時間戳來告訴什麼時候拋出異常。因此,異常需要包括(我使用的語言稱爲導入)時間戳類。 但是,可能會出現使用時間戳錯誤的問題,以便引發異常。因此,時間戳類必須導入異常類。

還有我的循環依賴。 現在我的實際問題是(這就是爲什麼它與語言無關):在這種情況下,爲避免循環依賴,什麼纔是正確的設計?我無法解決這個問題,因爲我找不到解決方案讓這些類像現在這樣獨立,但沒有循環依賴。

回答

11

我會放棄整個「Exception-has-timestamp-property」的想法。例外情況應該表明特殊的行爲,沒有別的。也許你想做一些日誌記錄?記錄器記錄時間戳並將其與適當的例外進行配對更有意義。

問問自己什麼是異常的工作。顯然,一個例外的工作就是拋出。這是否取決於何時拋出?不。例外情況是否關心這一點?不。還有別的事嗎?是的,例外記錄器。但是,由於記錄器是關心時間戳的人,記錄器也應該得到這些時間戳,並且與它們一起做。畢竟,這是它工作的一部分。而且,在適當的設計中,記錄器不會將部分工作外包給例外。

解決了循環依賴。

+0

其實我不確定他是否在談論這種例外。如果他是,你的回答肯定比我的更有價值。 – danijar 2013-04-04 16:16:15

+1

我認爲他指的是異常 - 例外 - 「但是,工作時間戳錯誤可能發生,所以引發異常。」也就是說,遇到異常行爲(例如失敗)時會引發異常。無論如何,這正是作者讓我們理解的。 – 2013-04-04 16:18:06

+0

我覺得你的建議非常好。是的,我使用異常的方式只是...異常。它們被拋出並可能被捕獲(或者可能不被捕獲)。 所以實際上沒有Exception Logger,但是如果有一個異常被捕獲,就有一種方法來記錄它。但要做到這一點,它將轉換成一條消息,然後從調試管理器記錄。 所以異常應該知道它何時被拋出。 或者你認爲最好不要拋出異常,而是讓異常管理器拋出異常,像工廠一樣使用它? – M0rgenstern 2013-04-04 21:54:35

1

好問題,特別是你想避免循環依賴,而不是讓它工作。但是考慮一下循環依賴並不是不好的做法。在你的情況下,我合理地利用兩個班級。

因此,許多語言允許您定義類的原型。我猜你正在使用python,儘管在C++中看起來是這樣的。

class Timestamp; 

現在,您可以定義Exception類,並使用Timestamp對象作爲成員。當然你不能使用它的方法,因爲它們還沒有定義。但是,如果Timestamp構造函數將其實例初始化爲當前時間,則可能不需要訪問Exception類中的成員。

class Exception 
{ 
    // ... 
    Timestamp timestamp; 
}; 

稍後,您將定義整個Timestamp類。

class Timestamp 
{ 
    Timestamp() 
    { 
     // initialize to current time 
    } 
}; 

但請注意,將兩個班這種方式使他們非常依賴。沒有其他人就不能使用他們中的一個。

因此,您可能想放棄使用Timestamp類作爲例外的想法,以存儲它們發生的時間。我猜想獲取實際的時間戳只是在大多數操作系統上佔用一些線。所以,如果你不需要整個Timestamp類,我建議複製代碼以獲取當前時間。例如,如果你想在日誌文件中寫入異常和他們的時間,這可能是最實際的方法。