软件工程
acloud_csu
90年毕业于中南大学。麦芯半导体设备应用操作系统发明人。擅长C + + 编程、设计和分层架构。精通面向对象和设计模式。
展开
-
一次成功的重构实践1 - 概述
一次成功的重构实践1 - 概述黄国强 2019/1/20很长时间没写blog了,原因很简单,工作基本上遇不到问题,因而思考少了,自然也没有写东西的动力。这次年会之所以拿到了公司特殊贡献奖,是因为去年将原先的软件架构重写,使公司软件发生了有目共睹的巨大变化。在这里总结一下重构过程。重构前与重构后的解决方案比较:图中是原先的解决方案和现在解决方案的比较,从中可以看到,整个解决方...原创 2019-01-20 11:27:20 · 542 阅读 · 0 评论 -
从维度方面理解代码的切分方法
本文从维度方面讨论了代码的切分方法原创 2011-03-29 10:05:00 · 1019 阅读 · 0 评论 -
界面层和应用层的完全隔离
应用层的职责就是给界面层或其他程序提供一个应用服务原创 2011-01-21 14:46:00 · 1016 阅读 · 0 评论 -
分层架构模型的改进
本文描述了对分层架构中基础结构层的新的认识原创 2010-12-02 13:00:00 · 1429 阅读 · 7 评论 -
领域模型、分层和架构的几个观点
本文描述了领域模型、分层、架构以及他们之间的关系原创 2010-11-29 15:43:00 · 3649 阅读 · 2 评论 -
软件项目成功的秘诀
本文罗列了作者如何让软件项目成功的一些心得。原创 2010-08-06 15:56:00 · 792 阅读 · 0 评论 -
横向设计,纵向实施
横向设计,纵向实施黄国强 2009-12-30关于我提出的“横向设计,纵向实施”的进一步解释请见下面的图示: 图中,我们架构上采用分层设计的方法,而在具体实施的时候是按照模块(一般是DLL)来组织开发。原创 2009-12-30 10:08:00 · 737 阅读 · 0 评论 -
C++代码的组织
C++代码的组织黄国强 2010-2-23军队编制:一个 师包括五到六个团;一个 团配有三个营;一个 营配有四个连左右;一个 连由三个排组成;一个 排由三个班组成;一个 班大约由十名战士;同样我们的代码也需要编制,我是这样定义代码编制的。一个主程序包括10个(或以下)DLL(动态链接库);一个DLL包括10个(或以下)namespace(名字空间);一个namespace包含...原创 2020-01-24 13:05:18 · 1197 阅读 · 3 评论 -
用 PIMPL 模式来实现契约的前置条件、后置条件和不变式
用 PIMPL 模式来实现契约的前置条件、后置条件和不变式黄国强 2009-10-16 上文[1]说到用 NVI 模式[2]来实现契约的前置条件、后置条件和不变式。本文用相同的例子,用PIMPL模式重新实现了。//////////////////////////////////////////////////////////////////////////////原创 2009-10-16 11:23:00 · 1095 阅读 · 1 评论 -
我发明的类图表示方法
我发明的类图表示方法黄国强 2011-6-29以前我都用Visio画类图,时间长了发现有点不方便,就是在打开VC的同时还要打开Visio。我就想如何用文本的形式来表达类图,这样这个类图就可以直接在VC中查看,岂不方便。经过两年多的尝试,现在的方法已经比较成熟。我是这样做的:1 在工程中新建一个diagram.h的文件,以后一个工程中的所有类都写在这里;2原创 2011-06-29 09:39:00 · 572 阅读 · 0 评论 -
一个模块接口的组成
一个模块的接口由两部分组成,第一部分是回调接口,这些接口在主接口中被使用。第二部分是主接口,展示对外的服务。原创 2011-05-09 10:22:00 · 1861 阅读 · 0 评论 -
最高境界的软件
最高境界的软件 黄国强 2004-12-8 何谓最高境界的软件,每个人心中都有着不同的答案。我心目中最高境界的软件是一个有机体,而非无机体。有机体的主要特征就是不停的演变,演变一旦停止,这个物种离死亡不远了。 传统的建筑是典型的无机体,一旦建成及演变结束。而软件我认为原创 2011-07-26 16:30:03 · 835 阅读 · 0 评论 -
软件项目中的功能风险矩阵
软件项目中的功能风险矩阵黄国强 2011-9-9仿照美国总统艾森豪威尔的“时间管理优先矩阵”,我画了一个项目功能风险矩阵图。软件开发中,我们最先要做的就是必要而且有风险的事情;[时间管理优先矩阵]时间管理——永远做重要不紧急的事情。时间管理的出原创 2011-09-09 13:27:13 · 2928 阅读 · 0 评论 -
人月神话-软件开发现状
人月神话-软件开发现状黄国强 2005年03月5日 人月神话的作者Frederick P. Brooks Jr这样说到“所有软件活动包括根本任务--打造构成抽象软件实体的复杂概念结构,次要任务-使用编程语言表达这些抽象实体,在空间和时间限制内将他们映射成机器语言。” 这句话我原创 2017-10-01 00:06:01 · 791 阅读 · 0 评论 -
我眼中的MVC模式(2) --- 变体 MOVE
我眼中的MVC模式(2) --- 变体 MOVE黄国强 2012-7-17看了文章 “MVC已过时,MOVE时代来临?”[1]后,感觉是MVC的一个变体,参照之前的一篇文章“我眼中的MVC模式”[2],我改了一下。实质上就是去掉了 View 对 Model 的引用。这是文章[1]中的原图:下面这张是按照我自己的发明的类图方法画的。参考文章[1] ht原创 2012-07-17 09:38:46 · 1364 阅读 · 0 评论 -
集中决策和分散决策(3)
集中决策和分散决策(3)黄国强 2011-12-31 上两篇文章讨论了集中决策和分散决策两种程序的写法。两种写法在项目中都有广泛的运用。一般来说,C的项目中大多采用集中决策的写法,而C++的项目用分散决策的写法多些。但这也不是绝对的。根据我多年的开发经验,在以下几个方面得出一些结论:1 项目的规模和难易程度 首先,对于比较小的简单项目,采用集中决原创 2012-01-20 19:40:54 · 6984 阅读 · 0 评论 -
原型法(prototyping)的改进
原型法(prototyping)的改进黄国强 2007-9-28 我们知道,为了快速准确的获得用户需求,使用原型开发是一个好的办法。 原型开发关键的东西在于,保证你绝对不把原型代码变形转化成生产代码(production code)原创 2011-10-08 13:07:46 · 1423 阅读 · 0 评论 -
隐喻:层与层之间的控制关系与倒车雷达
隐喻:层与层之间的控制关系与倒车雷达黄国强 2006-9-27 前一阵子到苏州参加IC China 2006,在回来的路上我突然想起了这个题目。 事情是这样的,在一个路口我们车在等红绿灯的时候过了线,旁边还站了个警察。我们的司机由于忘带驾照,怕引起警察注意而导原创 2011-07-26 16:26:45 · 772 阅读 · 0 评论 -
大象vs蚂蚁
大象vs蚂蚁黄国强 2004-12-22 前两天,去参加了微软的软件开发高级管理培训班。有一点感想,与大家分享。微软是软件行业的巨无霸、航空母舰。我所在的公司比较起来,可能算是一个蚂蚁。所以,一只蚂蚁要象大象学习,教条的照搬可能会死的会很难看。而且开发一个产品最终是否成功原创 2011-07-26 16:27:49 · 688 阅读 · 0 评论 -
信息隐藏(Information Hiding)原则
信息隐藏(Information Hiding)原则黄国强 2006-10-25 信息隐藏是结构化设计与面向对象设计的基础。在结构化中函数的概念和面向对象的封装思想都来源于信息隐藏。软件业对这个原则的认同也是最近十年的事情。 David Parnas在1972原创 2011-07-26 16:25:44 · 8566 阅读 · 0 评论 -
用 NVI 模式来实现契约的前置条件、后置条件和不变式
用 NVI 模式来实现契约的前置条件、后置条件和不变式黄国强 2009-9-25参考书[1]中的“简单栈”的例子是用 Eiffel 语言写的。下面的例子是我在C++中用 NVI 模式[2]来实现契约的前置条件、后置条件和不变式。//////////////////////////////////////////////////////////////////////原创 2009-09-25 10:56:00 · 1512 阅读 · 0 评论 -
名可名,非常名--谈接口和实现
名可名,非常名--谈接口和实现黄国强 2009-9-22 “名可名,非常名”出自《老子》第一章,解释有多种,我找了一个请见[1]。在这里我借这段话来引出接口和实现的话题。 平时我非常喜欢举的例子是桌子。比如,我们把桌子设计成一个类。 问题很快出现了,我们应该给这个桌子增加什么成员函数呢?加上有几条腿的查询函数?加上是什么颜色的查原创 2009-09-22 16:52:00 · 630 阅读 · 1 评论 -
重构 — 改善既有的类图设计 条款8:消除继承类和基类中重复的依赖关系
重构 — 改善既有的类图设计 条款8:消除继承类和基类中重复的依赖关系 黄国强 2008/5/12 大家再读本条条款之前,请先读一下“条款4:消除重复的依赖关系”。本条款目的和条款4,只是表现形式不同。见图 1。 图1 图中类1依赖于类3,类2也依赖于类3。在这里类2和类3之间是聚合关系,聚合关系的依赖方向是从菱形箭头指向原创 2008-06-12 13:56:00 · 709 阅读 · 0 评论 -
软件需求和软件功能的区别
软件需求和软件功能的区别黄国强 2008-8-28 很多人对软件需求和软件功能之间的区别模糊不清。在软件需求收集阶段,开发者不知道自己究竟应该写什么,形成的文档往往是罗列了很多软件功能,最后形成固定的思维定式,认为做需求就是收集软件的功能。 我对此问题有如下结论: 软件需求关注的是做什么的问题,而软件功能关注的是怎么做的问题。软件需求是为用户服务的,而软件功能是为软件开发服务的。原创 2008-08-28 12:53:00 · 2591 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款7:为每个角色增加一个接口
重构 — 改善既有的类图设计条款7:为每个角色增加一个接口黄国强 2008/6/6 单一职责原则(Single Responsibility Principle,SRP)[1] Robert C. Martin 是这样解释的:Each class should have one and only one reason to change.一个类只能因为一个因素而改变。原创 2008-06-06 10:24:00 · 700 阅读 · 1 评论 -
重构 — 改善既有的类图设计 条款6:模块的防火墙
重构 — 改善既有的类图设计条款6:模块的防火墙黄国强 2008/5/27图 1 看图 1 ,一个模块由A、B、C 三个类 组成,外部类可以访问类 A 。从图上看,外部类通过类 A 开始的依赖箭头可以访问到类 B 和 C 。显然这个模块的细节也暴露给外部类了。 如果在设计上不想让外部类看到这个模块的细节,如何我们应该如何做到这点呢?请看图 2原创 2008-05-27 17:07:00 · 766 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款5:给工厂加一个代理
重构 — 改善既有的类图设计条款5:给工厂加一个代理黄国强 2008/5/21向这次大地震遇害的同胞表示哀悼。 前些天和同事聊到设计做到什么程度的话题,我特别提到经济性这个原则。在做设计的时候对于灵活性也要有个度。并不是越灵活越好。而把握这个度的原则就是经 济性。在你的项目的需求很少变化或本身很简单的情况下,做过多设计并不好。正所谓“过犹不及”。而我更是认为“欠点总比过好原创 2008-05-21 13:43:00 · 701 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款4:消除重复的依赖关系
重构 — 改善既有的类图设计 条款4:消除重复的依赖关系黄国强 2008/5/12图 1 见 图1。图中,类 A 因为调用了类 B ,所以有一条从类 A 指向类 B 的箭头。同时类 A 又调用了类 C ,所以有一根从类 A 指向类 C 的箭头。由于类 B 也有一根指向类 C 的箭头,所以为了消除重复的依赖关系,我们将类 A 指向类 C 的箭头去掉。重构后的设计见图 2。原创 2008-05-12 12:43:00 · 677 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款3:用 FACADE 类消除依赖关系的交叉
重构 — 改善既有的类图设计条款3:用 FACADE 消除依赖关系的交叉黄国强 2008/5/8有 些网友对条款2不是很赞同,认为看惯了基类在上面,继承类在下面的图。认为还是原来的清晰。关于这点,我从两个方面解释一下。其一,在一个分层设计中,依 赖关系箭头一般都是从上指向下的,而基类在上面,继承类在下面的图正好和总体设计图相反。风格上并不统一。其二,一般静态结构图主要表现静态的结构,我个 人把一些原创 2008-05-08 12:38:00 · 999 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款1:将双向依赖改变成单向依赖
重构 — 改善既有的类图设计条款1:将双向依赖改变成单向依赖黄国强 2008/5/6把这个条款放在第一个,是因为我认为,把设计中的所有双向依赖关系排除掉,是进行下一步重构工作的前提。图1如图1所有,图中有两个类,他们之间存在双向依赖关系。存在着两条箭头。这个图是用 Visio 画的。箭头从类 A 指向 B 表示 A 依赖于B。图2图中表现了将图1中的类图变成单向依赖的两个方法,具体原创 2008-05-07 09:35:00 · 2022 阅读 · 0 评论 -
把小软件当作大软件来写,把大软件当作小软件来做
把小软件当作大软件来写,把大软件当作小软件来做黄国强 2008-9-9 我最初也是从写小的程序开始的。随着程序的规模越来越大,投入的精力越来越多,逐步意识到自己方法上肯定出了问题。从90年代中期开始,我逐步认识到一个好的软件需要一个好的领域模型。但是当时对分层没有概念。一个明显的问题就是,当时的程序在界面代码中也出现领域对象。进入到2000年,首先接触到微软的DNA架构,后来又接触到其他一些原创 2008-09-09 10:13:00 · 997 阅读 · 1 评论 -
重构 — 改善既有的类图设计 条款10:将多个接口的实现类合并成一个
重构 — 改善既有的类图设计 条款10:将多个接口的实现类合并成一个黄国强 2008-9-25 在条款7中(http://acloudblog.blog.sohu.com/89393080.html)我们谈到“现实的例子,比如一个小公司,就老板一个人,他就要从事从总经理到员工所有的职位的工作。面对不同的客户,他拿出不同职位的名片。随着公司的发展,他会按职位招聘一些符合这些职位的人。让这些人分原创 2008-09-25 14:42:00 · 1140 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用
重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用黄国强 2008-10-07 先看下面的例子代码。// 负责表示一个聚合类内部的类class CInner{ ...};// 负责表示聚合类class CAggregate{ ...public: CInner& GetInner(void);private: CInner m_Inner; ...};原创 2008-10-07 13:07:00 · 527 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款15:区分基类和接口
重构 — 改善既有的类图设计 条款15:区分基类和接口黄国强 2009-6-17基类和接口,二者非常相似。我们可以通过他们所服务的对象来区分区分他们。这个角度非常重要。 基类的服务对象是其继承类,而接口的服务对象是使用这个接口的外部类。基类的存在是由于其包含了很多公共函数或数据,是实现。而接口反映的是系统的需求,本身包含了做什么的信息,不包含怎么做的信息。原创 2009-06-17 15:56:00 · 740 阅读 · 0 评论 -
软件开发没有年龄限制
软件开发没有年龄限制黄国强 2009-5-21BBS上这类帖子总能引来大量的点击率,说明大家对这个问题都非常关注。这个也充分体现了大家对程序员职业规划非常引入关注。我今年40岁,应该有资格谈点自己的看法。 吃青春饭的行业很多。比较明显的例子就是足球运动员。超过40岁的足球运动员很少,记得以前德国国家队有一个球星叫做马特乌斯。很牛,40多岁还代表国家队踢世界杯,原创 2009-05-21 10:45:00 · 4829 阅读 · 0 评论 -
盲人摸象-谈软件的模型
盲人摸象-谈软件的模型黄国强 2009-4-30 软件开发中我们总是提到“模型”,那么“模型”到底是什么呢?盲人摸象这个故事就很能说明问题。 我的观点是:模型就是我们对客观事物的抽象。我认为一个完整的软件一般由界面模型、领域模型和存储模型组成。 我们在开发一个系统的过程时候,和盲人摸象中的盲人非常类似。随着开发的不断深入,整个开发过程就是不断的完善原创 2009-04-30 13:00:00 · 928 阅读 · 0 评论 -
类依赖关系的方向
类依赖关系的方向黄国强 2009-3-26 我的博客中的类图中大致会出现三种关系,即:一般依赖、继承和聚合。有些博友可能不太清楚依赖关系的方向,故我在这里集中说明。见下图。 下面分别举例说明。1 一般依赖关系class B{};class A{... void func(B * pB);...};这个例子中,类A引用了类B,故依赖方向是类A指向类B。2 继承关系class原创 2009-03-26 09:45:00 · 1462 阅读 · 0 评论 -
从职位的角度来理解软件接口
从职位的角度来理解软件接口 黄国强 2009-2-20 在C++中,并不存在特别的接口关键词。同类一样,都用class这个关键词。所以很多人把接口和基类混为一谈,显然这是错误的。下面将从职位的角度来试图回答“接口是什么”“怎样理解接口”这两个问题。先看一段代码。// 负责表示秘书职位接口,受雇为上级处理通讯及日常事务和杂务class ISecretary{public:原创 2009-02-20 13:24:00 · 819 阅读 · 0 评论 -
软件需求和软件功能的区别(2)
软件需求和软件功能的区别(2)黄国强 2009-1-20 前面的文章提到了软件需求和软件功能的区别,得出了如下结论: 软件需求关注的是做什么的问题,而软件功能关注的是怎么做的问题。软件需求是为用户服务的,而软件功能是为软件开发服务的。相对于软件需求这个目的,软件功能是手段。 最近,又想到了一个比上次举的例子更好的例子。这就是汽车的例子。 假设我们需要设计一款原创 2009-01-20 13:46:00 · 2949 阅读 · 0 评论 -
重构 — 改善既有的类图设计 条款14:将多个继承类对外部的依赖上移至基类
重构 — 改善既有的类图设计 条款14:将多个继承类对外部的依赖上移至基类黄国强 2008-12-29 首先看图一。图一 图一中,类2、类3和类4都是从类1继承。它们同时依赖于类5。这张图第一感觉就是不好看,因为有交叉存在。重构也很简单,正如题目所言,将外部的依赖上移至基类就解决了这个问题。如图二所示。图二 下面用代码来说明这个重构。class Class5{};class Cl原创 2008-12-29 16:46:00 · 707 阅读 · 0 评论