读易[13]·闲谈中医与AOP

来源:互联网 发布:leancloud 修改数据库 编辑:程序博客网 时间:2024/04/28 07:33

人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




人处理的信息量有限,在面对复杂庞大的系统时,我们需要采用分而治之的方法。在软件设计领域内,出现了风靡一时的面向对象,它的前身可以说是模块划分。将系统分成一块块的似乎非常自然。但现在又出现了AOP的思想,它从另外一个角度划分子系统。这点倒和中医的思想有相似之处。

一、AOP基本思想

这里介绍一本书"Aspect-Oriented Software Development with Use Cases"——《基于用例的面向方面软件开发》,对AOP的思想做了详细的分析。这里借用它里面的例子说明AOP的思想和OO的思想有什么不同。

拿酒店的例子来说,有三个用例:预定房间、登记入住、结帐离店。首先采用OO的思想分析出如下三个类:Room,Reservation,Payment。


 

对于用例“预定房间”,我们需要调用Room.checkAvailability,Reservation.create。
对于用例“登记入住”,我们需要调用Room.assignCustomer,Reservation.consume,Payment.createBill。
对于用例“结帐离店”,我们需要调用Room.removeCustomer,Payment.payBill。

采用OO的思想,可以将房间相关的信息封装到Room类中;将预定相关的信息封装到Reservation类中;将帐单相关的信息封装到 Payment类中。但这就存在一个问题,如果我们需要了解“登记入住”的情况,那么我们需要同时关注以上的所有类,也就是说OO的方式并不能将关注点分离在一定范围之类。

如果采用AOP的思想,我们将所有和“登记入住”方面的信息聚合起来。如下的AspectJ代码所示:

public aspect CheckInCustomer {

    public void Room.assignCustomer()
    {    // 客户入住
    }
    public void Reservation.consume()
    {    // 删除预定信息
    }
    public void Payment.createBill()
    {    // 生成帐单
    }

}

这样在我们关注“登记入住”时,可以将关注点集中在CheckInCustomer方面中。可以看到aspect与class是从两个维度来分析系统的。

二、划分子系统的两个维度

对比OO与AOP的思想,可以发现OO是纵向地切割系统,将系统划分成一个个的模块。AOP则是横向地观察系统,将不同模块中有关联的地方联系起来。这样我们在划分子系统的时候就有了OO与AOP这两个纬度。

OO是从早期的模块划分演化过来的,可以有效降低系统的复杂度,提高模块的复用性。但OO却有自身天然形成的局限性:无法有效地处理横切关注点。

AOP正是为了克服上面所说的问题创建的。这里我们不能简单地将AOP理解为单纯的技术手段,而应该像OO一样认为它是一种思想。AOP的核心就在于横切关注点。

通过融合OO与AOP的思想,能更加全面地了解这个系统的结构。

三、中医的角度

中医将人体分为金木水火土五大子系统,但这个子系统划分不是OO的思想,而是和AOP的思想有些类似。

子系统子系统子系统子系统子系统 脉 筋 肉 皮 骨 面 爪 唇 毛 发 汗 泪 涎 涕 唾 舌 目 口 鼻 耳 喜 怒 思 忧 恐

看上面这个表格,拿肺来说,《黄帝内经》中写道“西方白色,入通于肺,开窍于鼻,藏精于肺。故病在背。其畜马,其谷稻,其应四时,上为太白星,是以知病之在皮毛也。”

一般来说,肺有问题的人嗅觉都不是特别灵敏,因为肺与鼻子的关系是很大的。同时这样的人也比较容易忧虑。中医就采用这种方式,将在西医概念下不甚相干的几个部分联系在一起了。

再给大家说个小例子。以前有个朋友说最近失眠,睡不着。我看了点中医的书,懂些皮毛,于是告诉她说,“如果你这两天被人惹生气了,估计失眠就会好。”

正常人一看,“生气和失眠有什么关系?”所以她当然不信了。现在倒是可以给大家说说分析过程。

失眠是思虑过多引起的,从上面的表可以看到,思虑和脾是同一个aspect,也就是说问题在脾上面。脾属土,五行之中木克土。木属性的系统是肝。肝和发怒是同一个aspect,我们平时说生气就是“大动肝火”。所以如果人生气的话,肝子系统的功能会提升,木克土可以抑制脾的系统,也就能够治失眠了。过程如下图所示:


上面的推理过程涉及到了两个方面——肝、脾。这正是中医中划分子系统的策略,将有关联的部分作为一个子系统看,并不完全依据器官的物理位置。如果是用西医的方法,吃点安眠药就好,很明显地和中医大不相同。

如果不明白中医划分子系统的方式的话,中医在我们眼中就是神秘或者骗人的把戏了。但明白之后,其实就这么简单,通过推理任何人都会运用中医。

当然,后来我的朋友因为一点事情生气,结果失眠果然好了——如果不是这样的话,这件事我也不会在这里说出来:)

四、待续...

从上面的分析可以看到中医划分子系统的方式和现在软件的AOP有相似之处,西医采用的方式类似于OO。不过可惜AOP不是中国人提出来的,但同时也看到了我们中国传统文化中的高明之处。

本来这篇文章和易经没有什么关系,但这篇文章是我接下来要写得文章的一个铺垫。姑且就让它占用读易系列的一个位置好了。

今天刚和人聊天时说,我们程序员应该多看些杂书,不然以后只认识代码了。从杂书中触类旁通,肯定可以学到不少东西。不是我自恋,我一直认为中国的 “杂书”们博大精深,其他国家的“正书”全部比不了,给我们的“杂书”当孙子辈都不够格。当然,更关键的在于我们别让这些“杂书”失传了的好。 




原创粉丝点击