软件结构与环境配置概述

回眸只為那壹抹淺笑 提交于 2020-03-05 23:01:31

 

对刚接触某一领域的萌新来说,学习软件使用、配置软件环境经常是第一件头疼事。从网上搜的教程看的半懂不懂,自己操作还容易出现很多别人很少遇到的问题,导致浏览器变成递归式学习的栈。本篇文章希望通过多个软件配置的例子,从软件设计的角度看待软件配置,总结出一般经验,提炼出一些常用的知识。也希望后来人少踩些过来人踩过的坑吧。

 

最近更新时间:2019-07-13

 


 

Part 1.关于软件的目录

首先我们通过几个例子直观地认识一下软件目录:

(JDK安装目录)

 

(Apache Tomcat安装目录)

 

(MySQL安装目录)

 

通过以上例子以及平时安装软件的经验,不难发现很多软件的目录命名有一些相同点。这很好理解,如果你是软件设计师,一定希望自己的软件文件夹有意义明确且简略的名字。正是基于这种思想,软件文件夹的命名比较“约定俗成”。当然,不同软件的各种文件夹名字可能不尽相同,但由于大型软件设计的方式比较类似,所以文件夹的意义应该是差不多的,总结经验时应该从文件夹的意义入手。下面对几个常见的名称进行分析:

  • bin文件夹:大多数的软件都有这样一个文件夹。bin也就是binary,二进制。我们知道计算机只能识别由0和1组成的(二进制的)机器语言,所以想要计算机执行命令,必须把它们通过各种手段变成0和1的组合。因此,bin目录一般用于存放可执行(executable)文件,后缀名经常为  .exe , .bat等。打开软件,常常就是执行bin目录下的一系列可执行文件。
  • conf文件夹:即config,配置的意思。软件的配置文件,就像是一个遥控器,通过它可以定义软件的一些外观和行为。为什么要使用配置文件这种形式来修改软件呢?对于一个简单的程序,在代码中设置if,变量等足以修改程序的行为;但对于一个大型软件,使用这种方式既不方便他人(程序员、用户)修改,也将修改与程序逻辑杂糅在了一起(耦合性高),容易出错。所以作为一种最佳实践,配置文件应运而生。配置文件实际上就是一个“字典”(python中的字典,c和java中的map,json的设计思想),或者说“键值对”。程序通过“键”在配置文件中找“值”,把“值”赋给变量,完成从配置文件到程序的数据传输。
  • lib文件夹:即library,图书馆,引申为库的意思。在计算机领域,库是写好的现有的,成熟的,可以复用的代码。我们在屏幕上输出文字,并非用汇编语言在屏幕缓冲区编辑数据,而是直接调用printf函数,就是因为函数封装好了一系列复杂的行为。因此程序设计强调“子程序”,软件工程强调“可复用性”。基于这种思想,软件设计者将代码需要用到的其他代码放入“库”中,想要使用的时候include一下或import一下就好了。从广义上来讲,可以被重用的“东西”就可以放入库中,不一定是可执行文件。
  • log文件夹:存放了各种程序的日志。日志是对软件完成了某些处理、经历了某些操作或出现了某些错误的记录。大多数日志是给人分析的,所以应该拥有良好的可读性(当然前提是你对这个软件的功能有一定的了解)。也有一些log使用其他格式编写,打开可能是乱码。log的名称标示着它的作用,比如error.log,install.log 等。
  • temp文件夹:即temporary,暂存文件。缓存是一种典型的“空间换时间”策略,这也是环境变量Path的存在思想。比如我们有一张混乱的查找表,正常遍历一遍需要O(n)的时间复杂度,但如果你要寻找的那个“键”之前找过了,被记录了,那么下次我先寻找那个记录,一下子就匹配上了。这也就是使用记录的一点内存去换取遍历的时间,这种思想在数据结构的设计和操作系统中非常常见。很多电脑卫士、手机卫士清理内存的方法就是删除这些temp文件,从产生temp文件的意义的角度来看,这种行为可能不太合理。因此,这个文件夹一般不需要我们操作。有时我们对软件进行了误设置,(广义上的)删除temp文件也可能是一种解决方案。
  • resource(source、res、src)文件夹:存储了程序的资源文件。资源是一个很宽泛的概念,图片视频是资源,排版布局的格式(XML、CSS),甚至字符串数字等等都属于资源。软件讲究“资源与代码分离”,提高软件的可维护性,降低耦合性。举个例子:如果想把植物大战僵尸的豌豆改成子弹,并不需要修改游戏逻辑,只需要在资源文件夹中,用子弹的图片替换相应的豌豆图片就可以了。
  • plugin文件夹:存放一些程序的插件,即对程序现有功能的扩展。文件夹本身没什么好说的,而“扩展”的实现则依赖于良好的设计模式了。软件与生活中一般产品产品的最大区别就在于易于更改,使用软件的用户的需求也常常反复多变,这就要求软件设计要有良好的可扩展性。如何制作高性能、用户友好、易于扩展、易于服用、易于审查... 的优质软件,就是软件工程师们所要研究的课题。

 


 

对文件夹的意义初步了解后,顺便看看常见后缀名的文件都是做什么的:

  • .bat文件:批处理文件,就是一个脚本,用于简化用户操作。比如我打开软件有一个固定的格式:【1.打开bin目录的init。2.打开bin目录的start。3.打开plugin目录的ext】,就可把这些操作按照一定的格式写入批处理文件,让它帮我完成这些固定的操作。
  • .conf,.properties文件:上文提到的配置文件。
  • .dll,.lib文件:动态库和静态库文件。dll全程Dynamic Link Library,与静态库的lib相对。将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,这种链接方式称为静态链接。但设想:如果我有10000个调用了printf函数的程序,它们每个都要打包一个静态链接库,是非常浪费空间的。动态链接机制就是为了解决这个问题而生:重复的代码在计算机中只存在一份,程序运行时才进行动态地载入,而不是链接时一起打包。这样处理既规避了空间浪费问题,也解决了静态库对程序的更新、部署和发布页会带来麻烦的问题。用户只要按需更新动态库即可,增量更新。

 


 

 

Part 2.环境变量那些事儿

如果你是一台计算机,想要执行一个确定的可执行文件,你需要得到哪些信息?

  • 文件路径
  • 文件名

也就是一个文件的确切位置。在Windows系统控制台中,可以通过在文件所在目录中,输入文件名来执行它。

 

有时我们要执行的程序分散在各处,挨个寻找它们的路径是非常麻烦的。而对于操作系统而言,“用户”可不止人类一个:程序还会向操作系统发送各种指令。比如我点击了Eclipse中的Run按钮,Eclipse会去执行javac ,java等命令,而Eclipse这个程序可不知道我们把Java安装到了哪里。想要随时随地运行一些常用的程序,又不想让操作系统遍历整个文件系统去找(事实上操作系统根本不会去找,而是直接告诉你没有发现)就需要环境变量Path了。

环境变量的设置是一种典型的空间换时间的策略。当我们输入一个执行文件的命令时,系统会先从当前目录寻找此文件,如果找不到就会从环境变量之中寻找。我们将一些常用的程序的目录添加到环境变量之中,就可以(让我们自己或者应用程序)随时随地执行那些文件了。

为哪些目录配置环境变量?这要看应用程序和个人的需求。

比如:通过对Tomcat的批处理文件分析发现,它需要Tomcat的安装目录,并且用CATALINA_HOME去引用此目录。

所以我们应该在环境变量中添加键为CATALINA_HOME,值为你的tomcat安装目录的一项。这是环境变量设置的程序基础,事实上,配置环境变量时,只要按照网上的教程一步一步来就可以了,不需要自己分析源码。

环境变量的设置网上一抓一大把,这里就不多说了。Java的配置:https://www.runoob.com/java/java-environment-setup.html

 __未完待续__

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!