通用的示例说明:
- 本系列博客只讨论工具的基础,不讨论任何语言。
- 甚至不讨论快捷键:-)
- 可以用鼠标就完成本教程
- IDE默认指代的是Visual Studio 2013 Community Edition。 本系列文章的结尾,你可以熟练地使用它写程序。
- 将Visual Studio启动后的默认布局状态称为主窗口,主窗口标题栏中显示的项目名称不必要。
- 在日常口语和Windows资源管理器的基础上定义了几个描述菜单操作的符号:[]、{}、/、>>、=、(,)。
- 检查一个设置项的表示方法为:
- [窗口名称]/{菜单名称}/{子菜单名称}/{设置项项名称}=设置项的值
- 例如默认的Debug配置:
- [主窗口]/{解决方案配置管理器}=Debug
- 检查多个设置项时,按照单个设置项的方式,逐一写出
- 检查一个设置项有多个值的时候,用括号包括并用内部的逗号分隔,如:
- [解决方案资源管理器]/{项目名称}/{引用}=(System,System.Core,System.Data,System.Xml)
- 执行一个左键单击序列,就是将最后的检查项换成”/”,例如退出IDE:
- [主窗口]/{文件}/{退出}/
- 右键菜单的连接符号为>>,例如刷新Windows桌面:
- [桌面]>>{刷新}/
- 弹出窗口中的设置项的表示与上类似
- MDI子窗口中设置项的表示与上类似,注意到在Visual Studio中,MDI子窗口的名称在它的左上角或者可能自动吸附到主窗口的四周
- 标题栏和状态栏作为菜单的推广,适用于上述表示方法
- 缺陷说明
- 欢迎反馈,mailto:[email protected]
- 作者的首选语言是C#
- 作者是软狗
- 作者的IDE没装中文语言包,所以有的名词翻译得不准确:-(
- 由于还没有厘清相关的证书问题,版权保留
- 系列文章没有提出或解决新的问题,目的只是科普
正文
在Visual Studio(以下简称IDE)当中,存在两个很微妙的专用名词”项目(project)”和”解决方案(solution)”。这两个概念对于我们组织工作有怎样的启示呢?
首先,从目录结构的特点来认识Visual Studio。
当我们以空白环境启动IDE后,通过
[主窗口]/{文件}/{新建}/{项目}/,可以呼出[新建项目]窗口。
在[新建项目]窗口中任意选择一个项目模板,由于默认有
[新建项目]/{解决方案}=创建新的解决方案,
因此在完成新建项目后,在[解决方案资源管理器]中出现了一个解决方案内含有一个项目的情况。
此时,
[解决方案资源管理器]/{项目名}>>{在Windows资源管理器中打开}/,
可以看到这个项目具有独立的输出目录:bin目录,其中的Debug文件夹就是项目的输出目标。
回到主窗口,
[主窗口]/{新建项目}/得到[新建项目],
再建一个项目附加到当前解决方案,
[新建项目]/{解决方案}=添加到当前解决方案。
此时,观察目录结构是
- 解决方案
- 项目1
- 项目1.csproj
- bin
- Debug
- Release
- 项目2
- 解决方案.sln
- 项目1
很显然,这样的设计哲学呈现的是,项目代表了某种”单元”的东西。而解决方案就是这些”单元”的集合。请试着猜想,我们对项目的引用进行添加的时候,自动生成的信息到哪里去了?是’解决方案.sln’还是’项目1.csproj’?
我们可以把这种特性用来组织程序的编写工作。也就是把项目(project)作为可以复用的单元。这个单元比类高级,因为类实质就是文本文档。这个单元又比实际的应用程序低级,因为有一些项目它不产生新的.exe只产生新的.dll。其实这个等级恰恰就是常说的”模块化重用”中的模块。
第二,从项目的引用和输出来思考Visual Studio的组织
既然输出是指,使用Visual Studio所做实际工作对应的新增项。那么它可能是一个dll,也可能是一个.exe。总之,它一定是一个新增的单元。
可以提出一个简单的问题:一个项目可以对应几个引用项目?一个项目可以对应几个输出项目?一个引用项目可以对应几个项目?一个输出项目可以对应几个项目?实际上通过自己编写编译脚本,比如Makefile之类的东西,是可以精确掌握编译的过程。但是很显然,在Visual Studio当中没有要求强制写编译脚本。可以说,既然编译过程可以自动化,那么为什么不利用这个好处呢?
利用这个好处的结果就是对上面问题的一种解答方式:一个项目可以引用多个项目,一个项目就是输出一个项目(假如是Application模板,那就是一个.exe,类库就是一个dll),而一个项目可以被其他任意多个项目引用。
借助这样的模块化统一思想,可以更加科学地划分问题域,限制问题出现的范围,有效地形成复用。
最后,从他人的应用程序来猜测Visual Studio中的组织
以360安全卫士为例,360安全卫士很显然对应一个”解决方案”。其主界面可以对应于IDE中的一个桌面应用程序项目,模块化的实际功能就可以对应于IDE当中的类库项目。同样的理解,还可以应用于其他的应用程序。
对于应用程序的安装包打包,实际上就是IDE当中的特殊项目:部署。
总结
一个功能丰富的应用程序很难像”Hello,World!”这样简单。Visual Studio提供了自动化的项目管理方法论,在其中,解决方案面向总的问题域,项目则提供了模块化的实现方式,理解并遵守这种方法论或许不能避免造轮子,但可以一定程度上避免自己始终造同一个轮子。