帮我重构这个循环

时间:2009-08-13 00:40:10

标签: 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();

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

这比我开始的地方有所改进,但我对包含这个循环的类感到不安。

  1. 它似乎不是一个域对象,它更像是一个“管理器”或“控制器”类型。
  2. 似乎是在batcher和supplierBatchEntryCreator(以及其他类)之间。目前只传递了一个int,但如果改变了,那么所有三个类都需要改变。这似乎违反了Dementer法。
  3. 有任何建议,还是这样可以吗?实际的语言是java。

3 个答案:

答案 0 :(得分:5)

我有几个问题要问

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

如果所有三个人的答案都是肯定的话,那么,在我看来,进一步的改变实际上只是浪费了精力。不要仅仅为了重构而重构。

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

Demeter法则是一个设计指南,而非规则。在现实世界中,实用主义通常胜过教条主义: - )

答案 1 :(得分:0)

每个XXXEntryCreator与XXXEntry之间的关系是什么?我觉得我错过了一些东西,因为“创造者”只返回整数。

除此之外,你将400行的crud缩小到适合屏幕的东西,并且在步骤之间有一个合理可见的数据流。荣誉。 (我过去经历了很大的阻力,试图做出这样的改变 - 为什么人们会写N-100/1000线路其他的 - 如果传动?“

答案 2 :(得分:0)

FindOrCreateCreateOrUpdate向我建议,可能多次传递会更简单(并且不知道代码的其余部分,我不知道它是否会降低性能,这是一个常见的问题建议多次通过时提出。)

如果你有一个循环来创建任何缺少的批次,供应商和买家(或三个循环),那么这个循环可以简化为

FOR EACH row IN mySourceOfData
  int p = batcher.FindBatch( row );
  int s = supplierBatchEntryCreator.Update( row, p );
  int b = buyerBatchEntryCreator.Update( row, p );
  mySouceOfData.UpdateAsIncludedInBatch( p, s, b);
NEXT

现在我看到造物主正在更新 - 是吗?将创建和更新责任分成两类是否有意义呢?

我开始看起来有点简单了。这有帮助吗?