1

私は現在、いくつかのフレームワーク クラスにリファクタリング (+ 新機能の追加) を行っています。状況は、分割したい一連のロジックを実行する単一の (神のような) クラスがあるということです。このクラスは、会計コードの検証規則のようなものを表します。そのため、人の名前、生年月日などの検証を行います.

私がやろうとしているのは、それを単一のルールに分割することです。基本的には、会計コードに対して個人の名を検証するルール、生年月日などを検証するルールです。最後にプログラマーにとっては、ほとんど同じように見えます。FiscalCode ルールの巨大なコンストラクターを呼び出す代わりに、彼は次のようなことをFiscalCode.GetRules(...)行い、ここでパラメーターを渡します。次にGetRules(...)、 は単一のルールを内部的に構築し、それらを配列として返します。それは完全に問題なく、私たちにとって正しいです。

あなたの背景についてはこれで終わりです。今、私の質問は次のとおりです。FiscalCode クラス (現在の強力な神のクラス) には、これから作成する単一の「ルール クラス」の多くで必要となるユーティリティ メソッドが多数あります。私が知っていることは、それを行うために何らかの形で FiscalCode クラスが必要になるというGetRules(...)ことです (これは、プログラマーがまったく新しいことをしなければならないということではなく、プログラマーにとって何らかの形で一定であり続けるためです)。

私の頭に浮かぶ2つのオプションがあります。

  1. 新しいルール クラスを作成し、FiscalCode クラスの public static ユーティリティ メソッドにアクセスする
  2. 新しいルール クラスを FiscalCode クラス st の内部のネストされたクラスとして作成します。既にユーティリティ メソッドにアクセスしています (したがって、ユーティリティ メソッドを公開する必要はありません)。

私はすでにお気に入りを持っていますが、最初にいくつかの意見を聞きたいです。

どうも

4

6 に答える 6

2

メソッドが「ユーティリティ メソッド」になったので、それらを静的かつパブリックにする必要がありますが、おそらく FiscalCode の名前を FiscalCodeUtil に変更する必要があります。したがって、どのようなメソッドが含まれているかは明らかです。

于 2009-08-11T08:13:46.927 に答える
1

また、このタイプの問題にアプローチする方法についての方向性を示す 仕様パターンのレビューをお勧めします。この投稿では、C#の例もいくつか示しています。

提案された仕様パターンは、オプション#1に向けてあなたを導きます。

于 2009-08-11T23:24:57.897 に答える
0

これらのユーティリティ メソッドは、FiscalCode クラスまたはルール クラスに対してどのような依存関係がありますか? それらによって保持されている状態はありますか?

依存関係がない場合は、これらのユーティリティ メソッドを別のクラスに移動し、必要に応じて FiscalCode クラスまたはルール クラスでそれらのメソッドを呼び出すことをお勧めします。

指定したオプションについて、1) と 2) の唯一の違いは、ルール クラスがそれらを使用しないクラスに表示されるかどうかです。それは本当に重要な目的ではないと思います。私がC++をやったとき、私はいつもそれについて心配していました...それは時間の無駄でした.

于 2009-08-11T08:15:56.830 に答える
0

IMO では、最初のオプションを選択する必要があります。これにより、新しく作成されたクラスを外部に公開し、他の場所でも再利用可能なコードを記述できるようになります。2 番目のオプションを選択すると、非常に特殊なクラスが作成されます。外部コードはその存在を知らないかもしれませんが、カプセル化には適しているかもしれません。それでも、ある時点で、より大きなクラスの範囲外で特殊なルールを使用することを決定する場合があり、そのシナリオでは、最初のオプションを使用する方が適切です。あなたの選択は何ですか?

于 2009-08-11T08:20:01.110 に答える
0

クラスがクラス外で使用されない場合は、FiscalCodeネストしてください。重要なことは、この新しいクラスの責任を から引き出すことですFiscalCode。それが存在する場所は、単なる選択の問題になります。新しいクラスの依存関係が増えたら、それを外部クラスにすることができます。

于 2009-08-11T08:20:04.043 に答える
0

私は次のようにします(私はOOPが得意ではないので、塩の粒でそれを取ってください):

ルール クラス (FiscalCode にネストされている) は、ルール メソッドを公開する IRule インターフェイスを実装します (Validate() など、戻り値の型がボートをフロートさせます)。FiscalCode には、ルールの内部コレクションを管理し、メソッド チェーンを許可するために self への参照を返す AddRule() メソッドがあります。

FiscalCode fc = new FiscalCode();
fc.AddRule(new RuleClass1(<params specific to RuleClass1>)
  .AddRule(new RuleClass2(<params specific to RuleClass2>)
  ...

また、FiscalCode には、各ルールの Validate() を反復処理してエラーを管理する Validate() メソッドがあります。

IMO これは非常に使いやすく、ネストされたルール クラスが FiscalCode のユーティリティ メソッドにアクセスすることを許可します。

于 2009-08-11T08:27:32.280 に答える