1.静的とインスタンス
良いOOデザインとそうでないものについて、非常に明確なガイドラインがあると思います。問題は、ブロゴスフィアによって、善と悪、andいものを区別することが難しくなることです。あなたはいくつかを見つけることができますあなたが考えることができる最悪の練習をサポートするリファレンスのようなものを。
そして、私が考えることができる最悪の実践は、あなたが言及した統計と皆のお気に入りのシングルトンを含むグローバル状態です。この件に関する Misko Heveryの古典的な記事からの抜粋。
依存関係を本当に理解するには、開発者はコードのすべての行を読む必要があります。離れた場所で不気味なアクションが発生します。テストスイートを実行すると、1つのテストで変更されたグローバル状態により、後続のテストまたはパラレルテストが予期せず失敗する可能性があります。手動またはGuice依存性注入を使用して、静的依存性を解除します。
距離での不気味なアクションは、孤立していると思われるものを実行するときです(参照を渡さなかったため)が、システムの離れた場所で予期しない相互作用と状態の変化が発生し、オブジェクトについては伝えませんでした。これは、グローバル状態を介してのみ発生します。
以前はこのように考えていなかったかもしれませんが、静的状態を使用するときは常に、秘密の通信チャネルを作成し、APIでそれらを明確にしないことになります。離れた場所での不気味なアクションにより、開発者はコードのすべての行を読んで潜在的な相互作用を理解し、開発者の生産性を低下させ、新しいチームメンバーを混乱させます。
要するに、何らかの状態が保存されているものへの静的参照を提供すべきではないということです。私が静的を使用する唯一の場所は列挙された定数のためであり、それについてさえ不安があります。
2.入力パラメーターと戻り値を持つメソッドとなしのメソッド
理解する必要があるのは、入力パラメーターも出力パラメーターも持たないメソッドは、何らかの内部的に格納された状態で動作することが保証されていることです(そうでなければ、何をしているのでしょうか?)。保存された状態を回避するという考えに基づいて構築された言語全体があります。
状態を保存するたびに、副作用が発生する可能性があるため、常に注意して使用するようにしてください。これは、定義された入力および/または出力を持つ関数を好む必要があることを意味します。
実際、入力と出力を定義した関数はテストがはるかに簡単です。ここで関数を実行して、何が起こったのかを確認する必要はありません。また、プロパティをどこかに設定する必要もありません。それ以外の場合は、テスト対象の関数を実行する前に。
このタイプの関数を静的変数として安全に使用することもできます。ただし、新しい実装で別のインスタンスを提供するのではなく、後でその関数の少し異なる実装を使用したい場合は、機能を置き換える方法がありません。
3.重複と個別
質問がわかりません。2つの重複する方法の利点は何ですか?
4.プライベートとパブリック
公開する必要のないものは公開しないでください。しかし、私もプライベートの大ファンではありません。私はC#開発者ではなく、ActionScript開発者です。2007年頃に書かれたAdobeのFlex Frameworkコードに多くの時間を費やしました。そして、何をプライベートにするかという非常に悪い選択をしたため、クラスを拡張しようとする悪夢のようなものになりました。
あなたが2007年頃のアドビの開発者よりも優れたアーキテクトだと思わない限り(あなたの質問から、その主張をする機会を得るまでにもう数年あると思います)、あなたはおそらくデフォルトの保護にしたいでしょう。
コード例にはいくつかの問題があり、それらは適切に設計されていないため、AまたはBを選択することはできません。
まず、オブジェクトの作成とその使用を分離する必要があります。そのため、通常、new XMLReader()
使用する場所の隣には権利がありません。
また、@ djnaが言うように、XMLリーダーで使用されるメソッドをカプセル化する必要があります。そのため、API(インスタンスの例)は次のように簡略化される可能性があります。
_document Document = reader.read(info);
C#がどのように機能するかはわかりませんが、多くのWebテクノロジを扱っているため、XMLドキュメントをすぐに返せるとは限りません(約束や将来のタイプを除きます)。オブジェクト)、ただし、C#で非同期ロードを処理する方法についてアドバイスすることはできません。
このアプローチでは、XMLオブジェクトをどこで/何を読み取って返すかを伝えるパラメーターを取得し、プロジェクトのニーズに基づいてそれらを交換できるいくつかの実装を作成できることに注意してください。たとえば、データベース、ローカルストア、または元の例のようにURLから直接読み取る場合があります。静的メソッドを使用している場合、それはできません。