| Teddy_Ma_1982's profileTeddy's SpacePhotosBlogLists | Help |
There are no categories in use.
|
November 24 Teddy's Blog is moved, no furture update here...Teddy's Blog is moved to http://www.dotnetjunkies.com/weblog/teddy/. November 25 谁说动物不搞笑 - 笑话集锦大象死了
一天一个动物园里的大象死了,饲养员趴在大象身上大哭,游人见到无不感动。但是一个人一语道破天机,他问游人:“你们知道他为何哭吗?”游人说不知。他说:“这个动物园有个规定,谁养的动物死了,饲养员要自己挖坑埋葬。。。”
-
北极熊:现在轮到你摸我了
一位老先生要养宠物,于是便到宠物店告诉店员说:“给我一只特别的宠物。” 店员便带老先生到店后面,有一只大北极熊,老先生很高兴便决定买下来。 店员最后警告老先生说:“你什么都可以作,就是不要摸它的鼻子。”几天后,老先生实在忍不住了,便偷偷摸了一下它的鼻子,这时,北极熊“吼...” 的一声,突然用后脚直立起来,舞著巨掌,开始追著老先生。老先生于是拔腿就跑, 飞也似的逃命。终于,不幸的被逼到角落。此时,北极熊缓缓的靠近,伸出手掌,摸了一下老先生的鼻子说:“现在轮到你捉我了。”
-
老鼠爸爸:“泡猫去”
有一家老鼠吃完饭开始聊天,不知怎么就谈起了胆子的问题。小老鼠首先发言:“现在的人真坏,居然做出老鼠药想毒死我们,根本不管用,我吃那玩意儿跟吃饼干似的”。
老鼠妈妈说:“在旧社会,没有老鼠药。人们用老鼠夹子,我根本不怕,有时 想锻炼身体了就把那玩意儿拿来当健身器玩儿。” 老鼠爸爸听完以后站起来就往门外走,老鼠妈妈问:“你干什么去”? 老鼠爸爸坏坏地一笑:“泡猫去”。 -
小白兔快乐奔跑的原因
一只小白兔快乐地在森林中奔跑。
途中,它碰到一只正在卷大麻的长颈鹿,“长颈鹿呀!你为什要做伤害自己的 事呢?看这片森林多美好!让我们一起在大自然中奔跑吧!” 长颈鹿看看大麻烟,再看看小白兔,它把大麻烟向身後一扔,跟著小白兔在 森林中奔跑。 後来它们遇到一头准备吸古柯硷的大象,"大象呀!你为什么要做 伤害自己的事呢?看这片森林多美好!让我们一起在大自然中奔跑吧!” 大象看看古柯硷,再看看小白兔,它也把古柯硷向身後一扔,跟著小白兔和 长颈鹿在森林中奔跑。接著,它们遇到一头准备打海洛因的狮子,“狮子呀!你为 什么要做伤害自己的事呢?看这片森林多美好!让我们一起在大自然中奔跑吧!” 狮子看看针筒,再看看小白兔,它把针筒向身後一扔,冲过来把小白兔狠狠 地揍了一顿。“你为什么要打小白兔?”大象和长颈鹿紧张的问。狮子生气地说:“ 这混蛋兔子!每次嗑了快乐丸就拉著我像白痴一样在森林里乱跑。” -
蜘蛛和蜜蜂订婚了
蜘蛛和蜜蜂订婚了。
蜘蛛感到很不满意,于是就问他的妈妈:「为什么要让我娶蜜蜂?」 蜘蛛的妈妈说:「蜜蜂是吵了一点,但人家好歹也是个空姐。」 蜘蛛说:「可是我比较喜欢蚊子耶.. 」 蜘蛛的妈妈说:「不要再想那个护士了,打针都打不好,上次搞到妈水肿..」 蜜蜂也感到很不满意,于是就问她的妈妈:「为什么要让我嫁给蜘蛛呢?」 蜜蜂的妈妈说:「蜘蛛是丑了一点,但人家好歹也是搞网络的...」 蜜蜂说:「可是人家比较爱蚂蚁ㄚ..」 蜜蜂的妈妈说:「别再提那瘦巴巴的工头,整天扛着东奔西跑连台货车都没有..」 蜜蜂说:「那隔壁村的苍蝇哥也不错..」 蜜蜂的妈妈说:「他是长的蛮帅,但也不能拣个挑粪的..」 -
倒霉的小毛虫
瘦弱的小毛虫给漂亮的雀小姐发现了,连忙哀求道:「请不要吃我,我可以告诉你我同伴的住处,它们比我肥美的多呢!」雀小姐答:「不必了,我正在减肥。」说罢便把毛虫一口吃掉。
-
速度很快的乌龟
-
为什么在这里
小骆驼一天问爸爸说:「爸,我们的背上为什麽要有驼峰??」「因为我们在横越沙漠时要储存脂肪和水分呀!!」骆驼爸爸说。「那我们为什麽要有长睫毛呢??」「因为沙漠风沙大呀,可以保护我们的眼睛呀!!」「那我们的脚底为什麽要长肉垫呢?」小骆驼又问。「这样比较容易横度沙漠呀!!」骆驼爸爸很自豪的说!最後,小骆驼问:『那。。。。那我们现在在动物园干嘛??』
-
腿与蛋
农场中一猪与一母鸡在谈慈善。 猪说:"我很想有一个方法能帮助那些没有饭吃的穷人。" 母鸡说:"我们来合作,可以做一个火腿蛋给他们吃。" 猪摇头道:"你说得容易,你只是贡献了一个副产品,我却要不见一条腿。"
-
胡搞出来的孩子
老鼠:我现在正和蝙蝠谈恋爱,以后孩子们就生活在空中,不怕你们猫了。猫冷笑一声,指着树上的猫头鹰说:看见没有,她已经怀上我的孩子了!
-
学会祷告的鹦鹉
有一名贵妇养了一只母鹦鹉,
但这只鹦鹉只会说:「来ㄚ!要不要爽一下ㄚ......」 贵妇觉的这鹦鹉的行为实在有辱她的身份 有日贵妇看到对面教堂的神父也养了一只公鹦鹉,而且很乖的在笼子里祷告 於是便去请教神父:「为何你的鹦鹉那麽乖?养多久啦? 我把我家的鹦鹉给你调教好吗?」 神父:「我养两年啦,它ㄧ直都很乖,你的鹦鹉怎麽啦?」 於是贵妇便把家里那只说话低贱的鹦鹉的情形ㄧ五一十地说给神父听 神父ㄧ口答应:「好ㄚ,你把你的鹦鹉给我养,我保证它会和我的鹦鹉ㄧ样, 乖乖地在笼里祷告。」 隔日,贵妇把鹦鹉送给神父,神父便把母鹦鹉关在与神父的公鹦鹉同一个笼子, 希望能以近朱者赤的方法把母鹦鹉教化 未料,只见母鹦鹉一看见公鹦鹉便叫著:「来ㄚ!要不要爽一下ㄚ......」 只见正在祷告的公鹦鹉眼睛为之一亮:「神ㄚ,我祷告两年的愿望终於实现啦.......」 -
好nb的蚂蚁
一只蚂蚁在路上看见一头大象,蚂蚁钻进土里,只有一只腿露在外面。
小兔子看见不解的问:“为什么把腿露在外面?蚂蚁说:“嘘!别出声,老子绊他龟-儿子一跤!” 第二天,兔子看见整窝的蚂蚁排着队急匆匆赶路,问何故? 蚂蚁答:“昨天有头大象被我们一兄弟绊倒,摔成重伤,我们给那丫献血。” 没多久,兔子见大批蚂蚁又回来了,就问怎么回事,一只蚂蚁说:“哦,只有一个跟那大象的血型一致,留他一个在那抽血呢,足够。” 第三天兔子赶来问蚂蚁:那丫活了吗?蚂蚁无可奈何的说:我把它抬回去了,**真重,腰都累弯了,那丫也太不经得摔了! 大象病好后要告蚂蚁,法庭判决,蚂蚁绊倒大象属恶意伤害,监禁6个月。 蚂蚁不服,“人身伤害罪最多监禁2月,为何判我半年?” 法官:“人身伤害罪判2月,绊倒大象为种族歧视罪,追加4个月~~~” 于是蚂蚁向高级法院提出诉状:我等与大象本来平等,何来“歧视”,请高院明判,还我等清白,另诉法官诬陷罪。 一天兔子忽然看见一只大象躲在树后面,将一只腿伸在外面。就问:“ 你在干什么啊?” 大象说:“嘘!别出声,我tmd等那蚂蚁龟-儿子来,好拌他丫一下,为我兄弟报仇。” 兔子刚离开大象就听见大象一声惨叫,于是马上跑回去看,途中遇见一只蚂蚁在路边喘气。兔子还没问蚂蚁就听蚂蚁自己说话了:tmd想整老子,还好我发现的早。把脚给它踩断了哈!! 大象又被送回了医院,因为股动脉被踩断,这次失血更多,连输80l还不够,血库告急,而那只唯一与大象血型的相符的蚂蚁已经在上次输血后虚脱了。 过了几天大象突然死了,大家跑去看它。发现她旁边有只母蚂蚁。就问它大象是怎么死的。母蚂蚁哭着说:我就告诉它说我怀了它的孩子它就~~~~ 母蚂蚁产了一堆卵,孵啊孵啊,结果孵出一群鸵鸟,靠!大象死的真tmd冤啊 -
两只麻雀在树上吹牛
大麻雀对小麻雀说:”我可厉害了,什么动作我都可以做得出来。像俯冲啊,盘旋呀,什么高难度的动作我不会呀?”小麻雀很是不服气,可一时又找不出什么好的法子要难为它。恰好树下有一个屠夫正在切肉。于是,小麻雀就对大麻雀说:“你不是厉害吗?那你有本事飞下去从屠夫手中弄块肉上来吗?”大麻雀笑笑说:“小KS!”于是一个俯冲,飞到桌上叼了一块肉就要飞上树,可一下子被屠夫抓了个正着!屠夫非常生气,便一根一根地拔大麻雀的毛。大麻雀只呼:HELP!!!
小麻雀实在看不过去了。一下子飞下去,冲着屠夫的手就咬了一口,屠夫手一疼便把大麻雀放了,大麻雀拼命飞上树来,小麻雀说:“这下不吹牛了吧,要不是我救你,你早活不成了。”可大麻雀说:“谁要你救我呀?我正准备脱光了衣服跟他干呢。” -
猪的笑话
一男养一猪,特烦它,就想把它给扔了,但是此猪认得回家的路,扔了好多次都没有成功。某日,此人驾车弃猪,当晚打电话给他的妻子问:“猪归否?”其妻曰:“归矣。”男非常气愤,大吼道:“快让它接电话,我迷路了。”
-
企鹅和北极熊的共识
有一只企鹅,闲得没事干,拔自己毛玩拔光了,他说了一句话:真冷。 续集:有一只北极熊,闲得没事干,拔自己毛玩,拔光了,他说了一句话:那企鹅说得没错. November 24 With AOP, Component Oriented == Object Oriented在本人之前的《Component/Service Oriented Software System Development Thinking 》一文中,我将包括BinaryLevel和Source Code Level的软件模块统称为Component。这种分类方式,和传统的对Component的一般定义应该说并不是十分一致。本文就是要对我为什么要这样分类作一些补充解释。
-
传统的定义中,一般认为,Component Oriented和Object Oriented有本质区别,在O'Reilly的《Programming .Net Component》一书中,列举了两者的主要区别和Component Oriented的基本原设计准则。没看过的读者可以下载下来看看,这里给的链接只包含该书了第一章,当然,这里说的区别和设计准则是包含在这一章里的。
区别:
1. Building Blocks Versus Monolithic Applications - 多程序集还是单一程序集
2. Interfaces Versus Inheritance - 黑盒还是白盒
设计准则:
1. Separation of cnterface and implementation
2. Binary compatibility
3. Language idependency
4. Location transparency
5. Concurrency management
6. Version Control
7. Component-based security
-
那么,我为何将这两个原本有区别,区别似乎还不是很小的区别的概念归在一个统一的概念-“Component”中呢?
首先我们来谈谈,上面提到的两个主要区别。
原书的作者的主要观点是,组件总应该是语言无关的二进制级别的黑盒模型,而OO则一般是语言相关的源代码级别的白盒模型。接着又说到,组件的重用,一般是不去关心其内部细节,而以大颗粒的功能调用或类继承来使用;而OO则可以以细颗粒去继承,并且可以方便的通过设计模式的运用组合、拦截函数调用,插入代码、修改内部细节等等,类的继承,也可以是细颗粒的。因此,说两者有本质区别。
从作者考虑这个问题的角度,也是传统的组件定义的角度来说,以上的论点当然是不错的。但是,有一项思想或者说技术的出现,很大程度上打破了以上的界限,是什么技术呢?您可能已经词到嘴边了,没错——AOP。
-
关于AOP的基础思想介绍,我这里就不多说了,如果您还不是很了解,可以在博客园站内搜索一下AOP。我这里要为您说明的是,为什么有了AOP的思想,以上这种CO和OO的界限和区别就大大减弱了呢?
当然这里我要特别提一下,我这里指的AOP,主要指有二进制级别织入能力的AOP,如Teddy所写的一个.Net下的AOP工具AspectWeaver,而不仅仅是像Castle.Aspect#这样的基于DynamicProxy的AOP实现。
因为AOP的二进制级别的织入能力,更直白一点说,是AOP使得操作二进制级别的组件或者说程序集就和操作源代码级别的模块一样容易的能力,使得只要您愿意,就可以像有源代码的组件一样使用二进制的程序集。在二进制级别将一个程序集分解成多个程序集,或者多个程序集者病程一个程序集同样是轻而易举的。所谓黑盒还是白盒的区别,也就变得没有太大的意义了。现在都可以看作白盒。只要相应的源代码能够编译成相互兼容和可识别的二进制程序集,那么我们就能在二进制级别对程序模块进行任意的重用和改造。
当然,上面所列的组件化设计的基本原则,现在还是适用的。同时,这种二进制级别的细节操纵能力,使得AOP不但能够使用OO中所有可以使用的工具和设计思想,还是一个超集,可以做到许多超越OO限制的功能,如Mixin,接口实现,基类变更,静态代码拦截等等/插入/删除等等,感兴趣的朋友可以自查看相应的资料。
-
正是因为AOP的这种特殊能力,很大程度上破除了二进制组件和OO组件的界限,更将带来软件开发思想,可重用软件设计等的巨大变革,和很多以前实现不了的可能性变为现实。这样的变革的大致风貌我在之前的文章《重新诠释AOP》中已有些许描述,在稍后的《Looking into Component》中,我也将会有进一步阐述。敬请期待!
资料收集正在构思如何写下一篇文章《Looking into Component》,随手从网上摘的资料先在这里放一下~~
OO设计的重要原则
1.开闭原则 (Open-Closed Principle)
模块在开放性方面应该是开放的(易于扩展),在更改性方面应该是封闭的(易于修改而不需要更改类的源代码)。 实现OCP的技术主要有多态和模板,均基于抽象。我们应该努力实现OCP以高效地复用和维护代码。 2.Liskov替换法则 (Liskov Substitution Principle) 使用指向基类B(抽象类或者接口)引用的模块(方法或者类),必须能够接受任何继承或实现B的具体类S,仍然能够正常工作而不需要知道具体类的实现细节。 3.针对接口编程 组件之间应该尽可能使用接口进行通讯,具体的业务逻辑由子类去实现不变的接口。 4.将可变的部分和不可变的部分分离 任何时候都将不变的接口与可变的实现分离。 如果使用继承的复用技术,我们可以在抽象基类或接口中定义好不可变的部分,而由其子类去具体实现可变的部分。如果使用对象组合,我们可以定义好不可变的部分,而可变的部分可以由不同的组件运行时动态配置。 5.优先使用对象组合,而不是类继承 优先使用黑箱复用(对象组合)而不是白箱复用(类继承)。利用对象组合我们可以在运行时动态配置组件的功能,并防止类层次规模的爆炸性增长。 6.高内聚,低耦合 很简单的一句话却是软件设计的精华所在:一个模块包含的功能彼此相关,相互依赖,而与外界很少关联,并且没有承担过多的责任,这样的模块(子系统或者类)称之为高内聚的(High Cohesion)。如果一个模块为实现自身的功能,并不需要了解或者依赖太多外部的知识,则该模块是低耦合的(Low Coupling)。 7.使用多态机制消除大量的IF/CASE语句 大量的IF/CASE使得代码难于维护和扩展,我们应该用多态来取代条件判断逻辑,状态和策略模式都可以帮助实现这一机制。 8.在多线程程序中谨慎地使用Singleton模式 Singleton模式在多线程应用中的不恰当使用会导致性能问题,在用到该模式时尽可能使用lazy initialization 方法。 待补充。。。 November 23 Current Component/Service Oriented Software System Development Model本文是Teddy关于基于组件及服务为中心的软件系统开发的进一步思考的系列文章的第一篇,探讨Teddy对当前的基于组件及服务的软件系统开发现状及基本思想的理解。本系列文章一共三篇,在之后两篇中Teddy将站在“组件”这样一个点上分别Looking into组件和Looking outside“组件”这个点,从而分别思考对第一篇中描述的软件开发模型的改进的可能方案。Teddy并非软件开发方面的资深专家,而只是一位喜欢思考的普通程序员,对软件开发这样一门科学的认识难免是具有非常的局限性的,因此,本文的观点仅代表Teddy的个人见解,如果您认为文中的观点过于奇特或幼稚,或者有失偏颇的,欢迎给与批评指教。
Current Component/Service Oriented Software System Development Model
我将自己理解的这样一个模型,比较简单的画了一张MindMap图。
请下载下面的MindMap图,并打开html文件察看MindMap图。您的浏览器需要支持Java Applet,您的系统必须正确安装Sun的JRE v1.4+及相关浏览器插件。如果在察看MindMap图方面有问题的话,请自行查阅在浏览器中正确运行Java Applet的相关参考资料,Teddy并不承诺回答您这方面的问题,这里先说句抱歉。另外,如果不能察看Applet,也可以打开zip包内包含的pdf文件察看MindMap展开后的静态效果。
-
如果您已经能够正确察看上图,欢迎继续往下阅读!
在这个MindMap图中,我简单的将主要的元素分成左右两类,左侧是功能性的元素,右侧则主要是辅助的非功能性元素。
既然是Component/Service Oriented,左侧当然是Component和Service了。而右侧则是使得Services和Component能够协同工作的过程中,起主要作用的一些辅助工具。
-
让我们从左侧的Service开始。
什么是Service呢?
节点上我给出了简单注释 - Langauge Independent Components with Unified Language/Platform Independent Interfaces。具体来说,这里的Service泛指语言/平台无关的功能组件,它的对外接口的具体表现形式逻辑上就像一个Method,更具体的定义可以参见Teddy之前的文章《重新诠释SOA》中关于Service的定义,即:
-
Service - 一种执行接口,接受外部的调用请求,请求可以包含0到多个参数,根据参数处理该请求后,返回执行结果,结果包含处理的成功或失败状态及0到多个返回参数,其中每个请求参数或返回参数都由一个Key/Value对表示。
Service的特性:
1)封装了细节,只要接口和返回结果不变,被封装了的实现细节对用户并不需要关心;
2)一个Service内部可以调用其它Service来实现,甚至可以递归调用Service自身; -
根据Service当前的所在位置,基本可以将Service分为Local Service和非本地的Web Service。
请注意区别这里的Service的定义和Web Service的定义与业界关于SOA的标准定义中Service和Web Service的定义相区别。您可以以业界的标准定义来直观地理解上述,但是,这里的定义本质上是一个更高一级的抽象描述。
-
那么什么又是Component - 组件呢?
这里我简单的将所有可重用的平台/语言相关的源代码级别的功能模块和二进制模块统称为Component。您可以展开MindMap图中的下级树枝往下看。
每个本地组件都会通过一组接口与外界交互,和组件的定义一样,组件的接口,也可以是源码级或二进制级别的接口。
本地组件怎样才能通过其接口和外部交互呢?两种情况:本地交互或远程交互。
如果组件希望和同样存在于本地的提供同样的或者至少是可以识别的本地接口的其他本地组件交互的话,只需要在语言或者二进制级别互相Reference就可以了。
如果需要交互的组件不能直接通过本地接口来交互,那么我们需要先将语言/平台相关的本地接口映射到平台无关的通用接口(Unified Language/Platform Independent Interfaces)。这个Mapping的过程需要Mapping工具来辅助,而Mapping工具则通过一定的Metadata Configuration来定义映射细节。
接着,可以通过更高一级的平台无关接口级Reference或者通过TCP/IP与本地Service或外部Web Service进行交互。这两种交互的媒介虽然不同,但是,基本的原则一致。同时,不论是平台无关接口级Reference或者通过TCP/IP,都需要Checking一组Policy来进行一定的约束,例如安全性检查或其他Contract约定。
-
我们可以看到,根据这个基本模型,基本可以构造出从大到小,无论是Component Oriented或Service Oriented或Component/Service Oriented的软件系统。因此,我称其为我理解的“当前的基于组件及服务的软件系统开发的基本模型”。
|
|||||||||||
|
|