0

这是我的代码:

deleteStuffFromDb(); // void method
deleteStuffFromCache();

deleteStuffFromDb() 是一个返回类型为 的接口方法void

理想情况下,第一种方法将返回一个值(成功/失败)。该返回值将确定第二个方法是否执行。

我可以修改接口,因为它被 2 个类调用。但是,作为一个对系统没有全貌的运维开发人员,我仍然有可能破坏某些东西的风险。

您如何建议我确定这个 void deleteStuffFromDb() 的执行是否决定了 deleteStuffFromCache() 的执行。

以下是我想到的一些方法:

  1. 在 deleteStuffFromDb() 周围放置一个 try/catch,为错误情况引发异常。如果遇到 catch(),则不要执行 deleteStuffFromCache()。
  2. 将deleteStuffFromCache()的逻辑放入deleteStuffFromDb()方法中,并允许/禁止在该方法内执行
  3. ...?

请给我你的想法和你选择的理由。

谢谢。

4

4 回答 4

2

我可以修改接口,因为它被 2 个类调用。但是,作为一名运维开发人员,仍然存在对系统没有全貌的风险。

如果系统的全貌是它只在两个地方使用,你当然应该同时改变它们。完整的重新编译和系统测试将显示是否有其他任何问题。

于 2012-10-26T01:15:30.073 回答
1

deleteStuffFromDb()将的签名重写为deleteStuffFromDb(Object returnObject)

然后写一个封装接口来替换旧的签名deleteStuffFromDb()

在包装器界面中,执行以下操作:

void deleteStuffFromDb() {
     // initialize some dummy returnObject that doesnt get used
     deleteStuffFromDb(dummyObject);
}

要使用此系统,请将 a 传递returnObject给接口以捕获返回值。

这样,如果您愿意,您可以选择从接口获取返回值,但不会破坏使用旧接口的现有调用。

于 2012-10-26T01:03:43.610 回答
0

我不认为将返回类型从 void 更改为其他内容会破坏任何现有代码。

如果返回类型为 void,那么任何使用它的代码都不会期望该方法有任何返回。如果确实如此,它也会立即破裂。

现在,如果您更改它并从方法返回一些值,那么在现有代码的情况下,返回的值将被忽略。

您不能使用 void 方法来预期该方法返回一些值,但您可以执行相反的操作。

我能想到的唯一情况是,如果该接口有很多实现,那么更改它可能是个问题。

就第二点而言,我更愿意将逻辑保留在它所属的地方。可能只是调用方法本身。

于 2012-10-26T01:09:59.213 回答
0

不知道这对你来说听起来有多好,但我已经看到了方法(例如Scanner.html#next()throwsNoSuchElementExceptionIllegalStateException基于失败原因。还有更多这样的例子),这些方法是为了在失败的情况下成功抛出异常,例如

 public void deleteStuffFromDb(){
      ..... usual code..
      if (failedCondition){
           throw new RuntimeErrorException(new Error("Couldn't delete"));
      }
 }

在调用方,如果你得到抛出的异常,你可以假设它是失败的,否则是成功的。这样可以避免更改界面。

于 2012-10-26T01:29:38.760 回答