我正在重新设计现有的课程。在这个类中,大约有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。
这比我开始的地方有所改进,但我对包含这个循环的类感到不安。
有任何建议,还是这样可以吗?实际的语言是java。
答案 0 :(得分:5)
我有几个问题要问你:
如果所有三个人的答案都是肯定的话,那么,在我看来,进一步的改变实际上只是浪费了精力。不要仅仅为了重构而重构。
人们常常会因为预期会发生什么而改变事物(例如你的“改变int”)。我更喜欢订阅YAGNI思想学派。是时候担心这个问题就在你这样做的时候。
Demeter法则是一个设计指南,而非规则。在现实世界中,实用主义通常胜过教条主义: - )
答案 1 :(得分:0)
每个XXXEntryCreator与XXXEntry之间的关系是什么?我觉得我错过了一些东西,因为“创造者”只返回整数。
除此之外,你将400行的crud缩小到适合屏幕的东西,并且在步骤之间有一个合理可见的数据流。荣誉。 (我过去经历了很大的阻力,试图做出这样的改变 - 为什么人们会写N-100/1000线路其他的 - 如果传动?“
答案 2 :(得分:0)
FindOrCreate
和CreateOrUpdate
向我建议,可能多次传递会更简单(并且不知道代码的其余部分,我不知道它是否会降低性能,这是一个常见的问题建议多次通过时提出。)
如果你有一个循环来创建任何缺少的批次,供应商和买家(或三个循环),那么这个循环可以简化为
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
现在我看到造物主正在更新 - 是吗?将创建和更新责任分成两类是否有意义呢?
我开始看起来有点简单了。这有帮助吗?