如何设计一个应用软件

当今时代软件行业各种新的技术层出不穷。但是我认为软件行业最根本的技术在于以下几个内容:
1、操作系统。
2、编译系统。
3、数据库管理系统。
4、协议。
5、算法。
6、应用软件。

这六种技术构成了各种各样新技术的根基。

计算机发展至今,以应用软件种类最为烦多。国外有着众多商业化的应用软件提供商。Windows下我们所熟知的应用软件有:MS Office/Photoshop/Flash/Firework等。我这里所讨论的应用软件指的是经典的应用软件,它们有一些共同的特点:可以创建新的文档,可以保存文档,可以读取文档,可以对文档按要求进行修修改改。Windows下记事本可以认为是最简单最基本的应用程序。而其它一些软件,例如扫雷、纸牌归入游戏软件,winamp归入娱乐软件,DAEMON Tools Lite归为工具软件,它们均不归入我在这里所讨论的应用软件。

国内的应用软件能够在国际舞台上占据一席之地的并不多。归根结底是利益的问题,因为应用软件的开发存在着开发周期长、设计非常重要、需要开发人员多、投入大等问题,并且短期内不能实现赢利。我们可以想像,从头开发一个类似于Photoshop的软件,需要多少人月才能完成。因此国内的许多厂商宁可花费巨资去开发游戏,因为游戏有有效的赢利方式。

应用软件的开发需要沉淀。这里的沉淀理解为“一个城市有着深厚文化的沉淀”的沉淀。因为应用软件总是在不断的升级过程中。升级似乎不会有尽头。升级也伴随着操作系统的升级。有时可能需要将应用软件从一个平台移动到另一个平台上。升级的主要目的是增加新的功能,增加合理的智能提示,校正以前的一些BUG,改变更加优美的界面等等。例如我们所熟知的MS Office的升级之路:MS Office 97/MS Office 2000/MS Office XP/ MS Office 2007,这中间可能还会有我漏掉的一些版本。

很显然,应用软件的设计非常重要。一个好的设计可以使得优秀的软件在升级过程中后来居上,一个不好的设计可能会使得开发陷入泥潭,使得升级工作无法进行。

以下内容我以我所写的MyUML建模软件为例,讨论如何设计一个应用软件,希望能够给希望从事这一领域的人们一点启示。myuml在ww.myuml.net下载。

写MyUML的过程中,我感觉到写应用软件可以归纳为一个框架模式,我这里所说的模式可以理解为“分析和设计模式”中的模式。实质上这种模式类似于MVC模式,我只不过是将其具体化、拓展。

一、首先要考虑开发平台、开发语言。
如果使用Java语言进行开发,可能就不需要考虑运行的操作系统了。例如建模软件中的argoUML,在Linux和Windows下都能不做更改、很好的运行。但是Java语言所写的软件在速度上还是偏慢,不过随着电脑硬件速度的提高,这个问题正在得到解决。

如果在Windows下进行开发,可能还需要考虑微软公司的ActiveX技术,通俗的讲,就是可以直接在浏览器中使用我们所编写的应用程序打开我们的应用程序所支持的文档,或者在Word中直接插入我们的应用程序所支持的文档,或者在我们的应用程序中插入Excel文档等等。

我一直比较偏爱c++,因此使用了c++来写这一个应用程序。为了便于移植,没有考虑微软公司的COM技术。

二、应用软件的内核:对象或者数据结构+算法
很显然,面向对象相对于面向过程更适用于写应用软件。
这里涉及到主要问题是应用软件应该采用怎么样的对象来表达对应的文档。

注意在此时,我们的应用程序还没有任何图形化的界面。我们希望能做的内核能够达到这样的要求就行了:在测试程序中,说的通俗一点,就是我们写一个main函数,然后在该函数中,我们可以创建一个对象,然后调用该对象的各种方法,跟踪其方法,查看是否能够实现要求。

例如我写MyUML的过程中,就一直使用这种方法来测试内核的正确性。我会创建一个模型对象,然后调用这个对象的“添加包”方法、“添加类”方法等等。做这些事的时候,我甚至根本就没有考虑过以后的用户接口界面也就是图形界面究竟是什么样子。

三、应用软件的文档:文件、文件格式、文件保存及读取。

通常来说,一个实用的应用软件,其文档所对应的对象(或者数据结构)是非常复杂非常庞大的。例如Word,一篇文档可能包括各种不同格式的文字、插入的图像、自己绘制的图形、甚至还有链接的Excel对象等等。因此这里还有一个大的问题需要解决:如何将这个对象的所有信息正确地保存到文件上及如何将其从文件中正确的读取出对应的文档对象?

解决这个问题同样有多种方式,一种方式是创建自己的专有文件格式,例如DOC文档、FLASH动画文档、Photoshop所创建的PSD文档,这时自己可能需要做详细的文档(这里的文档指的是记录这些专有文件格式的文档),将这些格式进行记录,供开发人员参考。第二种方式是采用公开的文件格式,当然最好采用标准化后的文件格式。第三种方式是采用XML来记录文件格式。

我使用的是第三种方式。XML用来记录对象信息有一种独天得厚的优势。当然具体内容请各位朋友们参考相关书籍。在这里涉及到第一个支持库的问题:是使用已有的XML解析库还是自己写一个XML解析库?当然网上也有开源的高手们所写的XML解析库拿来参考。我最后选择了APACHE的XERCES_C解析库。

谈到库的时候顺便谈一下STL库。STL虽然是一个标准库,但是有许多实现。到底选择哪一个呢?仁者见仁,智者见智。我选择的是STL port。

这些库中也可能会存在BUG或者不足之处。当然出现BUG的可能性是非常非常小的。如果碰到对中文的支持不够,改为Unicode编码即可。同时建议我们写程序的时候,如果有用到这些库,最好循规蹈矩,不要玩花样。

四、应用软件的界面及各种辅助库。
如果内核写出了一个大概,就可以考虑写界面。根据我的经验,内核不可能一次到位,最终还是要修改的,不过只要将内核和界面的接口处理好,实现我们软件工程中的最小耦合,内核和界面的相互间的影响并不大。

商业厂家可以请专业人士设计界面。相对来说,界面离不开:框架窗口、菜单、工具栏。用户使用应用软件通常从菜单入手或者从工具栏入手。

我们个人写界面通常也不大可能直接从Windows SDK写起,当然排除一些高手。顺便提一句,我看过罗云彬先生的《Win32汇编教程》(书名忘记了,大致是这个意思,现在我这里不能上网,不能确定),看完后,我认为完全可以从汇编语言写界面,不过效率可能会低一点。

界面库也有许多可以供选择。Windows下最有名的当然是MFC了。我写MyUML的时候,QT还没有出LGPL许可证,c系的图形库我用着实在是有些不习惯。最后我选择了MFC。

同时我们可能还需要一些写一些辅助库来实现我们的应用程序。例如在MyUML建模软件中,需要处理绘图,因此我将相应的绘图的功能写在一个图形库中。

五、应用软件的视图
视图的功能是将文档以可视的方式显示给用户。我们可能会需要以不同的方式查看文档,或者我们需要查看文档的不同内容,因此可能需要有多个视图。

例如在MyUML建模软件中,我们可能需要查看一个模型的内容,这个模型中有哪些包、有哪些图、有哪些类等等,这里我们需要用一种视图来表示模型的内容。通常使用树的方式比较合适。我们也可能需要查看一个类的属性,一个图的内容。这时图的内容可以使用MFC中CView类的派生类的方式,而类的属性可以使用一个对话框来表示,它们都可以视为视图。尽管在MFC中视图类是一种特殊的类。

洋洋洒洒写了这么多。真正实现一个实用的的应用软件的时候,可能会遇到各种各样的困难,但是这些困难都是可以一一克服的。因为别人能做到的,我们也能做到。

如何设计一个应用软件相关推荐

  1. 模板方法(设计一个稳定的父类框架,框架中的有一些步骤是可变的,将可变的步骤子类中来实现)

    模板方法设计模式的意图 设计一个框架,框架中整体步骤不可变,但是其中的有一些步骤是可变的,将可变的步骤放在不同的业务或者不同的模块对应的子类中来实现 举例 我们平时玩手机,我们可以将玩手机的过程分成以 ...

  2. 设计一个低成本的无线传感器网络节点

    设计一个无线传感器网络节点 ■ 中科院计算所 徐朝农 赵磊 徐勇军 借助SOC技术,无线传感器网络节点的体积就可以大大减小,应用领域和范围会不断扩大. 计算机技术从诞生之日起就一直朝着小型化.智能化和 ...

  3. java 设计一个geometricobject类,geometricobject类

    (2) Circle 类和 Rectangle 类是 GeometricObject 类的子类,其中应实现 父类的抽象方法. (3) 程序主方法中创建两个几何对象,一个圆和一个矩形,并用 ...... ...

  4. 设计一个矩形类rectangle_万字长文带你捋清六种设计模式的设计原则(建议收藏)...

    对于设计模式,自己很早之前就看了好多本设计模式书籍,其中一些还看了好几遍,也一直希望自己能在编码的时候把这些设计模式用上去.可是,在日常的打码中,用的最多的就是单例,其次是观察者和建造者模式 ( bu ...

  5. 如何更新你的机器学习模型?手把手带你设计一个可持续的预测模型!

    作者 | CloudFactory 译者 | 天道酬勤 责编 | 徐威龙 出品 | AI科技大本营(ID:rgznai100) 高效的机器学习模型需要高质量的数据.训练你的机器学习模型并不是过程中的单 ...

  6. 如何设计一个支撑数亿用户的系统

    欢迎关注方志朋的博客,回复"666"获面试宝典 要设计出一套能支撑几十亿人的系统是很困难的.对于软件架构师来说,这一直是一项很大的挑战,但是,从现在开始,看完我的文章,你就会觉得容 ...

  7. 教你设计一个超牛逼的本地缓存!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:ksfzhaohui juejin.im/post/5dd9 ...

  8. 如何设计一个牛逼的本地缓存

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:ksfzhaohui juejin.im/post/5dd9 ...

  9. 如何设计一个本地缓存

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://i7q.cn/4xPYgB 前言 最近在看My ...

  10. java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...

最新文章

  1. redis开启远程连接
  2. madplay播放器移植
  3. Sublime text 2/3 中 Package Control 的安装与使用方法
  4. 果园机器人的课文_小学三年级下《果园机器人》课文
  5. Verilog读写文件
  6. Angular模态框
  7. Acwing第 36 场周赛【完结】
  8. brtools备份与恢复
  9. 2月28日云栖精选夜读 | 阿里云率先达成国家绿色数据中心标准,平均PUE低于1.3...
  10. 「PowerBI」使用TabularEditor进行PowerBIDeskTop模型开发最佳实践
  11. 如何有效开展小组教学_高效课堂 有效教学 | 教育部专家到徐州市第三中学开展教研活动...
  12. svn复制出来的java_从svn下载的项目(或从别处拷贝来的)报错的可能情况以及解决经验...
  13. linux修改非root用户密码永不过期
  14. 腾讯 PCG 招计算机视觉实习生!52CV关注者可加速面试进程
  15. 【转】Oracle DECODE函数的语法介绍
  16. java ee jsp程序_JavaEE程序设计及项目开发教程(JSP篇)
  17. 2010-2019年中国城市统计年鉴分享
  18. Linux自学、大数据学习前奏笔记---Linux基础知识,shell命令介绍学习
  19. matlab符号运算转置出现conj的解决办法
  20. 虚拟摄像头之九: IMX8Q 的 camera.imx8.hal 框架详解

热门文章

  1. poi设置excel表格边框,字体等
  2. 微信公号开发之自定义菜单攻略
  3. 2019年复旦计算机专硕考研经验总结
  4. 全球时区 简称 缩写 简介 PST EST GMT CST EDT UTC 等
  5. xgp游戏列表_PC版XGP正式公布,畅玩上百款游戏每月只需10美元
  6. mysql临时表关联查询_MySQL如何执行关联查询
  7. VUE移动端案例整合
  8. html英文改中文语言,英文版win7旗舰版系统改成中文语言图文教程
  9. 聚合支付系统设计(三)
  10. wpa_supplicant配置