什么是“周遭执行”的成语?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (11)

我听说过的“执行”成语(或类似的)是什么?为什么我要用它,为什么我不想用它?

提问于
用户回答回答于

基本上,这是一种模式,可以编写一个方法来完成总是需要的事情,例如资源分配和清理,并让调用者传递“我们想要对资源做什么”。例如:

public interface InputStreamAction
{
    void useStream(InputStream stream) throws IOException;
}

// Somewhere else    

public void executeWithFile(String filename, InputStreamAction action)
    throws IOException
{
    InputStream stream = new FileInputStream(filename);
    try {
        action.useStream(stream);
    } finally {
        stream.close();
    }
}

// Calling it
executeWithFile("filename.txt", new InputStreamAction()
{
    public void useStream(InputStream stream) throws IOException
    {
        // Code to use the stream goes here
    }
});

// Calling it with Java 8 Lambda Expression:
executeWithFile("filename.txt", s -> System.out.println(s.read()));

// Or with Java 8 Method reference:
executeWithFile("filename.txt", ClassName::methodName);

调用代码不需要担心开放/清理侧-它将由executeWithFile...

这在Java中是很痛苦的,因为闭包非常冗长,从Java 8开始,lambda表达式可以像在许多其他语言(例如C#lambda表达式或Groovy)中那样实现,这个特殊情况是从Java 7开始使用try-with-resourcesAutoClosable溪流。

虽然“分配和清理”是典型的例子,但是还有很多其他可能的例子-事务处理、日志记录、使用更多权限执行一些代码等等。

用户回答回答于

当你发现自己不得不做这样的事情时,就会使用“执行”这个成语:

//... chunk of init/preparation code ...
task A
//... chunk of cleanup/finishing code ...

//... chunk of identical init/preparation code ...
task B
//... chunk of identical cleanup/finishing code ...

//... chunk of identical init/preparation code ...
task C
//... chunk of identical cleanup/finishing code ...

//... and so on.

为了避免重复所有这些总是“围绕”实际任务执行的冗余代码,可以创建一个自动处理它的类:

//pseudo-code:
class DoTask()
{
    do(task T)
    {
        // .. chunk of prep code
        // execute task T
        // .. chunk of cleanup code
    }
};

DoTask.do(task A)
DoTask.do(task B)
DoTask.do(task C)

这个成语将所有复杂的冗余代码移到一个地方,并使主程序更加可读性(和可维护性!)

扫码关注云+社区