帮我重构这个循环

WW.*_*WW. 0 refactoring law-of-demeter

我正在重新设计现有的课程.在这个类中,大约有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();
Run Code Online (Sandbox Code Playgroud)

在FindOrCreateBatch()内部,如果需要创建新批处理或者可以使用现有批处理,它会使用一些规则.此接口的不同实现对于它们如何找到它们具有不同的规则,等等.返回值是来自其找到或创建的支付批次的数据库的代理键(id).以下以p为参数的进程需要此id.

这是对我开始的地方的改进,但我对包含这个循环的类感到不安.

  1. 它似乎不是一个域对象,它更像是一个"管理器"或"控制器"类型类.
  2. 它似乎进入了batcher和supplierBatchEntryCreator(和其他类)之间.目前只传递了一个int,但如果改变了,那么所有三个类都需要改变.这似乎是违反法律的违法行为.

有什么建议,还是这样可以吗?实际的语言是java.

pax*_*blo 5

我有几个问题要问:

  • 它有用吗?
  • 它足够快吗?
  • 它是可读/可维护的吗?

如果所有三个人的答案都是肯定的那么,除此之外,我认为进一步的变化实际上只是浪费了精力.不要仅仅为了重构而重构.

人们常常会因为预期会发生什么而改变事物(例如你的"改变int").我更喜欢订阅YAGNI思想学派.是时候担心这个问题就在你这样做的时候.

德米特定律是一个设计准则,而不是规则.在现实世界中,实用主义通常胜过教条主义:-)