開発者に「使用しないでください」メソッドを通知する

StackOverflow https://stackoverflow.com/questions/27758

  •  09-06-2019
  •  | 
  •  

質問

わかりました、私はあなたが考えていることを知っています、「なぜあなたは人々に使用したくない方法を書くのですか?」右?

つまり、XML にシリアル化する必要があるクラスがあります。のために XmlSerializer この魔法を実行するには、クラスにデフォルトの空のコンストラクターが必要です。

public class MyClass
{
  public MyClass()
  {
    // required for xml serialization
  }
}

だから、私はそれを持つ必要があるが、人々にはそれを望まない 使用 そうだ メソッドを「使用しない」としてマークするために使用できる属性はありますか?

を使おうと思っていたのですが、 廃止 属性 (ビルドが停止する可能性があるため) ですが、それはちょっと「間違っている」ように思えます。これを行う他の方法はありますか、それとも先に進んで弾丸を噛む必要がありますか?:)

アップデート

OK、私は心の中で完全に同意していると思うので、キースの答えを受け入れました。これが、私が最初に質問した理由です。私は、 廃止 属性。

しかし...

そこには まだ問題がありますが、インテリセンスで通知を受けている間、理想的にはビルドを中断したいのですが、これを行う方法はありますか?おそらくカスタム属性を作成しますか?

より焦点を絞った質問が作成されました ここ.

役に立ちましたか?

解決

クラスが [Serialisable] (すなわち、必要に応じてあちこちにコピーできます) 逆シリアル化にはパラメータのないコンストラクターが必要です。

コードのアクセスでプロパティのデフォルトをパラメータ化されたコンストラクターに渡すように強制したいのだと思います。

基本的には大丈夫だと言っているのですが、 XmlSerializer コピーを作成してプロパティを設定する必要がありますが、独自のコードではこれを行いたくない場合があります。

ある意味、これは過剰設計だと思います。

どのプロパティを初期化する必要があるか (何を初期化する必要があるか) を詳しく説明する XML コメントを追加するだけです。

使用しないでください [Obsolete], 、そうではないからです。これは、本当に非推奨になったメソッドのために取っておいてください。

他のヒント

次のものが使用できます。

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

インテリセンスに表示されないようにします。消費者がまだ使用したい場合は使用できますが、それほど発見されにくくなります。

ただし、オーバーエンジニアリングに関するキースの指摘は依然として有効です。

見出しを読んですぐに「廃止された属性」と思いました。どうでしょうか

    /// <summary>
    /// do not use
    /// </summary>
    /// <param name="item">don't pass it anything -- you shouldn't use it.</param>
    /// <returns>nothing - you shouldn't use it</returns>
    public bool Include(T item) { 
    ....

私は実際のところ、 ObsoleteAttribute MSDN ドキュメントには次のように書かれています。

要素を廃止としてマークすると、その要素が製品の将来のバージョンで削除されることがユーザーに通知されます。

XML シリアル化の汎用コンストラクターはアプリケーションから削除すべきではないため、今後のメンテナンス開発者が XML シリアル化の仕組みに精通していない場合に備えて、適用しません。

実際に使ってみた キースの Intellisense で表示されるように、XML ドキュメントでコンストラクターがシリアル化に使用されることに注意するだけの方法です。

自分で構築することもできます Attribute 派生クラス、たとえば NonCallableAttribute メソッドを修飾し、コードがそれらのメソッドを使用しているかどうかを監視するチェックをビルド/CI コード分析タスクに追加します。

私の意見では、開発者にこのメソッドを使用しないように強制することはできませんが、誰かがルールに違反した場合はできるだけ早く検出して修正することはできます。

うわー、その問題は私も悩ましいです。

NHibernate のデフォルト コンストラクターも必要ですが、クラスがコンストラクター コードを通過するように、C# 3.0 オブジェクト初期化子を使用しないように強制したいと考えています。

throw new ISaidDoNotUseException();

シリアル化可能なオブジェクトをドメイン オブジェクトから分離します。

あなたが探しているのは、 ObsoleteAttribute クラス:

using System;

public sealed class App {
   static void Main() {      
      // The line below causes the compiler to issue a warning:
      // 'App.SomeDeprecatedMethod()' is obsolete: 'Do not call this method.'
      SomeDeprecatedMethod();
   }

   // The method below is marked with the ObsoleteAttribute. 
   // Any code that attempts to call this method will get a warning.
   [Obsolete("Do not call this method.")]
   private static void SomeDeprecatedMethod() { }
}

ObsoleteAttribute おそらくあなたの状況では機能します。その方法を使用すると、ビルドが中断する可能性さえあります。

古い警告はコンパイル時に発生し、シリアル化に必要なリフレクションは実行時に発生するため、そのメソッドを古いものとしてマークしてもシリアル化は中断されませんが、メソッドが使用されるべきものではないことが開発者に警告されます。

私が使っているのは、 ObsoleteAttribute.

もちろん、コメントを付けることもできます。

そして最後に、可能であれば完全に削除します(古いものとの互換性を維持する必要はありません)。それが最善の方法です。

はい、あります。

それについてこのブログ投稿を書きました デザイナーと協力して.

そして、コードは次のとおりです。


public class MyClass
{
  [Obsolete("reason", true)]
  public MyClass()
  {
    // required for xml serialization
  }
}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top