人们都善于用直观简单的方式来理解事物,我也坚信,所有优秀的解决方案都是直观而简单的,我喜欢直观而简单的解决方案,也许在找到直观简单的解决方案之前,我们已经尝试了用很多复杂费解的方式来解决问题。如果你不能把我们程序的解决方案用通俗易懂的方式给隔壁卖青菜的阿伯解释清楚的话,说明,这个解决方案还不够好――还不够简单和直观。宇宙够复杂了吧,可是霍金却创作《时间简史》系列的科普读物,既然是科普,它的读者就是广大的普通老百姓,不一定非要是物理学或天文学的博士。

在软件解决方案上,为了追求直观而简单的解决方案,我们发明了面向对象,之后又是N层架构、面向组件、AOP,又到现在比较热门的MDA、WebService等等。我们所做的一切,都是为了将复杂的问题简单化,这个过程是一个进化的过程,随着这个过程的演进,事物越来越接近它自己的本质。比如,将数据和操作数据的动作放在一起变成了类,这样,各个类之间就有了界限,就像自然界中的一个个独立的实体,这就向事物的本质靠近了一步。在类的基础上,我们又根据共同的语义将共同的行为剥离出来,形成接口,这就像自然界中的生物的系/族,这向事物的本质又靠近了一步。整个自然界或者说整个人类社会最美好的未来在于每个个体都能规范自己的行为,都能自己管理自己,对自己的行为负责,友好地向外界发布自己的信息。这个个体不就是一个优秀设计的类吗?为了这个美好的未来,我们为类加入了属性和事件,以使其在发布自己信息的同时,不对外界的其它个体产生干扰;我们为类加入元数据和反射能力,使其和外界都能方便的得到自己详细身份信息。再后来,我们将业务与基础服务分离(所谓基础服务就是像事务、线程安全等内容),将业务与基础服务分离有很多好处,首先基础服务可以在不同的项目/应用中复用,这通常可以通过AOP或组件的方式进行复用;其次,业务和基础服务分离开后,它们之间的关系更清晰,我们更容易将焦点集中到业务上,这也会使事情变得更简单,因为我们不用在实现某一业务逻辑的时候还需要考虑在什么地方插入加锁代码来确保这个逻辑是线程安全的。

我们应该都有这样的经历,在对多线程、网络、数据库这些基础服务都不熟悉的时候,编写一个应用服务器,难度会是多大?我们经常都是不知如何下手,更别谈什么结构设计了。在我们慢慢的熟悉这些概念并实践了多次之后,我们就有信心来实现我们应用程序的业务功能。如果现在我们完全不用关心这些基础服务,只需关心业务逻辑,那么我们的信心不就是更大了吗?这是因为我们能有更多的精力去分析理解我们的业务,对我们的业务分析的越透彻,我们的设计就会越直接、越简单。这就是我们的目标。

为了获得简单直接的设计,我们通常要注意以下几个方面:
(1)组件之间的耦合度小。每个组件应该自解释、自描述、并且是自给自足的。
(2)类图简单。请注意类的体积,把太庞大的类分解为多个,把耦合太紧的类融合为一个。
(3)交互图简单。
(4)使用合适的设计模式。能沉淀下来的总是精华!
(5)重构、重构、再重构……,这是我最大的法宝!!!

直观而简单的解决方案--软件设计的永恒追求相关推荐

  1. 数字签名软件设计的简单过程

    数字签名软件设计的简单过程 发送方发送文件过程 发送方采用信息摘要算法为要传输的文件生成数字摘要 对要发送的文件MD5,生成数字摘要 import hashlib file_bytes=b" ...

  2. [Apple Shapr3D]【续更】【shapr3D】认识Shapr3D,一个简单易用的设计类软件

    本文适合对象:工程设计.土木工程类的学生可以参考参考,以及对3D建模感兴趣的朋友!艺术设计的同学们,等等我!nomad我晚些再写!!! 使用的软件:Shapr3D 使用的硬件:iPad 9 gener ...

  3. 软件设计体系-简单工厂模式实例二---权限管理

    在某OA系统中,系统根据对比用户在登录时输入的账号和密码以及在数据库中存储的账号和密码是否一致来进行身份验证,如果验证通过,则取出存储在数据库中的用户权限等级(以整数形式存储),根据不同的权限等级创建 ...

  4. figma设计_Figma中简单,可重复使用的设计系统

    figma设计 Putting together a design system may seem like an unnecessary hassle. It's often easier to j ...

  5. 软件设计-UML/数据流图/流程图绘制工具

    文章目录 概述-工之利器 EA使用入门 导入工程头文件 打开工具箱 工具箱操作符使用 直接导入代码类 工作视图设置 类添加操作异常 类元素显示包路径 Visio使用 工具功能 添加链接点 拷贝-空白区 ...

  6. 软件设计: 抽象无处不在

    现代的软件科学中, 很多内容和概念, 实际上是从数学/语言学等相当古老的领域里借来的, 为什么呢? 因为软件科学中的很多方面, 与其它学科中所碰到的问题并无不同. 一套数学理论,某个数学公式,无论从哪 ...

  7. 计算机助学教学软件cai是,小学语文教学设计 [用教学设计理论指导CAI软件设计]...

    摘要:计算机辅助教学活动的开展关键在于教学软件,教学软件的质量和实用价值直接影响到教学效果.本文在对当前CAI软件中存在的一些问题进行分析的基础上,指出问题的根源在于没有注重前期分析,并从教学设计的前 ...

  8. 由学习《软件设计重构》所想到的代码review(二)

    前言 对于一个程序员来讲如何来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我经常接触的一些程序员来看,他们买了很多技术重构类书籍,但是看完后代码编写能力并没有显著提高 ...

  9. 面向对象软件设计的“开—闭”原则

    1.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  10. 重拾面向对象软件设计

    简介:从上个世纪五十年代冯·诺依曼创造第一台计算机开始,一直到现在只有短短70年时间,从第一门计算机语言FORTRAN,到现在我们常用的C++,JAVA,PYTHON等,计算机语言的演进速度远超我们所 ...

最新文章

  1. Python继承,子类调用父类的两(2)种方法
  2. Oracle-PL/SQL基础
  3. 详解操作系统中虚拟内存与物理内存的关系
  4. 基于PaddleOCR实现AI发票识别的Asp.net Core应用
  5. Linux SVN迁移备份的三种方法
  6. Java 并发编程之 ThreadLocal 线程局部变量
  7. Lync Server 2013 安装准备工具 for Win 2008 R2
  8. append是什么意思java_关于append()问题
  9. python简单应用_python之Click的简单应用
  10. 【前端】倒计时、秒杀、定时器
  11. 棒棒的毛笔字PS教程
  12. linux开发板通过网线连接电脑
  13. 3dmax如何删除多余的时间帧
  14. 怎样自己创建一个个人网站,怎样将自己写的网站发布到外网?
  15. 撸猫游戏千千万,他们凭什么被推荐?
  16. Axure谷歌浏览器扩展程序下载及安装方法(免翻墙)
  17. 移动web(h5页面)适配
  18. C语言实现科学计算器
  19. 基于STM32F103C8T6实现流水灯的操作实验
  20. 【实战】物联网安防监控项目【2】———boa服务器的移植

热门文章

  1. Rust: 如何读写中文字符?
  2. 一文看懂微服务,阿里云原生资深专家李国强独家分享
  3. 阿里云郑晓:浅谈GPU虚拟化技术(第二章)
  4. java值传递人体自_请大家帮帮我这个初学者
  5. 【优化算法】蛾群优化算法(MSA)【含Matlab源码 1807期】
  6. 【单目标优化求解】基于matlab粒子群混沌混合蝴蝶优化算法求解最优目标问题(HPSOBOA)【含Matlab源码 1538期】
  7. 【三维路径规划】基于matlab粒子群算法无人机山地三维路径规划【含Matlab源码 1405期】
  8. 【图像隐写】基于matlab GUI DCT变换图像隐写【含Matlab源码 1380期】
  9. 【元胞自动机】基于matlab元胞自动机超车换道【含Matlab源码 359期】
  10. android mat教程,OpenCV for Android - Access elements of Mat