既存のクラスの再設計に取り組んでいます。このクラスでは、ほとんどの作業を行う約400行のwhileループです。ループの本体は、ifステートメント、変数割り当ての地雷原であり、中央のどこかに「続行」があります。ループの目的を理解するのは難しいです。
擬似コードでは、これが私が再設計しているところです:
/* Some code here to create the objects based on config parameters */
/* Rather than having if statements scattered through the loop I */
/* create instances of the appropriate classes. The constructors */
/* take a database connection. */
FOR EACH row IN mySourceOfData
int p = batcher.FindOrCreateBatch( row );
int s = supplierBatchEntryCreator.CreateOrUpdate( row, p );
int b = buyerBatchEntryCreator.CreateOrUpdate( row, p );
mySouceOfData.UpdateAsIncludedInBatch( p, s, b);
NEXT
/* Allow things to complete their last item */
mySupplierBatchEntry.finish();
myBuyerBatchEntry.finish();
myBatcher.finish();
/* Some code here to dispose of things */
RETURN myBatch.listOfBatches();
FindOrCreateBatch()内で、新しいバッチを作成する必要があるかどうか、または既存のバッチを使用できるかどうかを、いくつかのルールを使用して判断します。このインターフェースの実装が異なれば、それらを見つける方法などについても異なるルールがあります。戻り値は、見つけた、または作成した支払いバッチのデータベースからの代理キー(id)です。このIDは、pをパラメーターとして受け取る次のプロセスで必要になります。
これは私が始めたところからの改善ですが、このループを含むクラスに不安を感じています。
- ドメインオブジェクトではなく、「Manager」または「Controller」タイプのクラスのようです。
- バッチャーとsupplierBatchEntryCreator(および他のクラス)の間に入っているようです。現時点ではintのみが渡されますが、それが変更された場合は、3つのクラスすべてを変更する必要があります。これは、認知症の法則違反のようです。
何か提案がありますか、それとも大丈夫ですか?実際の言語はjavaです。