0

我正在重新设计现有课程。在这个类中,大约有一个 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. 它似乎介于批处理器和供应商BatchEntryCreator(以及其他类)之间。目前只有一个 int 被传递,但如果改变了所有三个类都需要改变。这似乎违反了 Dementer 法则。

有什么建议吗,或者这样可以吗?实际语言是java。

4

3 回答 3

5

我有几个问题要问

  • 它有效吗?
  • 速度够快吗?
  • 它可读/可维护吗?

如果这三个问题的答案都是肯定的,那么除此之外,在我看来,进一步的更改实际上只是浪费精力。不要仅仅为了重构而重构。

很多时候,人们会因为预期可能发生的事情而改变事物(例如,你的“改变 int”)。我更喜欢订阅 YAGNI 学派。担心这一点的正确时间是你这样做的时候。

得墨忒耳法则是设计指南,而不是规则。在现实世界中,实用主义通常胜过教条主义:-)

于 2009-08-13T00:56:14.957 回答
0

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

除此之外,您将 400 行粗略的代码简化为适合屏幕的内容,并且在步骤之间具有合理可见的数据流。荣誉。(我过去曾因尝试进行此类更改而遇到过强烈的抵制——为什么人们会写 N-100/1000 line run-on else-if 乱码?)

于 2009-08-13T00:59:45.503 回答
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

现在我看到造物主正在更新——对吗?将创建和更新职责分成两个类是否有意义?

它开始对我来说看起来有点简单。它有帮助吗?

于 2009-08-13T17:00:58.920 回答