1

モジュラー MVVM アプリケーションがあります。インターフェースの1つは以下のようになります

public interface ILogger
{

    void ReportError(ErrorType type);
}

ErrorType タイプは以下のようになります

class ErrorType
{
  string Message;
  string Title;
  object Owner;
}

タイプobjectに注意してください。ILogger インターフェイスを実装するモジュールは、呼び出しモジュールの名前が必要なだけなので、これから GetString() を呼び出すだけです。オブジェクトの使用は私にとって問題のように見えます。疎結合アプリケーションを開発しており、モジュール間で任意のオブジェクトを渡すことができますか?

justified as object の使用は、タイプミスの原因となる可能性のある文字列と比較して、より柔軟で型名を与えることが保証されています。また、インターフェイスの実装者は、GetString() を呼び出す以外には何もしていません。

アドバイスをお願いします。オブジェクトの使用法は、モジュールが自分自身を識別する方法を知らないように見えます。このようなオブジェクトを使用するのは良い設計ですか?

私はより多くの観点から考えています

 class ErrorType
 {
      string Message;
      string Title;
      string ModuleName;
 }
4

5 に答える 5

2

使用しているのはオブジェクトの名前だけである場合は、オブジェクト全体を保存するのではなく、ErrorType を作成するときにリフレクションを使用してそれを渡すことをお勧めします。タイプミス/保守性が心配な場合は、ハードコードされた値を使用しても問題ないため、開発者はハードコードされた値を使用しないようにする必要があります。*

ただし、その他の理由でオブジェクトが必要な場合は、保持する必要があります。それ以外の場合、必要のないのは単なるオーバーヘッドです。

しかし、私の2セントだけです。

*これは現在のメソッドを取得する方法を示す SO の質問であり、現在のモジュールを取得する方法は次のとおりです。

this.GetType().Module.Name;
于 2012-04-23T18:01:23.320 に答える
1

string ModuleName今必要なのはそれだけなので、それを使用してください。最小限の情報を公開することを余儀なくされ、他のモジュールはごまかすことができず、Ownerオブジェクトのタイプに基づいて決定を下すことができなくなります。

実際のコードではプロパティを使用する (できれば IErrorType インターフェイスで読み取り専用にする) ため、実装を簡単に変更できます。つまり、渡されたオブジェクトに基づいて ModuleName を計算できます。

于 2012-04-23T18:02:21.170 に答える
1

スタック情報 (モジュール名など) を取得しようとしている場合は、Log4Net または NLog の使用を検討する必要があります。車輪を再発明する必要はありません。

すべてのレイヤーが .Net にある場合、オブジェクト型を使用すると問題が発生することはわかりません。これは、他のすべての基本クラスです。問題は、その情報を使ってあなたが何をするか (または他の人が何をするか) です。.ToString、.Equals、および他のいくつかのメソッドしかありません。ロギングの設計を促進する機能以外の要件はありますか? 「所有者」が(まだ)必要ない場合は、含めないでください。

オブジェクトを渡すかどうかは、必ずしもカップリングに影響を与えるわけではありません。むしろ、それは一方が他方についてどれだけ知っているかです。したがって、必要のないものは追加しないでください。

于 2012-04-23T18:13:07.777 に答える
1

ILogger インターフェイスを実装するモジュールは、呼び出しモジュールの名前が必要なだけなので、これから GetString() を呼び出すだけです。

(注意: 正しいメソッド名はToString())

それでは、何が必要かについて暗黙のインターフェースを持っています。それを明示的にして、モジュールにそれを実装させることもできます:ILogger

interface INamed {
  string Name { get; }
}

次に (名前を に変更ErrorTypeしたことに注意してくださいError。他の名前でErrorMessageも問題ありません):

class Error {
  string Title;
  string Message;
  INamed NamedModule;
}

しかしもちろん、名前を取得するためだけにこのような単純なインターフェースを用意するのはやり過ぎかもしれません。stringあなたが提案しているように使うことができます:

class Error {
  string Title;
  string Message;
  string ModuleName;
}

どちらの方法でも、 を使用するよりも優れています。これは暗黙的すぎて、その意図を伝えたり、モジュールにオーバーライドをObject.ToString()強制したりしません。

于 2012-04-23T20:06:23.140 に答える
0

モジュール名だけが必要な場合、モジュール名は問題ありませんが、そうではありません。URL が識別子として期待される別の状況と、URL とモジュール名が必要な別の状況があります。

所有者またはモジュール名だけの単純なものかどうかはわかりませんが、object.tostring を使用することの暗黙の性質を高く評価しています。

私が持っていたのは、実際に所有者オブジェクトへのインターフェイスを使用して、IDocument などの呼び出し元を識別することでした。呼び出し元は、可能な値として URL と Text を持ち、ロギング サービスのクライアントは、所有者が IDocument タイプであるかどうかを確認します。より多くのことができるようになります。

モジュール名だけでなく、呼び出し元のクラスに関する情報を追加する必要があることは間違いありませんが、それが必要ない場合もあります。

おそらく、クラス階層が役立つでしょう。

Class Message
{
   string Title {get; set;}
   string Message {get; set;}
}

Class ModuleMessage: Message
{
   string ModuleName  {get; set;}
}

Class URLMessage: Message
{
   string URL {get; set;}
}

Class DocumentMessage: URLMessage
{
   string Text  {get; set;}
}

ここでの危険は、ますます多くのクラスを作成することに夢中になり、どのクラスを使用すべきか誰も確信が持てないことです。

于 2012-04-24T09:42:19.307 に答える