gpt4 book ai didi

java - 寻求使用函数式编程来解决重复代码

转载 作者:行者123 更新时间:2023-12-01 17:49:54 25 4
gpt4 key购买 nike

我有一些经常使用相同模式重复的代码,我将其作为伪代码包含在下面。

我有许多具有相同事务代码(参见 A.) 的方法,然后每个方法的数据库代码始终不同(参见 B.)>。 B处的代码需要在匿名类中执行。

public static Foo doMyDatabaseStuff(ApplicationContext context, WebSite webSite) {

//A. Do a bunch of boilerplate Transaction stuff

TransactionUtils transactionUtils = getTransactionUtils(context);

Foo foo = (Foo) transactionUtils.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {

//B. Do a bunch of use case specific DB stuff

FooDao fooDao = (FooDao) context.getBean("FooDao");
Foo foo = fooDao.create(webSite);
{
foo.setName("Administratoren");
foo.setSite(webSite);
//call a bunch of other setters
fooDao.update(foo);

return foo;
}
}
});
return foo;
}

我觉得这是函数式编程的完美候选者。我有一堆代码想要执行,但我想将其包装在其他函数中(即使用更高阶的函数)。

我天真的尝试使用 Function 接口(interface)得到了这个:

public Foo doMyDatabaseStuff(ApplicationContext context, WebSite webSite) {

Function<ApplicationContext, Foo> func = new Function<ApplicationContext, Foo>() {

public Foo apply(ApplicationContext context) {
FooDao fooDao = (FooDao) context.getBean("FooDao");

Foo foo = fooDao.create(webSite);
{
foo.setName("Administratoren");
foo.setSite(webSite);
//call a bunch of other setters
fooDao.update(foo);

return foo;
}

}
};

return DefaultContents.executeTransaciton(context, func);
}



public static Foo executeTransaciton(ApplicationContext applicationContext, Function f) {


TransactionTemplate transactionTemplate = getTransactionTemplate(applicationContext);

Foo retval = (Foo) transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {
return f.apply(applicationContext);
}
});

return retval;
}

我觉得这走错了路,因为

  • “executeTransaciton”方法被锁定为使用“Foo”对象。我猜它应该返回Object
  • 函数泛型有点奇怪。我想从 doMyDatabaseStuff 方法(即封闭方法范围)中的参数传入所有变量,而不是通过 apply(param) 方法传入。
  • 看起来我并没有在样板代码中节省那么多,我仍然需要向每个方法添加这个庞大的“函数”匿名类代码。

我走在正确的轨道上吗?...还是完全偏离了轨道?

最佳答案

如果所有不同之处在于您在 TransactionCallback 中执行的操作,只需将 TransactionCallback 作为参数传递给执行“样板事务处理”的方法,然后执行TransactionUtils:

private static Foo doMyDatabaseStuff(ApplicationContext context, WebSite webSite, TransactionCallback cb) {

//A. Do a bunch of boilerplate Transaction stuff

TransactionUtils transactionUtils = getTransactionUtils(context);

return (Foo) transactionUtils.execute(cb);
}

并从现有方法中调用此方法:

public static Foo doMyDatabaseStuff(ApplicationContext context, WebSite webSite) {
return doMyDatabaseStuff(context, webSite, new TransactionCallback() {
public Object doInTransaction(TransactionStatus ts) {

//B. Do a bunch of use case specific DB stuff

FooDao fooDao = (FooDao) context.getBean("FooDao");
Foo foo = fooDao.create(webSite);
{
foo.setName("Administratoren");
foo.setSite(webSite);
//call a bunch of other setters
fooDao.update(foo);

return foo;
}
}
});
}

关于java - 寻求使用函数式编程来解决重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51498662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com