3

2 つのクラス間の依存関係に問題があります。問題は次のとおりです。

Timestamp と Exception の 2 つのクラスがあります。例外は抽象であり、考えられるすべての例外はこの抽象クラスから派生します。すべての例外には、例外がいつスローされたかを示すタイムスタンプがあります。したがって、例外にはタイムスタンプ クラスを含める必要があります (使用している言語ではインポートと呼ばれます)。ただし、タイムスタンプ エラーが発生する可能性があるため、例外がスローされます。そのため、タイムスタンプ クラスは例外クラスをインポートする必要があります。

そして、私の循環依存があります。さて、私の実際の質問は(これが言語から独立している理由です):このような場合、循環依存を避けるための適切な設計は何でしょうか?この問題を解決できませんでした。このクラスを現在のように独立しているが、循環依存関係がない解決策が見つからないからです。

4

2 に答える 2

11

「Exception-has-timestamp-property」のアイデア全体を削除します。例外は、例外的な動作を示す必要があり、それ以外は何も示しません。おそらく、ログを記録したいですか?ロガーがタイムスタンプを追跡し、適切な例外とペアにする方が理にかなっています。

例外の仕事とは何かを自問してください。明らかに、例外の仕事はスローされることです。これはいつ投げられるかによって異なりますか?いいえ。例外はこれをまったく気にしますか? いいえ。他に何か気にしますか?はい、例外ロガーです。しかし、タイムスタンプを気にするのはロガーであるため、ロガーはそれらのタイムスタンプも取得し、それらを処理する必要があります。結局のところ、それはその仕事の一部です。また、適切な設計では、ロガーは自分の作業の一部を例外に外部委託しません。

循環依存が解決されました。

于 2013-04-04T14:51:13.160 に答える
1

良い質問です。特に、単に機能させるのではなく、循環依存を回避したいということです。ただし、循環依存関係は一般的に悪い習慣ではないことを考慮してください。あなたの場合、私は両方のクラスを互いに利用するのが合理的です。

したがって、多くの言語では、クラス プロトタイプを定義できます。Python を使用していると思いますが、C++ ではこのように見えます。

class Timestamp;

Exceptionクラスを定義し、Timestampオブジェクトをメンバーとして使用できるようになりました。もちろん、まだ定義されていないため、そのメソッドを使用することはできません。ただし、Timestampコンストラクターがそのインスタンスを現在の時刻に初期化した場合、Exceptionクラスからメンバーにアクセスする必要はないかもしれません。

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

後でTimestampクラス全体を定義します。

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

ただし、このように 2 つのクラスを結合すると、クラスが大きく依存することに注意してください。どちらか一方を使用せずに使用することはできません。

Timestampそのため、例外の発生時刻を保存するためだけに例外にクラスを使用するという考えを捨てたいと思うかもしれません。実際のタイム スタンプを取得するには、ほとんどのオペレーティング システムで数行しかかからないと思います。したがって、クラス全体が必要ない場合はTimestamp、コードを複製して現在の時刻を取得することをお勧めします。これは、たとえばログ ファイルに時間とともに例外を書き込みたい場合に、最も実用的な方法です。

于 2013-04-04T14:30:48.203 に答える