摘要:大多数典型错误其表面都具有诱惑性,给人们一种诱人的前景,但通常却不能产生期望的结果。 “想挽救进度已经落后的项目吗?---- 给项目补充更多人员!” 下面分别按照人员、过程、产品和技术四个维度列出36个典型错误。人 员典型错误1:挫伤积极性 对人员不够关心和重视;过度的进度压力;缺乏激励;过分夸张的激励等。典型错误2:人员素质低 人员能力欠佳,工作效率低,甚至做多错多。典型错误3:对有问题的员工失控 不对有问题的人员采取措施是项目组成员对领导最常见的抱怨。典型错误4:英雄主义 强调个人英雄主义会导致发生额外的风险,也会削弱在软件开发过程中多个角色的合作。典型错误5:项目后期加入...
阅读全文
摘要:现在我们看看一个实际的例子,从不同设计原则的角度来观察它的设计。这个例子是信息处理中心-数据传输控制组件的消息处理模块,首先看看它的结构图、类实现伪代码和主体程序伪代码: 图3-1 消息处理模块结构图程序3-1 类实现伪代码/////////////////////////////////////////////////////////////////////////////////// Command 类///////////////////////////////////////////////////////////////////...
阅读全文
摘要:随着应用程序的规模和复杂度的增加,需要在更高的层次对它们进行组织。类对于小型应用程序来说事非常方便的组织单元,但是对于大型应用程序来 说,如果仅仅使用类作为唯一的组织单元,就会显得粒度过细。因此,就需要比类“大”的“东西”来辅助大型应用程序的组织。这个“东西”就是包 (package)。 本节描述了6个原则。前3个原则关注包的内聚性,这些原则能够指导我们如何把类划分到包中。后3个原则关注包的耦合性,这些原则帮助我们确定包之间的相互关系。 在UML的概念中,包可以用作包容一组类的容器。通过把类组织成包,我们可以在更高层次的抽象上来理解设计。我们也可以通过包来管理软件的开发和发布。目的就是...
阅读全文
摘要:提起面向对象,大家也许觉得自己已经非常“精通”了,起码也到了“灵活运用”的境界。面向对象设计不就是OOD吗?不就是用C++、Java、Smalltalk等面向对象语言写程序吗?不就是封装+继承+多态吗? 很好!大家已经掌握了不少对面向对象设计的基本要素:开发语言、基本概念、机制。Java是一种纯面向对象语言,是不是用Java写程序就等于面向对象了呢?我先列举一下面向对象设计的11个原则,测试一下大家对面向对象设计的理解程度~^_^~单一职责原则(The Single Responsibility Principle,简称SRP)开放-封闭原则(The Open-Close Princip...
阅读全文
摘要:我们如何知道软件设计的优劣呢?以下是一些拙劣设计的症状,当软件出现下面任何一种气味时,就表明软件正在腐化。僵化性(Rigidity):很难对系统进行改动,因为每个改动都会迫使许多对系统其他部分的其他改动。脆弱性(Fragility):对系统的改动会导致系统中和改动的地方在概念上无关的许多地方出现问题。牢固性(Immobility):很难解开系统的纠结,使之成为一些可在其他系统中重用的组件。粘滞性(Viscosity):做正确的事情比做错误的事情要困难。不必要的复杂性(Needless Complexity):设计中包含有不具任何直接好处的基础结构。不必要的重复(Needless Repet..
阅读全文
摘要:“面向对象软件设计”这个术语及其相关话题对于很多开发人员来说已经是耳熟能详了,甚至听腻了。但是,对不住各位,为了吸引眼球和引起“异性” 注意,本座还是落入俗套选择这个热门话题作为本博客的开张炒作篇目。请见谅,也希望各位看官能放下架子,略读一下本系列的所有文章再喷,可赞可弹可BS, 但勿吐槽,毕竟不想因为本座的文字噪音降低看官的SZ,伤不起呀!! 言归正传,在如何阐述“面向对象软件设计”这个问题上,本座琢磨了良久,毕竟命题宽泛,表达方式和层次多样。最终决定用相对通俗,以本座的读书和工作经历,在中等层次上进行阐述。 本座从十年多前走出校门之时就确信软件架构(设计)、数据结构和算法是软件的根...
阅读全文
摘要:设计概述 服务端通信组件的设计是一项非常严谨的工作,其中性能、伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性、可用性和灵活性必须考虑在内。 现以一个基于 IOCP 的通用异步 Windows Socket TCP 服务端组件为例子,讲述其设计与实现相关的问题,希望能引发大家的思考,对大家日后开展相关类似工作时有所帮助。关于通用性、可用性、Socket 模型选型以及接口模型的设计等问题已经在本座前段时间发表的《通用异步 Windows Socket TCP 客户端组件的设计与实现》中进行过阐述,此处就不再重..
阅读全文
摘要:概 述 文件上传和下载是 Web 应用中的一个常见功能,相信各位或多或少都曾写过这方面相关的代码。但本座看过不少人在实现上传或下载功能时总是不知不觉间与程序的业务逻辑纠缠在一起,因此,当其他地方要用到这些功能时则无可避免地 Copy / Pase,然后再进行修改。这样丑陋不堪的做法导致非常容易出错不说,更大的问题是严重浪费时间不断做重复类似的工作,这是本座绝不能容忍的。哎,人生苦短啊,浪费时间在这些重复工作身上实在是不值得,何不把这些时间省出来打几盘罗马或者踢一场球?为此,本座利用一些闲暇之时光编写了一个通用的文件上传和文件下载组件,实现方法纯粹是基于 JSP,没有太高的技术难度,总之老少咸.
阅读全文
摘要:“养成良好的编程习惯”其实是相当综合的一个命题,可以从多个角度、维度和层次进行论述和评判。如代码的风格、效率和可读性;模块设计的灵活性、可扩展性和耦合度等等。要试图把所有方面都阐述清楚必须花很多的精力,而且也不一定能阐述得全面。因此,本系列文章以软件开发的基础问题为切入点,阐述程序设计和代码编写方面的细节问题,以点带面,旨在激发大家的思考与总结,希望能为大家带来实际的帮助。
虽然本系列文章定位为科普读物,但本座相信它们不但适合新手们学习借鉴,同时也能引发老鸟们的反思与共鸣。欢迎大家提出宝贵的意见和反馈,觉得写得还可以就“荐”一下吧 ^_^
阅读全文
摘要:时下很多 Web 框架 都实现了 Form 表单域与 Java 对象属性的自动装配功能,该功能确实非常有用,试想如果没这功能则势必到处冲积着 request.getParameter() 系列方法与类型转换方法的调用。重复代码量大,容易出错,同时又不美观,影响市容。 现在的问题是,这些框架通过什么方法实现自动装配的?如果不用这些框架我们自己如何去实现呢?尤其对于那些纯 JSP/Servlet 应用,要是拥有自动装配功能该多好啊!本座深知各位之期盼,决定把自动装配的原理和实现方法娓娓道来。 实现原理其实比较简单,主要由以下3个步骤构成:通过 request.getParameterMap...
阅读全文
摘要:编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱。每个程序都 Copy / Parse 类似的代码再进行修改,实在有点情何以堪。因此本座利用一些闲暇时光写了一个基于 IOCP 的通用异步 Windows Socket TCP高性能服务端组件和一个通用异步 Windows Socket TCP 客户端组件供各位看官参详参详,希望能激发下大家的灵感。本篇文章讲述客户端组件。闲话少说,我们现在步入正题。最重要的第一个问题:如何才能达到通用? 答:...
阅读全文
摘要:对于消息映射宏,不用多说了,用过 MFC 的人都很清楚。但目前有不少程序由于各种原因并没有使用 MFC,所以本帖讨论一下如何在 Win32 程序中实现类似MFC的消息映射宏。其实 Windows 的头文件 “WindowsX.h”(注意:不是“Windows.h”) 中提供了一些有用的宏来帮助我们实现消息映射。本座是也基于这个头文件实现消息映射,首先看看宏定义文件:#pragma once#include <windowsx.h>/************************************************************************//*
阅读全文
摘要:Singleton 设计模式应用非常广泛,实现起来也很简单,无非是私有化若干个构造函数,“operator =” 操作符,以及提供一个静态的创建和销毁方法。但是对每个类都写这些雷同的代码是本座不能容忍的,因此,本座使用宏把整个 Singleton 模式封装起来,无论是类的定义还是类的使用的极其简单,请看代码:/******************************************************************************Module: Singleton.hNotices: Copyright (c) 2006 Bruce LiangPurpo...
阅读全文
摘要:Private Heap 是 Windows 提供的一种内存内存机制,对于那些需要频繁分配和释放动态内存的应用程序来说,Private Heap 是提高应用程序性能的一大法宝,使用它能降低 new / malloc 的调用排队竞争以及内存空洞。Private Heap 的原理及应用的资料很多,这里就不一一介绍了,常用的 Private Heap API 有以下几个,具体介绍请参考帮助文档:HeapCreate();HeapDestroy();HeapAlloc();HeapReAlloc();HeapSize();HeapFree();HeapCompact(); 由于是 C 风格的...
阅读全文
摘要:对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能。如果用手工方式进行清理,会花费太多时间,并且很多时候难以满足实际要求。例如:如何在每个星期六凌晨3点把超过2G大的日志文件进行切割,保留最新的100M日志记录? 网上没有发现能满足本座要求的日志切割工具,因此花了一些闲暇时间自己写了一个。由于要在多个平台上使用,为了方便采用 Java 实现。本工具命名为 LogCutter,主要有以下特点:支持 Linux、Mac 和 Windows 等所有常见操作系统平台支持命令行交互式运行支持后台非交互式运行(Linux/MAC 下使用 daem...
阅读全文