构件技术专栏
上一期我们介绍了构件技术的基础知识和ILOG公司产品JViews的简单介绍,这一期我们来深入了解JViews的技术,并通过一两个例子来阐述我们如何利用先进的构件简单快速的开发出高性能、专业级的动态交互图形界面。
这一期主要内容:JViews的Diagrammer和Charts;下一期我们将介绍JViews的Maps和Gantt。通过本期和下期的介绍,读者应该能熟悉地利用JViews构件轻松地进行开发应用,能够很快的构造出各种各样的图形界面来,在应用程序、WEB客户端自由使用。
第二期 JViews 技术介绍:Charts和 Diagrammer
JViews Charts介绍
上一期简单介绍中讲到,JViews Charts可以显示种类繁多的图表格式,包括二维点图(2D point),折线图(line),条形图(bar),堆叠图(stacked),气泡图(bubble),区域图(area),高低点连线图(high/low),柱状图(candle),雷达图(radar),极坐标图(polar)和饼状图(pie)等。Charts实现了类Swing组件模型的视图控制器(MVC)框架,明确的分离了数据与表示。数据模型是完全开放和可扩展的,并能与其它应用组件相连。更新通信机制是自动的,透明的。当数据模型变化时,图表也被更新;当用户改变图表时,数据模型也产生变化。
这部分我们就来深入分析Charts的概念、特征、功能和典型应用:
(一) 基本介绍,介绍JViews Charts的各个特征和它的典型用途。
(二) 基本概念,介绍了JViews Charts中各种要素的基本概念。
(三) 一般框架,展示了一般框架和JViews Charts的主要构件。
(四) 应用开发,介绍设计工具,它是一个GUI应用程序,包括可以被用来不用写代码就建立不同的图形构件,以及使用Java API扩展图表构件的SDK。
(一)基本介绍
这部分将向您介绍Charts的各个特征,并说明该产品的特征和它的典型用途。
什么是Charts:
图表(Charts)使用不同的形式(标记,线段,条形等等)用图形化的方式展现数据,用刻度来表示被展现数据的值。
Charts使用图表展示数据,并可以自己定义各种方式,以及在图表中加入各种交互方式。Charts被设计成拥有最优性能和清晰的对象结构,它是处理大量和(或)动态数据模型——比如实时监控系统——的最佳解决方案。
Charts提供广泛的显示类型:
? 标准的笛卡儿图表。数据用笛卡儿坐标系统进行显示,X轴和Y轴分别用水平轴和竖直轴表示,刻度是矩形的,并且成直角。
(笛卡儿图表) (极坐标图表) (雷达图表)
? 极坐标图表用圆形显示数据。数据用极坐标系统进行显示,横坐标的值在圆上显示刻度,纵坐标的值是矩形的,呈放射状排列。
? 雷达图表。雷达图表能够把各个数据相关起来看,并且进行多种类型的比较。在雷达图表中,每个类型的数值都有其自己的坐标轴,从中心点放射出来。同一个系列的数值用线条连接起来。
? 气泡状图,代表了一定离散曲线的表现。
? 高低值图,展现用高低值显示两个数据集,并定义了上升风格(高值比低值大)和下降风格(高值比低值小)。
(气泡状图) (高低值图)
静态和动态图表
图表可以是静态的,就是说当它被显示的时候在外观上是不变化的;也可以是动态的,就是说随着用户的动作或外部数据的变化而变化。
主要特征
Charts具有如下特征:
? 功能完全的API。
? 最优性能以及清晰的对象结构。
? 广泛的显示类型:折线,条形,区域,气泡,高低值,散点,梯形,组合图。
? 方便地定制。
? 数据和其图形显示的明确区分。
? 数据相关的图表。
? 用级联样式表(CSS)动态控制显示的外观。
? 和任何支持Swing的Java应用程序整合。
? Java Beans集,可以在你习惯的IDE中使用。
? 在给定的坐标轴上进行坐标变换。变化可以是线性的,也可以是非线性的。
? 按需导入。按需导入机制使你能够在海量的数据集中,通过只把图表连接到需要显示的数据来控制内存的使用。
? 瘦客户端架构。
¡ 基于标准Servlet Java技术的类包。
¡ 内置支持图形创建。
¡ 支持JPEG和PNG格式的图形(通过添加定制编码可以增加其它格式)。
¡ 客户端图形的自动创建。
? 功能完全的打印API。
¡ 基于标准Java 2打印API。
¡ 多页面打印。
¡ 丰富的页面格式(段落排列,本地字体等等)。
¡ 组合文档(图表,表格,文字混合)。
¡ 可扩展的框架。
Charts的典型用途
用Charts来反应数据,以观察它们的值和趋势走向,比如:
? 需要反应数据,以观察数据的值和趋势走向的应用程序。用户可以很多(比如通过搜索引擎显示Nasdaq指数),也可以是一个公司的某些员工。这些应用程序使用普通的图表,任何人不需要训练就可以看懂。这些图表是只读的,通常在网页上公布(瘦客户端),这些应用程序只是偶尔使用。
? 要求更严格的应用程序,它是专业人员用来完成他们日常工作的。这些图表通常需要实时更新,也就是说,它们和数据流相连接并实时刷新。这些图表由应用程序定制,需要精确的滚动、缩放、指定焦点数据、交互和编辑数据。这样的应用程序在所有的工业中都存在:交易应用,引擎测试(汽车,飞机等)和其它机械测试,网络或应用管理,科学研究。
(二)基本概念
这部分介绍Charts中各种要素的基本概念。
二维和三维
Charts能够把二维的数据模型用三维图表来显示。只有笛卡儿图和饼状图支持三维显示。
数据和视图的清晰区分
Charts基于一个具有MVC模型的Swing变种,称之为可分离模型架构。在这种设计下,模型管理数据或构件代表的数值,而视图管理模型的图形化显示并处理图形上的交互。
图表类型
Charts有四种不同的图表类型:
? 笛卡儿图
? 雷达形图
? 极坐标图
? 饼状图
支持的图形展现
Charts支持八种类型的图形展现:
? 折线
? 条形
? 区域
? 气泡
? 高低值
? 散点
? 梯形
? 组合图
图表区域
图表区域是指所有绘画动作进行的场所(数据本身和装饰的图形显示部分)。
表头和注脚
这些构件是可选的JComponent,对应加入到图表区域的上部或下部。
坐标轴
坐标是由图表自动创建的,默认状态是一个纵坐标。
刻度
刻度可以在图表坐标轴的图形表示上定义,当创建图表的时候自动由图表配置。
刻度由下列元素组成:
? 坐标轴,它是由图表项目决定的(可以是直线和圆弧)。
? 主标记,在坐标轴上按每个刻度的长度画出来的标记。
? 标记标签,在主标记旁边注明,它指定了相应标记表示的数值。
? 副标记,坐标轴上画出来的更小刻度的标记。
? 标题,可以在坐标轴上任何地方表示。
由于图表类型的不同,刻度还可以是:
? 矩形的(也就是说,坐标轴是和屏幕的坐标平行的)。
? 圆弧形的(一般应用在极坐标图表中)。
图标
图标构件是可选构件,它可以在图表中添加,也可以在其它容器里添加。图标是和图表相关联的,需要的时候会自动进行更新。
网格
? 网格有助于在图表中定位一个数据点,是数值的图形化指示。
装饰
图表可以有如下形式的装饰:
? 数据指示
? 在刻度上额外指示数值的注解
? 和给定数据点连接的标签
? 在标图区域的图像
绘画顺序
绘画顺序在图表的绘制过程中控制装饰的位置,同时也控制一个装饰是在图表图形的上方还是下方绘制;负的绘画顺序的装饰在图表图形的下方绘制,而零或正的绘画顺序的装饰在图表图形上方绘制。
交互方式
交互把图表对象和一个或多个行为联系在一起,有下列现成的交互方式:
? 缩放交互,能够对显示的数据进行放大或缩小。
? 两个滑动交互,在给定的数据轴上,用方向键进行滑动。
? 平移交互,用鼠标对显示的数据进行平移操作。
? 一个交互集,用来修正缩放数据转换的属性。
? 数据交互,使用户能够:
? 编辑一个数据点。
? 高亮或显示数据点的信息。
? 选中一个数据点。
预定义交互方式
下面列表是Charts中预定义的交互方式:
交互方式
描述
缩放
拖动滑动条实现缩放操作,滑动条放置在图表区域内。
X轴滚动
在X轴上实现滚动操作。
Y轴滚动
在Y轴上实现滚动操作。
平移
在显示的图形上用鼠标进行各个方向的平移操作。
活动按钮
按下特定按钮执行一个动作。
本地平移
拖拽鼠标实现各个方向上的缩放窗口的平移,在缩放窗口内点击鼠标开始这个操作。
本地调整
通过拖动缩放窗口的边界调整缩放窗口的形状。
本地缩放
拖动滑动块改变缩放窗口的缩放比率。
编辑数据点
在数据显示区域内拖动数据点对应的图形来改变数据点。
焦点事件
当鼠标移动到数据点对应的图形上的时候触发一个交互事件。
信息视图
当鼠标移动到数据点对应的图形上的时候显示数据点的信息。
选取数据点
当鼠标单击数据点对应的图形的时候触发一个事件。
(三)Charts的一般框架
Charts基于一个具有MVC模型的Swing变种,称之为可分离模型架构。在这种设计下,模型管理数据或构件代表的数值,而视图管理模型的图形化显示并处理图形上的交互。这种设计清晰地区分了处理数据集(也称为数据源)的图表数据模型和画出数据图形表示的图表显示。
数据模型
数据模型通过数据源处理数据集。数据集是数据点的集合,数据点是由(x,y)坐标对定义的,有两个值和一个可选的标签。
数据源的内容是动态的,它的类型由数据来源(XML,JDBC,文本文件或内存值)决定。
如果要用API创建新的图表,使用下列接口:
? IlvDataSet接口,具有数据容纳器的功能。
? IlvDataSource接口,具有数据源的功能。
图形展现
数据源的图形展现由如下准则定义:
? 图表的全局特征(比如,它使用的是笛卡儿坐标还是极坐标)。
? 数据空间到屏幕坐标的转换是由“投影器”对象处理的,它是IlvChartProjector类的一个实例。投影器对象的类型是由图表的类型定义,是图表的全局参数:
¡ 使用笛卡儿图表的时候是一个笛卡儿“投影器”对象。
¡ 使用雷达图,极坐标图或饼状图的时候是一个极坐标“投影器”对象。
在屏幕上显示数据的方式(折线,条形或气泡)是由图表显示器处理的,它是IlvChartRenderer类的子类的一个实例。
有两种类型的图表显示器:
? 组合显示器(IlvCompositeChartRenderer类的实例)。
? 单独显示器(IlvSingleChartRenderer类的实例)。
捆绑数据模型和图形展现
通过一个数据源和图形展现的一元关联捆绑图表和数据模型,使用IlvChartRenderer类的方法:
void serDateSource(IlvDataSource dataSource)
使用下面的方法获得图形展现当前的数据源:
IlvDataSource getDatasource()
样式
图表的外观可以由CSS进行动态控制。
CSS是功能强大的定义网页浏览器的HTML外观的机制。我们变换Java语言推崇的CSS2级,根据Java对象层次和状态设置Bean的属性。
在Charts中,CSS引擎用于在加载的时候创建和定制图表构件和数据的图形展现。在运行的时候,引擎根据模型的改变定制数据的图形展现。
建立图表的时候,可以为下列对象定义自己的样式:
? 图表构件
CSS规则用来定制图表的全局外观。
? 图表数据
CSS规则用于控制单个的数据点或一列数据。
(四)用Charts做开发
这部分说明用Charts建立图表构件的过程。
可以通过Charts设计工具的GUI创建图表,并利用SDK扩展图表的开发。大部分的工作应该在设计工具完成,然而,在某些地方你可能需要用API扩展图表的开发。
建立图表组件的基本步骤
建立图表的基本步骤如下:
? 组成图表
? 给图表应用样式
? 加入交互
? 用项目的方式保存
? 把图表整合到应用程序
组成图表
要组成图表,必须先从数据源加载数据。可以从下列四种类型的数据源加载数据:
? XML
? 文本文件
? 数据库(JDBC)
? 内存
XML
这种类型的数据源是从一个XML文件中加载数据,支持的文件格式要符合W3C XML语言标准。
文本文件
这种类型的数据源是要求每行文本是同类型的数值,用分隔符号分开数值。支持的分隔符号有逗号、分号、空格和Tab键,有自动检测分隔符号的功能。如果是从微软Excel文件中导出的数据,则通常是以逗号作为分隔符号的。在这种类型下,隐含着这样的数据模型:第一行是模型属性的名称,然后接下来的每行是对象属性的值,属性的顺序和第一行的名称对应。
数据库(JDBC)
这种类型的数据源通过JDBC从数据库服务器中加载数据。数据库包含由行和列组成的表,每行代表数据模型的一个对象,每列代表一个属性并能映射到图表中。Excel文件(.xls)被视为数据库,表单被视为数据库的表。
内存
支持的内存数据模型由符合Charts数据模型的Java类构成,能进行写操作,比如加一个新的数据点或者改变已经存在的数据点的值。
在图表上应用样式
为了展示业务数据对应的图表对象,以及最终用户和图形的交互,我们通过CSS来做定制。
通过调整对象的样式属性,你可以在以下方面改变数据的图形显示:
? 被选中数据的颜色和轮廓线。
? 数据点标志的外形。
? 刻度的分级。
? 网格线的外观。
? 图标的位置。
加入交互
Charts提供用户和图表的交互机制,通过图表交互,你可以在一个图表对象上连接一个或多个行为;它们定义最小的交互元素,这些元素可以组合形成复杂的交互功能。
用项目的方式保存
项目文件是数据源类型(文本文件,XML,JDBC或内存)和样式表单(.css文件)的关联,当你第一次保存图表的时候它会以.icpr为后缀名创建。
在设计工具里保存项目的时候,你保存了三个文件:项目文件,样式表文件和数据文件。项目文件指定了样式表文件的名称、类型和数据源的URL,以及数据文件的名称。
把图表整合到应用程序
你已经可以创建Charts了,现在是把它整合到应用程序里的时候了。可以由不同的方式部署应用:Swing GUI,applet或瘦客户端方式。本质上,为了把图表构件加入GUI中,你需要载入一个项目,这个项目建立数据源和样式表单组合,这两者是图表的基础。
JViews Diagrammer介绍
上一期简单介绍中讲到,JViews Diagrammer提供的流程图设计工具是一种无需编程就能快速配置流程图的开发工具,节点和链接图能够直接连接到后台的数据源,并且能够自动地随着数据的改变而更新。智能化的图形布局算法能够将流程图元素间的关系清楚地展现处理。
这部分我们就来深入分析JViews Diagrammer的概念、特征、功能和典型应用:
(一)基本介绍,介绍Diagrammer的产品特征和一些典型用途。
(二)基本概念,讨论Diagrammer和用它做开发所需要的基本概念。
(三)一般框架,介绍开发涉及到的各部分内容,包括Diagrammer内部构件和
外部条目。
(四)应用开发,介绍开发过程的基本步骤,对使用设计工具的每个步骤说明了更多细节,并且给出了用更底层的方式做开发的大致说明。设计工具是用来建立diagrammer构件的GUI应用程序。
(一)基本介绍
这部分将向您介绍Diagrammer的各个特征,说明了本产品的特征和它的典型使用。
什么是Diagrammer
diagram是一种图形展示,它由各种形状和形状之间的连线组成。Diagram主要是用来解释系统中各个相关联对象之间的关系。
很多用Java语言开发的系统的用户界面都需要显示系统中底层的业务对象。这些用户界面通常以diagram的形式显示系统的对象(节点以节点之间的连线),精确的术语应该是graph。
diagram可以是静态的,也可以是动态的,静态就是在显示过程中它的外观是不变化的,就像它名字暗示的一样,它是对给定系统的快照。静态diagram通常用来做文档,典型的应用是工作流图和组织图。
工作流图
下图是工作流图的典型例子,有判断、操作和结束:
组织图
下图是组织图的例子,代表一个组织内部的报告途径:
动态简图
动态简图能够相应用户操作或外部数据变化,它在显示阶段还保持着和业务数据的联系,随着业务数据的变化实时改变图形。动态简图的例子有:操作员改变一个物品的位置,对象随着状态的变化改变颜色,线段随着交易量的变化改变宽度,等等。
作为一个大的计算机系统的显示部分,图表通常和底层的业务数据通过特定的软件相关联。当业务对象变化的时候,图表元素也跟着变化,代表业务对象的图形对象的显示会改变以反应业务条件的变化。这种能力使图表成为活动的实体,反应着底层数据的变化,事实上,术语“数据相关”通常用来描述用这种方式连接到业务数据的显示界面。
Diagrammer被用来建立动态图或静态图的计算机显示。下列是一些动态图的例子:
? 过程流图
? 网络监控图
? 后勤装备图
? 业务活动监视图
注意尽管动态图也可以作为快照功能使用,它的真正价值是在动态显示上。
过程流图
过程流图是动态的,它可以显示底层业务的当前状态:
网络监控图
网络监控图是动态的,它显示底层网络的当前状态。比如,如果一个消息在两个节点之间的传递异常的话,简图能够改变链接的颜色来通知这个情况。
下图显示了连接和其它网络图表:
Diagrammer的主要特征
Diagrammer的主要特征如下:
? JViews简图设计工具。
? 易定制的图形。
? 以功能完备的SDK进行定制开发。
? 应有尽有的布局算法。
? 数据和显示的清晰分离。
? 内置流模型和流监控。
? 方便部署瘦客户端模式。
? 根据地理位置显示简图。
? 数据关联。
? 预定义的JavaBeans。
? 功能完全的打印API。
? 易整合性。
Diagrammer的典型应用
本质上,简图展示了抽象的底层系统,它们经常在供应链管理,通讯网络,业务流程,网络服务计划,产品流,UML简图,组织图,航线图,结构图,面板图,交通枢纽等等中可以看到。已经在电信、军事、气象、物流、交通(航空、船运、铁路等)等领域得到广泛的应用。
Diagrammer为下列情况提供解决方案:
? 图形编辑器
? 资产管理图
? 工作流
? 业务流程编辑
? 产品过程图
? 交通监控
(二)基本概念
这部分的目标是说明Diagrammer的基本概念,在做开发的时候将会用到下列术语,在实现你的需求的时候需要理解它们。
Diagrams
简图是你的系统的抽象。系统中主要的单元在图形上叫做节点,把节点连接起来的线段叫连线。在最基本的简图中,节点可以是简单的圆或多边形,通常旁边有文字帮助解释。连线通常是直线段,或者折线。
图形布局
很多情况下,简图太过复杂,手工无法处理,或者简图不需要人工操作自动根据应用程序的数据建立的,这样简图就需要自动布局算法来处理节点和链接。比如下图:
数据
Diagrammer使你不需要和底层Java图形API打交道,只需要关心业务数据和如何展示。Diagrammer基于模型-视图结构,它清晰的分离数据,显示和构件的相互作用。它遵从了Swing架构,即开发者只关心数据模型,让构件来处理如何显示数据和操作(比如选中和编辑)。
(三)Diagrammer的一般框架
这部分介绍了怎样建立简图,以及Diagrammer如何帮助你交付最高质量的简图。它介绍了Diagrammer的结构,和Diagrammer如何处理简图,预计涉及到的内部和外部构件。
Diagrammer的组成
下图显示了Diagrammer的本质组成部分,接下来的章节详细解释了各个部分以及各部分相互之间的交流整合。
简图组件是由父类IlvDiagrammer表示的,这个类提供很多其它服务,当你需要更好的控制的时候可以直接获取这些服务。
服务可以分为下列类型:
? 组成简图的服务。
? 管理视图的服务。
? 应用样式的服务。
? 在应用程序里控制简图的服务。
组成Diagram
组成简图涉及到如下主题:
? 数据源
数据源的作用是载入待显示的数据,当数据被改变的时候同时写入数据源。有三种类型的数据源:文本文件(只能用在设计工具中),XML文件和JDBC。如果上述三种都不能用,你可以通过实现Java的数据模型接口来连接数据模型。
? 样式表
样式表通过符合CSS2的样式规则,控制数据对应的图形的外观。它定义了数据模型的数据对象对应到图形对象的方式。
? 项目
项目是样式表和数据源的连接,它把简图的输入联合起来。项目被保存为XML文件,后缀名是.idpr(代表Diagrammer Project),项目文件通常由设计工具产生。
管理视图
Diagrammer管理视图由下列部分完成的:
? SDM引擎
SDM引擎是Diagrammer里最重要的部分之一,因为它控制着数据到图形的映射。
? 数据模型接口
SDM数据模型是告诉SDM引擎如何得到待显示的数据的接口,它是节点和节点间连线的抽象描述。
? 显示
显示部分是帮助管理业务数据图形展示的Java类, Diagrammer提供很多定义好了的这种类。
? 绘制图形
绘制部分是处理保存和管理Diagrammer产生的图形对象的Java类,它不仅管理节点和链接,还管理任何显示背景或装饰(比如图标)的图形对象。
? 交互
交互是处理对事件(比如鼠标点击)响应行为的Java类,Diagrammer提供各种各样的定义好了的这种交互。
应用样式
应用样式涉及到下列主题:
? 样式规则
? 组合图
? 图形层
? 背景和地图
(四)用Diagrammer做开发
开始开发一个项目的时候,你通常首先要建立一个原型,原型完成以后,通常是用典型的开发方式一个阶段一个阶段顺序开发。
这部分介绍了用Diagrammer做开发的典型方式,目标是描述准确的开发过程,主要是给出利用Diagrammer性能的一些指导。
建立Diagram构件的基本步骤
我们推荐用Diagrammer做开发分下列四个主要步骤:
? 组成应用程序数据的数据模型
? 使用设计工具建立简图
? 应用简图构件开发Java Swing应用程序,applet或servlet
? 定制应用程序
另一种方式是用JViews Framework从空白开始一步一步开发。
组成数据模型
数据模型是图形显示的源头,Diagrammer用可视化的样式表画出代表着数据模型的节点和连线。如果没有数据模型,你不能定义样式表,从而不能画出简图。
? 原型
Diagrammer提供内置的数据模型,你可以在设计工具中手工组成模型,或者用XML文件指明数据源;另一种内置的方式是通过JDBC从数据库中组成数据模型。如果通过JDBC,XML或文本文件的方式,你可以直接在设计工具中导入数据。
? 开发
开发应用程序的时候,你可以使用内存中的数据模型和Diagrammer提供的一个数据源。这意味着你的应用程序产生Diagrammer能够识别的XML文件,或者你可以用XSL-T来转换程序的XML格式。
如果应用程序中的数据保存在对象模型中,你可以实现Diagrammer的数据模型接口使对象模型映射到数据模型。这种方式需要写更多的代码,但是它不会出现数据的重复,而且在数据和显示间保证很好的同步。
使用设计工具建立Diagrammer
Diagrammer提供的默认的样式表显示传统的简图,有基本的形状和连接,它没有有特色的属性;如果你要的是有意义的显示,那么你要使用Diagrammer样式功能建立图标。
定义有特色的简图的最方便的方式是使用设计工具;你也可以不用设计工具手工编写样式表,然后用SDK建立简图参数。
? 设计工具如何帮助开发
? 填充数据模型
? 以Diagram的视图看数据模型
? 查看样式规则
? 建立样式规则
? 配置图层
? 定义背景
? 保存项目
开发应用程序
某些时候你需要开发下列类型的应用程序:Java Swing程序,applet或servlet。在这些应用中需要创建IlvDiagrammer对象,载入设计工具生产的项目,然后加入Swing或DHTML工具栏和菜单用来建立控制简图的按钮,比如缩放,平移,编辑等等。
定制应用程序
Diagrammer内置的样式表可能不能满足你的要求,这部分针对你需要自己定义交互或者自己实现连接到应用程序数据的数据模型接口。
在Diagrammer SDK中定义了全面的API,它们被用来建立和扩展你在建立简图的时候涉及到的类。基本上你可以访问建立简图涉及到的所有类:SDM引擎,数据源,显示,图形,视图,交互,组合图形和图形对象本身。
一些类数据JViews Framework,它们提供更底层的功能。在JViews Framework中,你拥有对图形系统各个类的深入控制,帮助你突破Diagrammer的简图构件的限制。
另一种方式: JViews框架
当你对Diagrammer简图构件不能满足你的要求的时候,你会使用JViews框架,你用它管理绘画过程,图形和数据之间的同步,刷新模式等等。
如果你选择这么做了,即放弃了隐藏图形复杂性的高层次构件,放弃了Diagrammer提供的样式机制,那么你就会用到Diagrammer提供的很好的选择:你会发现JViews Framework提供了所有你想要的,包括图形布局包。
在Framework方式下,你自己管理图形类,包括建立自己的图形对象和连线,你还可以用自己的布局算法来管理简图的布局。
在Diagrammer推出市场以前,这种方式被数以千计的开发者使用。但是,你必须编写很多代码,这样虽然可以更精确的管理简图,但是项目成本会高很多。