声明:关于代码阅读的研究,很多思想和文字是来自《代码阅读》这本书,再加上自己的学习和工作经验。可以说是类似读书笔记的,我把它作为了毕业论文的第8章,并结合了自己的毕设作品进行解释,毕设源代码github下载地址:https://github.com/chinaran/A-LL1-Compiler。
8.5系统架构从源码库中识别一个系统的架构可能是困难的,然而,认识了重要的架构元素以后,就能很容易地浏览这个系统、领会其结构和属性、规划新增内容、修改,以及进行重构活动。下面我将剖析编译系统的架构。
8.5.1MVC简介MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。其目的是实现一种动态的程序设计,使后续对程序的修改和扩展简化,并且使程序某一部分的重复利用成为可能。除此之外,此模式通过对复杂度的简化,使程序结构更加直观。软件系统通过对自身基本部分分离的同时也赋予了各个基本部分应有的功能。
● Model模型:用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。
● View视图:用户看到并与之交互的界面,实现数据有目的的显示。
● Controller控制器:起到不同层面间的组织作用,用于控制应用程序的流程,处理事件并作出响应。
图 8-9 MVC架构模型图
MVC最初在Java EE平台很受欢迎,现已被广泛使用。例如笔者公司主要使用C++开发软件,用的也是MVC模型,其结构清晰,可维护性和扩展性极强。
8.5.2MVC使用编译系统使用的就是MVC架构,但又不完全一样,如下图
图 8-10 编译系统MVC示例
其中,MVC的层次以不同的包划分的。compilers.javabean包为Model层,封装了编译过程中用到的数据,如Terminal.java对终结符进行了定义,Production.java对产生式的结构进行了定义。
compilers.main_ui包为View层,负责界面显示。用Java的swing组件编写界面有些麻烦,不像在Visual Studio平台使用C# 拖拉拽方式就可以绘制界面。但通过对界面的组件的组织和应用,可以更清晰的了解界面绘制的过程。
图 8-11 编译系统主界面
通过对swing的相应组件重新封装,使界面元素独立出来,降低耦合性,菜单栏封装在MyMenuBar.java中,工具栏封装在MyToolBar.java中,显示面板封装在MyMainPanel.java中,可编辑文本区封装在MyText.java中。最后MainUI.java中对各个元素进行布局和组织并作为软件的启动项。这种设计也是一种分层的思想,可扩展性非常好,例如想新增一个菜单项,只需要在MyMenuBar.java中添加菜单就可以,不需要更改其他部分。当触发组件时(如选择菜单项、点击按钮),会向Operaor.java的一个处理函数发送一个命令,这样只有一个事件入口,利于组织对事件的处理。
其余的包为Controller层,compilers.tool包负责解析XML数据文件,compilers.util包负责对语法树的操作,compilers.scanners包和compilers.parsers包分别负责词法分析和语法分析。此外,compilers.unit_test包不会对程序的运行产生影响,它主要作用是单元测试,compilers.what.todo包记录了自己要做的事和编程时临时蹦出的想法,相当于办公OA中的笔记本。