本文介绍了飞镖/扑翼的巨蟒装饰风格的设计模式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望在可以包装函数或类方法的类似装饰器的功能中具有通用的try/Catch/Finish逻辑。考虑以下场景:
Class MyClass {
void someMethodA() {
doSomeInitialWork();
try {
doSomething();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
void someMethodB() {
doSomeInitialWork();
try {
doSomethingElse();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
}
等等。每个方法的唯一部分只是try
主体。如果我有一堆方法,其中一些需要相同的逻辑,有没有办法避免冗余代码?
理想情况下,它可以是如下语法:
@wrapper
void someMethodA() {
doSomething();
}
@wrapper
void someMethodB() {
doSomethingElse();
}
MyClassInstance.someMethodA(); // call it like this and the wrapper takes care of everything
但我知道这些是DART中的批注,不适用于此处。
更新
按照Jamesdlin的回答,我正在尝试将匿名函数解决方案合并到未来/异步/等待场景中:
Future<dynamic> trySomething(Future<dynamic> Function() callback) async {
doSomeInitialWork();
try {
return await callback();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
class MyClass {
Future<List<String>> someMethodA() async {
return await trySomething(() async {
return await someApiCall();
});
}
}
这似乎很管用,但看起来有点乱。我不确定我在异步/等待示例中所做的操作是否合适。
推荐答案
DART中的匿名函数相当常见(不同于lambda
是非常受限的)。
因此,您可以创建一个将唯一部分作为回调的帮助器函数。
void trySomething(void Function() body) {
doSomeInitialWork();
try {
body();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
void someMethodA() {
trySomething(() {
doSomething();
});
}
void someMethodB() {
trySomething(() {
doSomethingElse();
});
}
test()
中的test()
(或testWidgets()
中的)基本上就是这样做的。
更新评论中描述的情况:如果方法返回Future
s,则没有太大区别。例如,如果您以:
Future<List<String>> someMethodA() async {
return await blah();
}
然后您可以执行以下操作:
Future<R> trySomethingAsync<R>(Future<R> Function() body) async {
doSomeInitialWork();
try {
return await body();
} catch (err) {
throw err;
} finally {
doSomeCleanUpWork();
}
}
Future<List<String>> someMethodA() {
return trySomethingAsync(() async {
return await blah();
});
}
这篇关于飞镖/扑翼的巨蟒装饰风格的设计模式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!