随笔分类 - 程序设计
摘要:interface IState { string Name { get; set; } //后件处理 IList Nexts { get; set; } Func Selector { get; set; } } class State : IState { pu...
阅读全文
摘要:safehandle 是一种析构机制,她和析构函数有什么分别。 首先要理解析构函数。析构函数在.net中是没有顺序的,因此你不能假定另一个对象的析构函数在你之后运行,哪怕它是你的成员!如果你的成员也有析构函数,那么你能做什么,什么不应该做? 第一,在析构函数运行时,你不应该假设它没清理资源,而去试图
阅读全文
摘要:RCW是.net 对com的包装,比如office就是通过RCW来被.net调用的。可以百度:office pia 了解更多信息。 RCW 是一个.net类。 1.关闭线程对rcw的自动清理 System.Threading.Thread.CurrentThread.DisableComObject
阅读全文
摘要:题目起的好吧。结构类型可以在栈分配空间,而引用类型只能分配指针。通过数组,结构类型可以分配一个连续的空间和一个指针。数组结合引用类型只能分配连续的指针,和零散的空间。这是性能问题的一个潜在点。因此要做序列化的东西,而又比较在意性能,数组结合结构类型是有必要的。没有指针,可以用下标来访问,也就是枚举数组的元素,需要返回数组本身(指针)和他当前的下标(自然数)两样东西,这没有指针方便,但基本可以满足要求。问题是,很多数据结构的api并不返回数组和下标,而是返回值本身。如果该值是引用类型,那么还能当指针来使用,如果该值是值类型,那就不能枚举元素了。也许我们不需要枚举元素,只需要改变元素,提取值类型元
阅读全文
摘要:设计本身也要有"源"才行,凭空出现的设计那不过是空想,也是不符合实际需要的.没有一个设计可以满足所有需求,因此设计本身就要根据"需求"源头来做.第一,先有需求这里要说何谓需求,需求笼统来说就是业务,你对业务的理解是一个不断加深的过程,这个过程不是设计出来的,而是你的见识,经验,联想,对比其它产品,寻找灵感的过程. 总的来说就是你的认识,行动上表现为 "幻想",总结,分析,对比,收集资料等.需求不是设计, 也不是编码,需求是一切之源头(除了你赚钱的欲望),但是需求并不反对编码. 甚至应该产生一定量的编码.作为程序员,我们有两种语言,一种
阅读全文
摘要:程序语言有很多语法,让人无所适从,是否一定要精通所有语法才能编程?不见得,因此,我们应该注重语法的设计上的意义,而不是语法自身的细节。设计上的意义,就是你想怎样去运用这个语法,这个语法可以用来干什么。语法只是一种基础,而不是设计要素,要成成为设计要素,就要对语法进行认识和组织。你可能认识到变量的各种特性,但是你却没有发现变量实际用来做什么,你可能清楚结构的各种细节,但你又不清楚结构用来表达什么内容。因此这就是读死书。我们要组织其自己的设计元素,才能加强我们的表达力,通过理解设计上的意义,才能够快速的组织好程序设计,而不是纠结于语法细节。比如函数,可以理解为语法上的函数,也可以理解为一种通信渠道
阅读全文
摘要:现在设计模式很流行,但我觉得什么模式并不是重点,重点是对代码的语感,也就是我说的基础技巧。模式是需要经验,而不能囫囵吞枣,简单模仿。很多时候,你不需要什么模式,只需要坚持一些“美感”就足够。闲话少说,代码设计的几个基础技巧如下:一、防止重复不要重复自己,也不要重复代码。当你发现重复的时候,就想想用一个标识符去取代具体的内容。如果是常量,就用常量标识符,如果是变量,就用变量标识符,如果是代码段落,就用函数包装,如果是数据单元的集合,就建立相关的数据结构封装,如果是状态和调用的集合,就建立对象;如果要新的数据类型,就用struct定义。只有不重复自己,不重复代码才能减少重复劳动,提高编码效率(体现
阅读全文
摘要:现在c#的接口只是一个签名,也就是签名一样就可以用不同的实现。但是我认为这个接口模式还不是理想的模式,我认为接口应该是一个规则,而不只是一个签名。也就是要满足特定规则的实现,才是符合该接口的。规则包括对数据的定义,输入输出的关系等。从实现角度,就是接口签名外,增加代码测试功能。也就是,任何一个实现,都应该符合接口的签名(语法),同时通过它的测试(语意)。为何我有这个想法,因为大多数情况下,单单签名相同就认为是一个实现,这种约束太低了,反而实用价值不大。比如一个功能组件,建立的目的不是为了满足某一个功能吗?但是你其中一个实现却只是实现了一个接口签名,虽然能够套上去,但是组合起来完全不是你想要的功
阅读全文
摘要:大多数程序员,都是喜爱编码多过设计。遇到什么问题,首先就是想着上机“试一试",直到碰壁之后,才思考哪里出了问题。为何程序员不爱预先设计?我认为是缺乏设计工具造成的。虽然知道设计很重要,但是却缺乏行之有效的设计工具,只能见步行步。因此,我们不需要一而再再而三的强调设计的重要性,而需要总结一套行之有效的设计工具,以满足设计流程的需求。面向对象设计是一套工具,但是这套工具和编码环节很接近,属于比较后期的设计工具。在前期的设计工具就是收集资料,和分析整理资料,甚至是定下我们产品目标,这些内容很重要,而且应该在流程的初期去完成。你不可能说我用面向对象设计软件出来后,才去分析产品的定位。但是程序
阅读全文
摘要:学面向对象最常听到的词就是“抽象”。抽象是什么,我觉得有两种定义:一、从具体的东西抽离非关键因素得到的简化实体。二、参数化。我们认识事物,都是从实体开始的,然后抽离部分细节,得到抽象简化后,归类对比等等得到认知。比如你认识一个陌生人,首先要了解他得社会身份地位,然后把他对比你其他认识的人,得出你要对他采取哪种态度。这种也叫标签化,脸谱化。作为文学家,经常要克服这种认知惯性,把细节填充进脸谱化的人物中,让人物与众不同。不过程序员不需要做到这一步。参数化从技术角度去论述这个问题。所谓参数化是指一个行为可以通过函数去描述。函数有自变量和输出值,而将行为的模式定义为参数化的函数,就把静态关系转化为动态
阅读全文
摘要:很多人都幻想软件可以工厂化,流水线化生产,但是这一天却从来没有到来。软件和工厂模式的不同在于软件是研发出来,而工厂是研发出来后,持续生产。工厂中的生产阶段是重点,而软件的生产阶段只需要复制复制,可以忽略不计。所谓的流水线指的是工厂的生产阶段,所以软件很难出现所谓的流水线。那么软件是不是无法扩大规模,无法标准化?那又不需要这么悲观,我认为软件大规模“生产”(研发)是有条件的:一、组件化和接口标准化二、服务和消费模型三、可验证可测试四、性能和功能可配置其中核心是接口的标准化。一个大规模集成的环境下,标准接口是必须的,而这个往往是占山为王的思维下很难得到发展的一部分。比如QQ的通信协议就是私有的,谁
阅读全文
摘要:本文献给想学编程或者需要学编程的人们。一、编程是什么?计算机(电脑)是通过程序来控制的,程序是一段指令,而编程就是编写程序,其目的是控制计算机的运作。其实生活中我们也要把编写一些简单的程序,比如有些电视机有家长控制功能和定时功能,我们就可以指定哪个时段可以看电视,电视有画面,哪个时段不能看电视。这是对电器的例子,还有一些例子是对人的,比如一套办事流程,规定你先到那个窗口,准备什么材料,再到哪个部门的哪个窗口。编程的目的就是让电器,计算机,甚至是人按照一定的程序流程办事。当然,我们这里讨论的编程是针对计算机而言的。那么计算机编程具体是怎样的过程?首先,你需要写一段文字(文本),然后保存为一个文本
阅读全文
摘要:最近发现一个面向对象比较有趣的讨论:谈谈继承的局限性(http://www.cnblogs.com/xrunning/archive/2011/10/17/2214487.html).以四边形,矩形,正方形为例子讨论继承的问题。矩形是两对边平衡的四边形,而正方形是内角为90度的矩形。一种设计方式是:四边形做基类,矩形继承自四边形,正方形继承自矩形。理由是:矩形是四边形,正方形是矩形。矛盾在于,面向对象的类继承隐喻了这样一件事:子类是父类的超集(包含父类),但是正方形并不需要四条边长的属性,而只需要一条边长(因为4条都一样),也就是正方形反而比四边形要小。评论指出:这个设计的病根在于设计逻辑,继
阅读全文
摘要:一个好的程序员,好在哪里?我觉得并不是人品问题,而是世界观的问题,拥有怎样的世界观,是有利程序开发的,这就是本文要分析的。一、伟大的学习观:我发现有几种学习观是没有意义的,比如努力学习,勤奋学习,因为很多人很努力,成绩却不怎么样。学习单靠努力是不行的,学习应该有方法,而方法可能有多种多样,所以很难通用。普天之下行之有效的学习观是否存在?最近,我发现了一种。这要从一个疑问句开始:为什么同样的东西,有的人学的结果是这样,另外一些人学的结果就是那样?学习这个东西,并不是简单罗列在我们面前的,要想学到东西,就要深入。同样是一本教程,有些人可以深入进去,不但学到流于表面的内容,还能发现和扩展深层的内涵。
阅读全文
摘要:1.构思阶段很重要,如果能用中文去描述你想要的东西,很有可能可以用程序语言来实现。当然有时候你以为你想明白了,其实用程序写一次根本不是这么一回事。这是一个需要花时间,和精力去关注的阶段。如果连要做什么都不清楚,不要贸然进入编码阶段。越后面的阶段,要“重启”整个编程流程代价就越大。2.关注特殊性,编程一般是由特殊到一般的过程,一开始很难直接进入一般状态,所以把特殊性给找出来,作为分析一般性的材料。3.站在算法的层次去思考问题。把业务转换为数字处理。4.用描述性的语言替换过程性的语言。注意逻辑的层次性,把细节隐藏起来。通过“函数”去归纳过程,通过类去归纳“单元”等。5.注重工程辅助工具的建设,比如
阅读全文
摘要:实际开发的时候,往往想得多,做得少。设想很完美,动手就觉得一头雾水。就算是坚持下去,结果也会越来越艰难。为什么会陷入这个困境,在于我们想的未必是我们能力范围的。我们想的常常就是我们略知一二的东西,经常会用一些自己不熟悉的高科技去编程,我觉得这样是问题的根源。如果你想要一个很完美的实际,故意去设想很周到,实际上就已经是犯了错误。编程不能靠“设计”,而只能靠直觉。当技能熟悉到你可以作为直觉使用的时候,它就越没有出错的风险,设计优美是人们的追求,但是既然你都没熟悉,就该承认这个基本事实,而不要再实际开发中锻炼你的设计能力,实际开发不是你的练习课程,做开发不是做习题。合理的做法,应该在开发的时候使用直
阅读全文
摘要:最近在写一个才数字的游戏。也就是电脑出一个数字,然后你猜,电脑告诉你大了还是小了,循环这个过程,直到猜中。但是我把这个东西用了很复杂的设计来表示,什么玩家对象,什么电脑对象,什么事件通信,什么用户界面,什么业务逻辑。唉,搞了一天还没完成。一直以来,我都希望找到一个比较高效的设计方法,最好可以一劳永逸的。但是一开始就设计对象,凭空创造所谓的用户界面之类的逻辑层,结果问题难度会变得超乎我的想象。如果我开始就是从业务流程出发,可能更加有更加明确的思路。下次试一下先整理业务流程的设计方法。
阅读全文
摘要:标题的意思是,对象之所以单独成为一个概念,而不是只是系统内部的实现细节,那是因为很多人需要调用它。因此,对象的存在是因为被需要,如果没有人调用它,他就可以作为实现细节,从外观上消失。比如一个超市的管理系统,为什么要有商品,为什么要有收银员,是因为老板需要经常查看这些信息,所以他成为一个独立的概念,是有意义的。现实需求中,有很多实体对象,如果要一花一木都描述出来,那么就非常辛苦。有些人害怕自己不够面向对象,就迷恋不断的创建概念对象出来,这样会很累。如果你觉得自己很懒,觉得没必要对外开放一个独立的概念,就可以作为一个实现细节。虽然只有一个对象,而没有对象联系的系统是不可思议的,但是从理论角度,这也
阅读全文
摘要:1.-面向对象和基于对象的分别所谓基于对象,就是用对象,能封装对象,把状态和操作包装起来使用.但是不能通过多态扩展对象.面向对象是附加多态功能的"基于对象".2.面向对象和面向过程的分别.最本质的差异是关注的侧重点不同.面向对象关注活动中的对象,面向过程关注活动中的流程.从根本上来说,两种思想会共存和相互渗透.3.面向对象的基本设计思想a.自己管好自己b.自己管得过多,就委派给别人c.不侵犯别人的领地d.不依赖特定的对象,不猜测对方的实现机制高级议题,面向对象的各种常见观念:1.面向对象的原教旨它认为对象之所以存在,因为他客观存在.比如什么猫,狗,飞机之类的.但是我认为对象
阅读全文
摘要:很多人都提倡用组合来代替继承。按我说,应该反对继承。继承是面向对象的一个设计bug。尤其是有接口以来,将实现和接口清晰分离的做法,才是真正的面向对象。用类做接口,不过是把接口和实现混着用,是一种错误设计。因此,应该反对一切形式的继承。唯一盼望的是面向对象语言能够更好地支持组合模式,改进接口的实现简易性。----------------------------------------------------------------------------------------------------------------------------------------------------
阅读全文