摘要:
不断的写代码,调试。一天开始了。 阅读全文
摘要:
什么是依赖,什么是抽象1.关于依赖和耦合:从小国寡民到和谐社会在老子的“小国寡民”论中,提出了一种理想的社会状态:邻国相望,鸡犬之声相闻,民至老死,不相往来。这是他老人家的一种社会理想,老死不相往来的人群呈现了一片和谐景象。因为不发生瓜葛,也就无所谓关联,进而无法导致冲突。这是先祖哲学中的至纯哲理,但理想的大同总是和现实的生态有着或多或少的差距,人类社会无法避免联系的发生,所以小国寡民的理想成为一种美丽的梦想,不可实现。同样的道理,映射到软件“社会”中,也就是软件系统结构中,也预示着不同的层次、模块、类型之间也必然存在着或多或少的联系,这种联系不可避免但可管理。正如人类社会虽然无法实现小国寡民 阅读全文
摘要:
关于抽象和具体什么是抽象呢?首先不必澄清什么是抽象,而从什么算抽象说起,稳定的、高层的就代表了抽象。就像一个公司,最好保证了高层的稳定,才能保证全局的发展。在进行系统设计时,稳定的抽象接口和高层逻辑,也代表了整个系统的稳定与柔性。兵熊熊一窝,将良良一窝,软件的构建也正如打仗,良好的设计都是自上而下的。而对具体的编程实践而言,接口和抽象类则代表了语言层次的抽象。追溯概念的分析,一一过招,首先来看依赖于具体,如图3-3所示。因此,为了分离这种紧耦合,最好的办法就是隔离,引入中间层来分离变化,同时确保中间层本身的稳定性,因此抽象的中间层是最佳的选择(如图3-4所示)。以例而理,从最常见的服务端逻辑举 阅读全文
摘要:
模式的起点¡工厂方法(FactoryMethod Pattern)模式起点:将程序中创建对象的操作单独进行处理,大大提高了系统扩展的柔性,接口的抽象化处理给相互依赖的对象创建提供了最好的抽象模式。典型应用:工厂方法模式是最简单也最容易理解的模式之一。其关注的核心是对于对象创建这件事儿的分离。¡单例(SingletonPattern)模式起点:一个类只有一个实例,且提供一个访问全局点的方式,更加灵活地保证了实例的创建和访问约束,并且唯一约束的实施由类本身实现。典型应用:一个类只有一个实例,经常被应用于Façade模式,称为单例外观。¡命令(CommandP 阅读全文
摘要:
好代码、坏代码之四9.扩展无处不在扩展性是衡量一个软件产品的重要尺度之一。通过合适的设计为软件系统赋予一定程度的扩展,是架构师着手设计的重要考虑因素,如图3-16所示。扩展是个大课题,涉及软件系统的方方面面,依赖于粒度不同的架构格局。举例来说,数据库设计可以考虑在横向或纵向的扩展、在多层架构中实现可适配的数据层、为业务层实现注入逻辑设计、在UI层提供可配置的界面选择以及为物理架构提供横向扩展的部署设计。实现基于服务的系统,就意味着在服务层支持扩展良好的高层架构;而一个面向接口的设计,将是为扩展提供可能的选择之一;采用ASP.NET MVC构建的Web系统,将在很多方面被赋予扩展的标签,基于管线 阅读全文
摘要:
好代码、坏代码之三7.线程安全很重要线程安全是重要的,在数据共享或同步的场合应将线程安全作为必须考虑的因素,不安全的代码将在多线程运行时造成严重的问题。例如,单例模式就是这样一个需要特别注意的例子:publicsealedclassSingleton{Singleton(){}publicstaticSingletonInstance{get{if(instance==null){instance=newSingleton();}returninstance;}}privatestaticSingletoninstance=null;}因此,你可以考虑通过“双锁”机制来保证线程的安全,不过在. 阅读全文
摘要:
好代码、坏代码之二4.多注释,少废话代码,一定是给人看的,而代码本身的逻辑又决定于方法、类型和依赖的关系之中,所以,必要的注释,是必需且必要的。通过注释的进一步解释,来辅助性地告知代码的逻辑、算法或者流程,不仅是好习惯,更是好代码。另一方面,注释不是“无病呻吟”,没有必要表述那些显而易见的逻辑或者说明,同时注意区分单行注释和多行注释的应用。在.NET平台下,XML格式的注释还肩负了另一项重要的使命,那就是根据注释生成代码文档。例如:///<summary>///根据用户信息,构建标签信息///</summary>///<paramname="member 阅读全文
摘要:
好代码、坏代码之一1.命名很重要,让代码告诉你它自己命名到底有多重要呢?重要到这几乎是很多软件项目成功或者失败的“罪魁祸首”,究其原因,代码不光支撑了0和1在计算机系统中运行的业务逻辑,同时也是开发者进行交流与研究的标准语言。没有意义或者有歧义的命名,就像两个等待交流的人,面对了一堆火星文无从下口,让交流变成灾难,也就导致很多问题。同时,好的命名是自说明的,让代码告诉开发者“我是谁,我做什么,我怎么做”。当然,除了静态式的必要的注释说明之外,动态式的代码也可以包含传递信息的作用,让代码告诉你它自己,因为代码是“活的代码”。例如,以某个缓存容器为例,泛型参数明确了容器的Key和Value的关系, 阅读全文
摘要:
设计由何而来设计,从何而来?是需求。是重构。设计原则是系统设计的灵魂,而设计模式是系统开发的模板,灵活自如的应用才是设计以不变应万变的准则。例如,实现一个用户注册的方法,首先会想到://初次设计publicvoidRegister(stringname,Int32 age){}在一定的需求条件下,这个方法已经能够经受系统的考验,安全而平稳地向数据库中不断插入新的用户信息。然而,当需求发生变化时,你可能不得不对此做出调整,而我们就将这种调整称为重构。但是重构远不是扩充,而是设计。例如,现在的注册项发生了变化,还需要同时注册性别、电话,没有设计的调整,就被实现为://需求变更publicvoidR 阅读全文
摘要:
解构控制反转(IoC)和依赖注入(DI)1.控制反转控制反转(Inversion ofControl,IoC),简言之就是代码的控制器交由系统控制,而不是在代码内部,通过IoC,消除组件或者模块间的直接依赖,使得软件系统的开发更具柔性和扩展性。控制反转的典型应用体现在框架系统的设计上,是框架系统的基本特征,不管是.NET Framework抑或是Java Framework都是建立在控制反转的思想基础之上。控制反转很多时候被看做是依赖倒置原则的一个同义词,其概念产生的背景大概来源于框架系统的设计,例如.NET Framework就是一个庞大的框架(Framework)系统。在.NET Fram 阅读全文