![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技术讨论
sunshyran
人各有志,求同存异;学无止境,完美逼近
展开
-
交换操作的重要意义,以及它与赋值,拷贝的关系
不久之前,在阅读关于异常安全的内容时,看到一个赋值运算符的实现,与一般不同,是通过交换操作实现的,让我耳目一新,遂总结了下面的内容: 所谓赋值操作之类,实际就是对对象的生存管理,那么一般的, 对一个对象,只有创建和析构两种运算,析构无异常抛出,创建可能有异常当涉及两个对象时,设对象A,B。那么可以有赋值,拷贝,交换 共三种操作。先说一下三者的语义:拷贝:操作前A存在,B不存在,原创 2010-04-15 13:18:00 · 1350 阅读 · 2 评论 -
Eclipse重构——Separate Query from Modify
《重构——改善既有代码》Motivation坚持这样一条原则:任何有返回值的函数,都不应该有看得到的副作用。所以查询和修改必须分开。Mechanicsü 新建一个查询函数,其返回值与原函数相同;修改原函数,令他调用查询函数,并返回查询结果。ü 将调用原函数的代码改为调用查询函数。然后在调用查询函数的那一行之前调用原函数。ü 修改原函数,删除return语句原创 2013-04-14 21:36:29 · 930 阅读 · 0 评论 -
Eclipse重构——写在今日日落,期待明日日出
《重构——改善既有代码》剩下还有一些重构手法,在本blog系列《Eclipse重构——总章》中有提及,这些重构可以应用基本的Eclipse重构菜单,按照Martin Flower的建议步骤,亦步亦趋的完成。下面只是再特别强调几个。(更多的Eclipse重构菜单的使用,可以参考点击打开链接)1. [Introduce Factory],Eclipse中有直接对应菜单, 可以直接将原创 2013-04-15 22:21:44 · 1354 阅读 · 0 评论 -
设计模式推演——序
作为设计模式推演的序章,我们以一本书中的例子为序:我们有一些基本的设计原则, 复用+易用, 有OO 5P设计原则: ISP 接口隔离原则, LSP里氏替换原则,OCP 开闭原则,SRP单一职责原则, DIP抽象依赖倒置原则我们也有OO工具,封装,继承,多态最后也有基本的设计模式,各种工厂方法,Command模式等下面我们以数学中的代数为例子,介绍一下这原创 2013-04-27 22:37:37 · 1415 阅读 · 0 评论 -
设计模式推演——一切从需求分析开始
客户需求分析,实际上就是分析需求是否可以实现、需要修改哪些地方。理想情况下,我们的产品应该是对已有部分不做任何修改,而只是对新的需求做一些扩展,这就要求我们在设计时遵循开闭原则。事实上,需求分析贯穿于整个编码活动中,因为当代码之间相互协作时,一部分代码就是另一部分的客户。 开闭原则分为两部分,对修改关闭,对扩展开放。在OO语言下,对修改关闭,一般可以应用继承,使各需求共原创 2013-04-30 11:05:04 · 2285 阅读 · 0 评论 -
设计模式推演——创建型模式
上一篇文章中提到,在做代码设计时,坚持OCP原则,坚持一起从需求分析开始,分析当前代码中哪些是不变的,哪些是变化的,那么我们就可以做到简单而快速的响应客户需求。现在,我们来讨论创建型模式还是从需求分析开始,使用创建型模式,实际是为了将类名和类的创建解耦。换成变与不变的说法就是,产品名称可能经常发生变化或者有扩充,但是这些产品对象的使用方式不变。假设我们现在有产品类Wall(A,B,原创 2013-04-30 23:41:59 · 1510 阅读 · 0 评论 -
设计模式推演——组合与继承
OO中,复用代码可以有组合和继承两种方式,正如广大人民群众所论述的,尽可能使用组合。这里我再不厌其烦的说明一下理由:1. 组合比继承在框架结构上要简单,不会造成过深的继承层次。2. 组合是黑盒重用,抽象层次更高。其实上面这两条我觉得也没啥,重点还是下面三条:3.组合可以在运行时动态选择复用的对象,而继承不行。直接上图,相信您看一眼就明白了当Stack复用Sequen原创 2013-05-05 23:24:15 · 3783 阅读 · 0 评论 -
设计模式推演——整合已有系统接口(Facade/Adapter)
上一篇文章中,我们提到OO中复用的方式有两种,组合和继承。一般情况下,应该尽可能使用组合的方式。现在以复用为基本需求,推演若干常见组合型模式1. Facade模式 当整合已有系统接口时,或者跨层调用接口时,如果出现a. 觉得接口过多。那么可以根据特定的应用情景,提炼出一个最小覆盖子集,或者只是最常用的接口集。b. 觉得接口难用。那么可以通过封装,对原来做一些变形。这就是原创 2013-05-08 21:46:58 · 1510 阅读 · 0 评论 -
设计模式推演——装饰已有对象(Proxy/Decorator)
上一篇文章中,我们提到OO中复用的方式有两种,组合和继承。一般情况下,应该尽可能使用组合的方式。现在以复用为基本需求,推演若干常见组合型模式1. Decorator模式 需求:我们已经有一群对象,现在想统一为这些对象添加若干新特性。更重要的是,这些新特性可以反复叠加于某个对象,或者只选择部分特性作用于某个对象。条件:如果这个特性的实现不依赖于具体的对象,就如同添加一个装原创 2013-05-08 23:33:37 · 1622 阅读 · 1 评论 -
hmailserver 及其webmail的配置(仅限局域网内测试)---续
上一篇文章是在普通的网络中配置的,结果到公司的电脑上测试发现,问题大了先简单说明一下公司网络环境,禁止smtp 25端口,使用了代理设置。 拦路虎——代理设置。Foxmail网络设置中默认连接方式同IE连接设置,修改为不使用代理。如果使用代理,则要经过网络, 最终卡在SMTP 25 被禁的问题。拦路虎——服务器域名解析错误hmailserver服务器的服务器地址mail原创 2011-11-10 22:09:09 · 5645 阅读 · 1 评论 -
Eclipse重构——Replace TypeCode with Class
《重构——改善既有代码》Motivationü 类型码不是类型安全的,终究只是一堆数字或者一个字符串。使用类代替类型码,可以做更好的编译检查。ü 如果类型码不影响宿主类的行为,则优先考虑使用Replace Type Code with ClassMechanicsü 为类型码建立一个类。类中应该定义一组静态变量,表示允许被创建的实例。ü 修改源类实现,将类型码替换为原创 2013-04-14 08:49:25 · 1289 阅读 · 0 评论 -
Eclipse重构——Move Method(II)
《重构——改善既有代码》Motivation出现依恋情节或者职责不清,应将行为移动到正确的类中。Mechanics1 检查源函数中所使用一切特性(包括field和函数)2 检查子类和父类是否也定义了该函数3 先委托,然后根据实际情况,决定是否将对源函数的调用替换为对目标函数的调用。Eclipse re原创 2013-04-12 21:34:03 · 901 阅读 · 0 评论 -
模板参数:typedef,or macro
typedef 是一个聪明的孩子,他总是按语义翻译:typedef char* SPtr;那么当如下形式定义变量p,q时,SPtr p,q; //等价于char *p, *q; 定义的p,q都是char*的指针变量 相比之下,macro就不求甚解,它总是死板硬套#define char* SPtr;SPtr p,q;//等价于char原创 2010-05-03 10:51:00 · 1119 阅读 · 0 评论 -
为什么不C++
<br />为什么不C++?如今,C++日趋衰微,为什么越来越多的人选择了放弃呢?<br /> <br />一、 不喜欢C++的语法和句式<br />二、 C++结构太庞大,望而生畏<br />三、 不喜欢C++的模板<br />四、 不喜欢C++的异常<br />五、 不喜欢C++没有垃圾自动回收机制<br />或者其他的原因<br /> <br />相知道大家为什么不用C++呢?原创 2010-09-19 22:27:00 · 567 阅读 · 0 评论 -
Effective C++
<br />第1条: 把C++看作多种语言的联合体,不只是objective C, 还有template <br />第2条: 尽量使用const、enum、inline,避免使用 #define。<br />l 对#define 宏变量,用const 变量代替<br />l 对#define 宏函数,用模板函数+inline代替<br />l 早先的时候定义静态类常量时不能同时赋值,于是就用enum作为替代,当作静态类常量。现在的编译器都已支持原创 2010-09-19 22:31:00 · 509 阅读 · 0 评论 -
Effective C++ (II)
<br />第7条: 要将多态基类的析构函数声明为虚函数<br />l 有一些类是设计用作基类的,但是它们并未被设计成多态类,如uncopyable类[1]。<br /> <br />第8条: 防止因异常而中止析构函数<br />l 永远不要让析构函数引发异常。如果析构函数所调用的函数会抛出异常的话,那么析构函数中要捕捉到所有异常,然后忽略它们或者终止程序。[2]<br />l 在一次操作中,如果一个类的使用者有能力对抛出异常作出反应,那么这个类应原创 2010-09-27 23:56:00 · 394 阅读 · 0 评论 -
Effective c++ iii
<br /><br />第13条: 要使用对象来管理资源。[1]<br />l 为了避免资源泄露,可以使用 RAII 对象,使用构造函数获取资源,析构函数释放资源。<br />l auto_ptr 或 TR1::shared_ptr 是两个常用并且实用的 RAII 类。通常情况下 TR1::shared_ptr 是更好的选择,因为它的复制行为更加直观。复制一个 auto_ptr 将会使其重设为 null 。<br /><br /><br />第14条: 要原创 2010-10-02 09:25:00 · 549 阅读 · 0 评论 -
Eclipse重构——Move Field
Motivation如果某个field,在其所驻class之外的另一个class中有更多的函数使用了它,那么可以考虑将这个field移动到另一个class。Mechanics1 如果field属性为public,应该先使用EncapsulateField或者Self Encapsulate Field封装该成员。2 在target class中建立该field,同时应用Self原创 2013-04-11 09:59:22 · 1546 阅读 · 0 评论 -
使用Eclipse重构代码——Replace Temp with Query
Motivation局部变量会使代码难以被提炼,所以应该尽可能将他们替换为查询式。另外,ReplaceTemp with Query也是Extract Method的必要步骤。Mechanics1 如果临时变量被赋值多次,则应用Split Temporary Variable,将他分割成多个变量,每个新的变量只被赋值一次。2 对每一个临时变量,提取查询函数,然后替换。(如果原创 2013-04-10 23:31:19 · 2510 阅读 · 1 评论 -
Eclipse重构——Move Method(I)
Motivation出现依恋情节或者职责不清,应将行为移动到正确的类中。Mechanics1 检查源函数中所使用一切特性(包括field和函数)2 检查子类和父类是否也定义了该函数3 先委托,然后根据实际情况,决定是否将对源函数的调用替换为对目标函数的调用。Eclipse refactor菜单下直接有Move 选项,可以直接使用该选项完成Move Me原创 2013-04-11 22:38:40 · 2561 阅读 · 0 评论 -
Eclipse重构——Move Method(III)
《重构——改善既有代码》Motivation出现依恋情节或者职责不清,应将行为移动到正确的类中。Mechanics1 检查源函数中所使用一切特性(包括field和函数)2 检查子类和父类是否也定义了该函数3 先委托,然后根据实际情况,决定是否将对源函数的调用替换为对目标函数的调用。Eclipse refactor原创 2013-04-13 09:18:23 · 1628 阅读 · 0 评论 -
hmailserver 及其webmail的配置(仅限局域网内测试)
hmail server是一款免费的邮件服务器软件,可以从官方主页上下载。公司内部不能上网,所以想架设一个仅限局域网内使用的邮件服务器,从而实现对邮件收发等操作的流程跟踪和调试。 第一步,安装hmailserver,配置domain和邮件账号。请参考文章:http:/原创 2011-08-29 11:38:09 · 29620 阅读 · 7 评论