昨天去参加杭州一些朋友组织的圆桌技术交流,鱼哥 @nnfish分享了一个关于python的话题
,另外一位兄弟分享了一下Vim的一些使用心得,最后升哥分享了Redhat Linux安装过程背
背后所执行的逻辑。三个分享都给我不少的收获,经常参与这样的交流是学习的最佳途径。
鱼哥的分享中提到python中的一个Decorator的特性,这个特性和我最近在看的一篇文章中
提到的有异曲同工之秒。 如下是Java的实现:
public void wrapInTransaction(Command c) throws SQLException {
setupDataInfrastructure();
try {
c.execute();
completeTransaction();
} catch (RuntimeException ex) {
rollbackTransaction();
throw ex;
} finally {
cleanUp();
}
}
public void addOrderFrom(final ShoppingCart cart, final String userName,
final Order order) throws SQLException {
wrapInTransaction(new Command() {
public void execute() throws SQLException{
add(order, userKeyBasedOn(userName));
addLineItemsFrom(cart, order.getOrderKey());
}
});
}
再让我们看看groovy是如何做的:
public class OrderDbClosure {
def wrapInTransaction(command) {
setupDataInfrastructure()
try {
command()
completeTransaction()
} catch (RuntimeException ex) {
rollbackTransaction()
throw ex
} finally {
cleanUp()
}
}
def addOrderFrom(cart, userName, order) {
wrapInTransaction {
add order, userKeyBasedOn(userName)
addLineItemsFrom cart, order.getOrderKey()
}
}
}
最近我们再来看看python中通过Decorator实现的代码:
def transaction(func):
def _wrapper(*args,**kwargs):
setupDataInfrastructure()
func(*args,**kwargs)
completeTransaction()
return _wrapper
@transaction
def addOrderFrom(cart,userName,order):
add(order,userKeyBasedOn(userName))
addLineItemsFrom(cart,order.getOrderKey())
昨天参加了杭州一些朋友组织的圆桌技术交流。鱼哥 @nnfish分享了一个关于python的话题,另外一位兄弟分享了一下Vim的一些使用心得,最后升哥分享了Redhat Linux安装过程背后所执行的逻辑,明白了自己定制Linux时的基本原则。三个分享都有收获,经常参与这样的交流是学习的最佳途径。
鱼哥的分享中提到python中的一个Decorator的特性,这个特性和我最近在看的一篇文章《组合方法与SLAP》中讲述SLAP提到的设计有异曲同工之秒。 如下是Java的实现,使用了匿名内部类来包装要执行的逻辑:
public void wrapInTransaction(Command c) throws SQLException {
setupDataInfrastructure();
try {
c.execute();
completeTransaction();
} catch (RuntimeException ex) {
rollbackTransaction();
throw ex;
} finally {
cleanUp();
}
}
public void addOrderFrom(final ShoppingCart cart, final String userName,final Order order) throws SQLException {
wrapInTransaction(new Command() {
public void execute() throws SQLException{
add(order, userKeyBasedOn(userName));
addLineItemsFrom(cart, order.getOrderKey());
}
});
}
再让我们看看文中提到的使用groovy是如何做的:
public class OrderDbClosure {
def wrapInTransaction(command) {
setupDataInfrastructure()
try {
command()
completeTransaction()
} catch (RuntimeException ex) {
rollbackTransaction()
throw ex
} finally {
cleanUp()
}
}
def addOrderFrom(cart, userName, order) {
wrapInTransaction {
add order, userKeyBasedOn(userName)
addLineItemsFrom cart, order.getOrderKey()
}
}
}
Groovy的做法明显比Java简洁了,不过对业务代码的侵入性还是存在的。
最后再来看看python中通过Decorator 实现上述设计的代码(下面代码只为阐述Decorator):
def transaction(func):
def _wrapper(*args,**kwargs):
setupDataInfrastructure()
func(*args,**kwargs)
completeTransaction()
return _wrapper
@transaction
def addOrderFrom(cart,userName,order):
add(order,userKeyBasedOn(userName))
addLineItemsFrom(cart,order.getOrderKey())
也可能通过如下方法调用:
transaction(addOrderFrom(cart,userName,order))
从上面三个例子可以看出语言层提供的特性深深影响着开发者的思唯方式,也这是为什么如何成为优秀的程序员的书中提倡开发者学会多种语言。目前正努力学习Python中,之前看这的Groovy又都快忘记了,要熟悉工作之外的编程语言并不容易。