我正在重新设计现有课程。在这个类中,大约有一个 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)。以下以 p 作为参数的进程需要此 id。
这是对我开始的地方的改进,但我对包含这个循环的类有一种不安的感觉。
- 它似乎不是一个域对象,它更像是一个“管理器”或“控制器”类型的类。
- 它似乎介于批处理器和供应商BatchEntryCreator(以及其他类)之间。目前只有一个 int 被传递,但如果改变了所有三个类都需要改变。这似乎违反了 Dementer 法则。
有什么建议吗,或者这样可以吗?实际语言是java。