`

2013-06-23 - note 面试 7 ~~~ 非侵入式设计 和 侵入式设计

 
阅读更多

侵入式设计有时候表现为客户端需要继承框架中的类,而非侵入式设计则表现为客户端实现框架提供的接口。 


非侵入式设计 和侵入式设计 意思? 
http://hi.baidu.com/westsky/item/5e655734213e4685c2cf29b7 

扫盲:POJO、非侵入式设计 
http://blog.csdn.net/yuyuyuck/article/details/5192978 

2 Struts2的优点与Struts1的区别: 
http://elf8848.iteye.com/blog/340531 



校内网的人气与非侵入式程序设计 
http://blog.renren.com/share/220933412/4420827440 

校内网的人气与非侵入式程序设计 
     校内网很有人气很高,甚至已经开始通过校内通在聊天软件界开始分一杯羹。不过校内通不是我想说的重点,我想到的是,同为人与人交流的工具,一个网页版留言的校内网,和老牌聊天软件QQ究竟有什么本质上的不同,为何在QQ已经占领聊天软件国内市场的时候,校内网仍有其竞争力。 


     校内网的真实身份是一方面,但是相信大多数有QQ号码的同学一定也有着很多真实身份同学的QQ号码,为何要在校内网上交流而不是QQ对话呢?可能最大的不同是校内的一般回复是所有人可见的,个人分享内容也都会广播至他人的主页,接受这些信息的人往往是被动的,而在QQ中对于一个人近况/变更的获取则往往需要主动的操作。 

     我觉得这其中可能隐含了学生时代的一种常见的交流方式,我姑且称之为非侵入式交流 
所谓非侵入式交流,就是不需要对方作出直接回应甚至不需要对方回应的交流方式,比如我认为他/她很有趣(姑且称之为小z,喜欢搞笑的同学也可将其替换为小b阅读),希望和小z成为好朋友,但直接切入比较突兀,所以我 


A、观察小z与其他人交流的过程,借此进一步了解小z 
B、让小z观察到我与其他人交流的过程,借此让小z进一步了解我(比如你现在都看到这一行了) 


      以上两个过程并不需要我与小z的直接交流,但我们都能够了解彼此的为人/习性.如果我们感觉彼此能成为好友(同流合污,沆瀣一气,一丘之貉,狼狈为奸),那么接下来的切入就会比较容易接受。如果我和小z觉得彼此不合(冤家路窄,相见恨早)也就不会深入交流,自然疏远。 


      与之相比,QQ的交流方式是直接交流,我则称之为侵入式交流,要求交流的双方遵守共同的约定:交流必须有所回应。就像面对面说话一样,我的留言是是希望对方在倾听,能给予我相应的交流。倘若两人对路,QQ上你一言我一语说的开心倒也罢了,若是我QQ上说了[a-zA-Z0-9],对方只回了个p或连p都不鸟我一个,那真是热脸贴在冷pp上,尴尬郁闷就别提了。 


      因此能在QQ上对话的,都比较熟识,彼此对话不会太突兀。我觉得这就是QQ不比校内交流的一点,失败成本高。非侵入式交流的失败成本则低得多,倘若你看小z主页9999次/天,小z只看你主页1次/年,说明小z基本不鸟你。但即使小z看你主页1次/一生,你仍然可以看小z主页99999999次/天,没有太大的失败感。就像上学时看一女生999999次/天,她一眼都不鸟我也无所谓,但和她说10句话,她一句也不鸟我,我直接崩溃。 

      不过非侵入式交流需要一定的人口密度和足够近的距离,你和前面的哥们吹牛x,就像扫雷点出个8一样,周围全都听得清楚,可我个高坐最后一排,要想让坐第一排的小y注意到我,我只好下课跑到第一排吹牛x。校内网模拟的,就是这种密集的交流密度,无任何距离限制,只要是一般的回复,或分享自己的资源,不管好友想不想看都会被动接受这一信息,这就创造了密集的非侵入式交流的机会,因此比起QQ中的熟人聊天更有校园的感觉。 


      那么在长时间的校园生活中,总会认识很多死党,彼此也都是直接交流,留下快乐时光最多的当然也是和他们在一起的时候,为何说非侵入式交流更有校园的感觉呢?这里我想引用《录取通知》(Accepted)中巴特比的激情演讲来解释,那就是possibilities,也就是可能性。 

      与那些还没有机会,没来得及彼此了解而又有趣的同学相比,死党们可说是“天涯若比邻”,反正小学和我混得好的同学,我啥时候再去跟他混都没啥的。但是一旦毕业,和那些仍没有机会、没来得及了解而又有趣的同学之间的非侵入式交流的机会就全然失去,所以有时反而觉得他们才是毕业时令人惋惜之处。因为没有了这些“可能性”,没有了了解小w的机会,小x的机会...... 


      校内网为这些人也提供了一个彼此交流的机会。即使我和小y之后也就是这么互相看看主页,但彼此有了这种“可能性”。除以上原因外,为最大化达成六度理论,增加同学之间连通图的密度,校内网有着共同好友统计的功能,借此增加不曾相识同学的交流机会。好友密度的增加,增强了非侵入式交流的密度和效果。就像一个闹哄哄的班级,有人在吹牛x,有人在打牌,有人在说悄悄话,有人在玩游戏,(当然也有某些人在学习....)这样的校内比一大群人隐身不说话的QQ有吸引力。 

      说到悄悄话我又想到,校内的悄悄话也是一个颇具心计的设计。且不论所有的对话并不是都想让所有人看到这一实用性方面考虑,在默认是所有人可见的回复中,悄悄话暗示着,在此次对话中,对方是特别的。而QQ中除去群外与每个人的交流都是一对一,则不会显出这种特殊性。 

      下文中多为程序相关,看着头大的可直接跳过看结尾 


      在程序设计中,有着侵入性和非侵入性两种,所谓侵入式代码就是如果想使用第三方库A,则自己的代码必须作出一定修改,以适应库A的适配要求。而非侵入性则是指库A有着一定的适应性,自己的代码无需调整就可以使用库A的功能。库A的设计决定了其被接受的程度,大家当然希望不修改自己的代码就能使用额外的功能。 

      比如A库是一个二维向量计算库,叫Vec2,那么向量有x和y两个分量,于是如下设计其基本的向量结构:(c++为例) 
namespace A 
{ 
struct Vec2 
{ 
public : 
double GetX(); 
double GetY(); 
void SetX(double x); 
void SetX(double y); 
private : 
double x; 
double y; 
}; 

//为其重载如下常见运算 
Vec2 operator+(const Vec2& lhs,const Vec2 rhs); 
Vec2 operator-(const Vec2& lhs,const Vec2 rhs); 
Vec2 operator*(const Vec2& lhs,const Vec2 rhs); 
...... 
} 
      这要求使用A库的代码在执行向量相关代码时都必须使用你的Vec2类,可是现实总是很麻烦,他们以前有自己的Vector2类,只不过他们的Vector2类太慢,而你的A库则使用了amtel公司最新的sse999指令集优化,他们希望提升性能,但替换成Vec2类工程浩大,于是A库的候选等级大打折扣。 

那么如何来写A库呢? 
namespace A 
{ 
struct Vec2 
{....//同上 
}; 
//template编程法 
template<class T> 
T add(const T& lhs,const T& rhs) 
{ 
return T{ 
        lhs.GetX()+rhs.GetX(), 
        lhs.GetY()+rhs.GetY() 
        }; 
} 
... 
} 
      使用模板编程则可以解决这个问题,在模板函数add中,要求T符合如下隐式 
契约:可使用struct{}构造,接受两个参数,且类型可由GetX()+GetX()结果 
类型隐式转换而来,拥有GetX()和GetY()两个函数。 

      如此编写A库,则只要原来代码的Vector2类符合这些要求,就可以不修改的使用你的add来计算了。当然这只是个例子,由于SFINAE特性的存在,库A可以根据Vector2类实际符合的要求来“自动”选择一种符合要求的实现(代价是库A的编写者静态重载很多种可能T类的add函数,比如叫getX()的、Getx()的、gEtX()的) 
      模板编程技法在C++的容器库和算法库中大显身手,比如只要类型T能比较大小就可以排序。而相比下虽然Java和C#虽然容器类使用了泛型,但是不支持运算符重载,sort都是两种形式:传递comparator,或者要求对象实现IComparable另外Java和C#的模板都很简单,不能实现元编程,因此很难实现非侵入式的泛型库(使用反射可以,不过那是在运行期,与C++编译期确定最终执行代码是完全不同的)。 

      当然吹嘘了C++这么多好处,也要说说其代价。首先是复杂,C++模板相关的内容和规则很复杂,模板允许使用隐式契约(如假定T类有GetX())出错信息如同天书,初学者只有看哭的份,大多数人能享受高手们泛型库的优点,但很难自己编写出一套库。此外模板编程实际将多次运行期的分支代码转移到了一次编译期,因此编译时间远长于非模板代码。再就是SFINAE这种为编译期提供重载可能的规则仅限于编译期,因此编译期类型和操作必须能够无二意确定,像Java或者C#中Object的这类,是无法处理的。而且模板编程需要编译期的实例化,因此只有拿到模板源码重新编译才能加入新功能,而非模板代码只要链接到相应库,使用要求的API即可。 

      再比如说,相比接受comparator的sort版本,要求排序对象实现IComparable就是侵入性的,需要排序对象代码的适配,而接受comparator的版本只要写一个适配comparator即可。 

      在程序的编写中,也会提到代码的耦合性,比如第一种A库的编写方式,就是假定使用向量的计算一定使用Vec2类,而具有类似含义的Vector2类则因这种紧耦合而失去了同为向量的含义。但第二种template的add实现仅仅假定向量类符合某种契约就可工作,一定程度上降低了代码的耦合程度,相比下称作松耦合。 

      写到这不禁感叹人与人的交往与此也有所对应,两人交往不深时,彼此也难于伤害,可也难于获得更高层次的共鸣与快乐。而交往深入时,也往往会伤害的很深。这种患得患失的心态令我与人交往时小心谨慎,难于敞开全部的感受。现在我很难被人伤害,但认识朋友却比小时候慢的多,有时甚至是不敢去结识。 

      写到这里再说说校内网和QQ,现在毕业,生活中没有那么高的人口密度让自己和别人非侵入式交流了,所以只好QQ,手机直接对话,短信这样直接交流,以求深入了解。相比学校时似乎少了点神秘感和羞涩感?    

      不过校内网和QQ都无法摆脱计算机的限制,那就是缺少面对面交流时的各种信息刺激,剥夺了一切个性,只剩下一堆堆呆板的文字。即使语音,视频也无法替代。面对面交流时,人体会发出信息素来彼此交流,身体的语言,动作的变化,表情的改变,语气中小小的转折,这种全面的信息交流是计算机所无法再现的,有些也是现在的科技所没有理解的。因此也在此推荐看到这段文字的同学,有时间出去打打球,吹吹牛,别像我一样呆家里对着电脑傻笑

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics