- 博客(144)
- 收藏
- 关注
转载 转载【openfire添加好友流程梳理】
由于项目中需要改造openfire添加好友流程,所以梳理了一份报文和表字段流程关系:从Presence的Type说起unavailable, 下线subscribe, 订阅subscribed, 同意订阅unsubscribe, 取消订阅unsubscribed, 拒绝订阅probe,探测error;错误说明:
2016-02-09 22:45:00
625
原创 第2章 基本数据类型的表现形式
2.2.2基本的浮点数指令浮点数操作是通过浮点寄存器来实现的,浮点寄存器通过栈结构来实现,由ST(0)~ST(7)组成
2012-02-07 21:25:26
592
转载 程序退出自动打印函数栈
#include#include#include#include #include static void WidebrightSegvHandler(int signum) { void *array[10]; size_t size; char **strings; size_t i, j; signal(sig
2011-12-14 18:54:28
674
原创 第四章计划:制定项目使命、愿景、目的和目标
4.1决定必须做什么:定义使命、愿景、目的和目标定义错误:第一个原因是人们自认为知道应该做什么,所以不再花时间去明确问题,使命和愿景。第二个原因是沟通问题。经常是虚假共识人气的。”阿比勒尼悖论“。4.2使命和愿景的区别愿景:人我们认为需要某件东西或者最好拥有某件东西。使命:要产生一个符合愿景的结果。项目使命总是为项目愿景服务的。项目经理的首要责任是确保项目发起人的项目愿
2011-11-27 23:41:53
9989
原创 第三章项目计划概述
3.1项目计划介绍3.1.1项目计划制定和客户需求首先,识别出谁是最重要的客户。质量功能展开(quality function deployment)是一种将客户需求转化成产品或服务特性的方法。3.2项目记录问题陈述。项目使命陈述。项目战略QFD分析文档项目范围说明合同要求需满足的现行规范工作分解结构进度计划资源需求控制系统主要贡献者
2011-11-27 22:41:42
603
原创 第二章 项目管理模型
2.1一种模型能适应所有项目吗?2.2模型概述2.2.1步骤一和步骤二:启动过程项目从概念开始,某人识别出对某事的需求。定义阶段是对项目所需解决的问题下一个好的定义。2.2.2步骤3:制定项目备选战略计划编制会涉及三个方面——战略,战术,逻辑。在技术性项目中,可以应用成熟技术,以降低风向;也可以应用前沿技术,以得到竞争优势,尽管风险会增加。通过头脑风暴法得到
2011-11-27 21:53:21
491
转载 java架构
Java架构:软件架构作为一个概念,体现在技术和业务两个方面。从技术角度来说:软件架构随着技术的革新不断地更新其内容,软件架构建立于当前技术和一些基本原则的基础之上。先说一些基本原则:分层原则:分层是为了降低软件深度复杂性而使用的关键思想,就像社会有了阶级一样,软件有了层次结构。模块化原则:模块化是化解软件广度复杂的必然手段,模块化的目的就是让软件分工。接口实现分离原则随着软件模块化
2011-11-26 00:22:53
727
转载 java主要技术
---------------------------------------------------------- Java EE 6 Technologies ---------------------------------------------------------- JSR 316 Java Platform, Enterprise Edition 6 (Java
2011-11-25 23:32:41
448
转载 java filterChain
从上图可以理解,FilterChain是过滤器链,也就是说,当有多个过滤器要执行时,通过这个参数调用下一个过滤器。FilterChain是应用服务器的对象。
2011-11-21 21:34:29
735
原创 第一章 项目管理概述
1.3项目定义项目是为创造独特的产品,服务或结果而进行的临时性事业。1.4另一种定义项目就是一个计划要解决的问题。1.5利害关系者项目的既得利益者:客户,供应商,贡献者,项目发起人,经理。利害关系者:在项目上有既得利益的任何人。客户:xiangmu1.6项目管理定义项目管理:在项目活动中应用各种知识,技能,工具和技术以达到项目要求,是通过项目管理过程——启动,计
2011-11-21 21:33:19
568
转载 redirect和forward区别
forward和redirect的区别1.从地址栏显示来说forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.2.从数据共享来说
2011-11-21 11:34:43
629
原创 第一章 设计之命题
将对一门艺术的领悟联系并应用到另一门艺术中,经历若干次这样的经历而有所悟,脑海里自然就孕育出了新思想。———培根1.培根所言是否正确设计过程本身是否存在那些适用于广泛设计载体的不便的属性?2.什么是设计计划,思维,后续执行。三步:概念性构想的形成,在真实的媒体中实现,在真实的体验中与用户交互。根本的软件构造部分是形成其概念性结构的心智过程,称之为次要的部分是其实现过程。交互
2011-10-31 11:28:27
385
原创 9.8 introduce assertion
某一段代码需要对程序状态做出某种假设。动机:使用断言明确标记假设。断言是一个条件表达式,应该总是真,如果失败,表示程序员犯了错误。做法:如果发现代码假设某个条件始终为真,就加入一个断言明确说明这种情况。断言用来检查“一定必须为真”的条件。
2011-10-20 22:22:12
501
原创 3.22 comments (过多的注释)
如果需要注释来解释一块代码,试试extract method如果函数已经提炼出来,还需要注释,试试rename method。如果还需要注释说明某些系统规格,试试introduce assertion
2011-10-20 22:15:51
415
原创 3.21 refused bequest
如果子类复用类超的行为,却又不愿意支持超类的接口。应该运用replace inheritance with delegation达到目的。
2011-10-20 22:13:47
466
原创 3.20 Data class(纯稚的数据类)
拥有一些字段,以及用于访问这些字段的函数,除此之外一无长物。这样的类只是一种不会说话的数据容器,它们几乎一定被其他类过份细琐的操控着。使用encapsulate field封装起来。使用encapsulate collection把它们封装起来。对于那些不该被其他类修改的字段,请运用remove setting method。搬移相关函数后,运用hide method。
2011-10-20 22:07:56
675
原创 7.8 Introduce local extension (引入本地扩展)
需要为服务类提供一些额外函数,但你无法修改这个类。建立一个新类,使它包含这些额外函数。让这个扩展品成文源类的子类或包装类。动机:所谓本地扩展是一个独立的类,但也是被扩展类的子类型:它提供源类的一切特性,同时额外添加新特性。在任何使用源类的地方,都可以使用本地扩展取而代之。如果有其他对象引用了就对象,就同时有两个对象保存了原数据。做法:建立一个扩展类,将它作为原始类的子类或包
2011-10-20 21:47:22
620
原创 7.7 introduce foreign method(引入外加函数)
需要为提供服务的类增加一个函数,但你无法修改这个类。动机:添加外加函数实现无法修改服务类的新功能。做法:在客户类中建立一个函数,用来提供你需要的功能。=》这个函数不应该调用客户类的任何特性。如果它需要一个值,把该值当作参数传给它。以服务类实例作为该函数的第一个参数。旧代码Date newStart = new Date(previousend.getYear(),
2011-10-20 21:35:17
641
原创 3.19 Incomplete library class(不完美的库类)
如果你只想修改库类的一两个函数,可以运用introduce foreign method;如果想要添加一大堆额外行为,就得运用introduce local extension。
2011-10-20 21:25:04
1404
原创 11.7 extract superclass (提炼超类)
两个类有相似特性为这两个类新建一个超类,将相同特性移至超类。动机:两个类以相同的方式做类似的事情,或者以不同的方式做类似的事情。做法:为原本得类新建一个空白的抽象超类。运用pull up field,pull up method和pull up constructor body逐一将子类的共同元素上移到超类。检查留在子类中的函数,看它们是否还有共通成分。如果有,可以使用
2011-10-20 21:10:34
699
原创 3.18 alternative classes with different interfaces(异曲同工的类)
如果两个函数做同一件事,却有着不同的签名,请运用rename method根据他们的用途重新命名。或许可以使用extract superclass。
2011-10-20 20:51:29
449
原创 11.11 replace inheritance with delegation(以委托取代继承)
某个子类只使用超类接口中的一部分,或是根本不需要继承而来的数据。在子类中新建一个字段用以保存超类;调整子类函数,令它改而委托超类;然后去掉两者之间的继承体系。动机:一开始继承了一个类,随后发现超类中的许多操作并不真正适用于子类。这种情况下,你所拥有的接口并未真正反映出
2011-10-19 11:29:09
1055
1
原创 8.8 change bidirectional association to unidirectional (将双向关联改为单向关联)
两个类之间有双向关联,但其中一个类如今不再需要另一个类的特性。动机:双向关联很有用,但你必须为它付出代价,那就是维护双向连接。大量的双向连接也很容易造成“僵尸对象”。双向关联也迫使两个类之间有了依赖:对其中一个类的任何修改,都可能引发另一个类的变化。做法:
2011-10-19 10:59:00
1359
原创 3.17 inappropriateintimacy (狎昵关系)
有时会看到两个类过于亲密,花费太多时间去探究彼此的private成分。可以采用move method和move field划清界限。可以运用change bidrectional association to unidirectional让其中一个类对另一个类斩断情丝。如果情
2011-10-19 10:39:19
943
原创 6.2 inline method (内联函数)
一个函数的本体与名称同样清楚易懂。在函数调用点插入函数本体,然后移除该函数。动机:某些函数,其内部代码和函数名称同样清晰易懂。可以去掉该函数。手上有一群组织不合理的函数,将它们都内联到一个大型函数中,再从中提炼出组织合理的小型函数。如果别人使用了太多间接层,使
2011-10-19 10:28:45
990
原创 7.6 remove middle man(移除中间人)
某个类做了过多的简单委托动作。让客户直接调用受委托类。动机:随着受托类的特性越来越多,这一过程让你痛苦不已,服务类完全变成一个中间人,此时应该让客户直接调用受托类。做法:建立一个函数,用以获得受托对象。对于每个委托函数,在服务类中删除该函数,并让需要调用该
2011-10-19 10:20:04
454
原创 3.16 Middle Man(中间人)
过度使用委托,某个类的接口有一半的函数都委托给其他类,这样就是过度运用。应该使用remove middle man,直接和真正负责的对象打交道。如果这样的函数只有少数几个,可以运用inline method把它们放进调用端。如果这些middle man还有其他行为,可以运用rep
2011-10-19 10:06:55
427
1
原创 7.5 hide delegate (隐藏委托关系)
客户通过一个委托类来调用另一个对象。在服务类上建立客户所需的所有函数,用以隐藏委托关系。动机:封装意味每个对象都应该尽可能少了解系统的其他部分。如此一来,一旦发生变化,需要了解这一变化的对象就会比较少。如果某个客户先通过服务对象的字段得到另一个对象,然后调用后者的
2011-10-19 10:02:41
1010
原创 3.15 message chains (过度耦合的消息链)
一个对象请求另一个,后者在请求下一个对象,....这就是消息链。采取这种方式,意味客户代码将与查找过程中的导航结构紧密耦合,一旦对象间的关系发生任何变化,客户端就不得不做出相应修改。这时候应该使用hide delegate。通常更好的手法:先观察消息链最终得到的对象是用来
2011-10-19 09:50:05
1430
原创 3.14 temporary field (令人迷惑的暂时字段)
某个对象的实例变量仅为某种特定情况而设。在变量未被使用的情况下猜测当初其设置目的,会让你发疯。请使用extract class给这些变量创造一个家。如果类中有一个复杂算法,需要好几个变量,往往就可能导致temporary field,由于实现者不希望传递一长串参数,所以他
2011-10-19 09:43:33
1139
原创 3.13 speculative generality (夸夸其谈未来性)
如果所有装置都会被用到,那就值得那么做,如果用不到,就不值得。用不上的装置只会挡你的路,所以,把它搬开。如果某个抽象类其实没有太大作用,请运用collapse hierarchy,不必要的委托可运用inline class除掉。如果函数的某些参数未被用上,实施remove p
2011-10-19 09:35:56
689
原创 11.9 collapse hierarchy (折叠继承体系)
超类和子类之间无太大区别。将它们合为一体。动机:继承体系很容易变的过分复杂。所谓重构继承体系,往往是将函数和字段在体系中上下移动。完成这些动作后,很可能发现某个子类并未带来该有的价值,因此需要把超类与子类合并起来。做法:选择想移除的类,是超类还是子类。使用
2011-10-19 09:30:52
1051
原创 3.12 lazy class(冗赘类)
你所创建的每一个类,都得有人去理解它,维护它,这些工作都是要花钱的。如果一个类的所得不值其身价。它就应该消失。某个类原本对得起自己的身价,但重构使它身形缩水,不再做那么多工作;或开发者事前规划了某些变化,并添加一个类来应付这些变化,但变化实际上没有发生。如果某些子类没有工
2011-10-19 09:26:06
675
原创 3.11 parallel inheritance hierarchies (平行继承体系)
如果为某个类增加一个子类,必须也为另一个类相应增加一个子类。如果发现某个继承体系的类名称前缀和另一个继承体系的类名称前缀完全相同,便是这种坏味道。策略:让一个继承体系的实例引用另一个继承体系的实例。如果再接再励使用move method和move field,就可以将引用端的
2011-10-19 09:20:49
1408
原创 9.7 introduce Null object (引入null对象)
需要再三检查对象是否为null。将null值替换为null对象。动机:当某个字段是null时,多态可以扮演另一个较不直观的用途。控对象一定是常量,它们的任何成分都不会发生变化。做法:为源类建立一个子类,使其行为就像是源类的null版本。在源类和null子类
2011-10-18 15:16:56
876
原创 10.6 replace parameter with explicit methods(以明确函数取代参数)
有一个函数,完全取决于参数值而采取不同行为。针对该参数的每一个可能值,建立一个独立函数。动机:如果某个参数有多种可能的值,而函数内又以条件表达式检查这些参数值,并根据不同参数值做出不同的行为,那么就应该使用本项重构。如果以参数决定函数行为,那么函数用户不但需要观察该函
2011-10-18 14:42:05
618
原创 9.6 replace conditional with polymorphism (以多态取代条件表达式)
条件表达式,根据对象类型的不同而选择不同的行为。将这个条件表达式的每一个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。动机:多态使你不必编写明显的条件表达式。如果同一组条件表达式在程序许多地方出现,那么使用多态的收益是最大的。做法:使用re
2011-10-18 11:14:23
1789
原创 3.10 witch statements(switch 惊悚现身)
面向对象程序的一个最明显特征是:少用switch语句。switch语句常常根据类型码进行选择,所以应该使用extract method将switch语句提炼到一个独立函数中,再以move method将它搬移到需要多态性的那个类里。此时决定是否使用replace type c
2011-10-18 10:46:30
765
原创 8.5 replace array with object (以对象取代数组)
有一个数组,其中的元素各自代表不同的东西。以对象替换数组,对于数组中每个元素,以一个字段来表示。动机:一个数组容纳了多种不同对象。可以运用字段名称和函数名称来传达这样的信息。做法:新建一个类表示数组所拥有的信息,并以其中一个public字段保存原先的数组。
2011-10-17 11:21:49
624
原创 8.15 replace type code with state/strategy (以state/strategy取代类型码)
有一个类型码,会影响类的行为,但你无法通过继承手法消除它。以状态对象取代类型码。动机:如果类型码的值在对象生命期中发生变化或其他原因使得宿主类不能被继承。如果打算在本次重构后以replace conditional with polymorphism简化一个算法,
2011-10-17 11:05:59
590
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人