当前位置: 首页 > news >正文

围绕EMF探索(3)之初探OCL


前索引: 围绕EMF探索(1)之存储和查询
前索引: 围绕EMF探索(2)之再探查询组件

围绕EMF探索(3)之初探OCL

围绕EMF模型,有个很重要的基础性组件叫 EMF OCL,这是一个实现了OCL2.0标准的组件,提供了对OCL Expression的解析、校验。OCL全称是Object Constraint Language。
对OCL之前接触不是很多。两年前,在MDAChina还存在的时候,见到一些朋友谈论它。但对当时的技术和应用来说,OCL还是过于“理想化”。事实上,直到今天,OCL在国内的应用也是很稀少的。
如果不是因为探索EMF OCL这个组件的原因,我想我也很难去主动钻研OCL的那有些晦涩的Expression。虽然在UML2中,其已经成为一个用于准确描述模型的关键特性。
其实,使用EMF OCL非常简单,使用QueryFactory构造一个Query对象,设置表达式(Express),以及表达式所依赖的Context(在EMF OCL中,一般是Classifier)。然后对给定eObject对象进行检查和计算。——就这么简单。
Query query = QueryFactory.eINSTANCE.createQuery(
"Book.allInstances()->select(b : Book | b <> self and b.title = self.title)",
LibraryPackage.eINSTANCE.getBook());
query.setExtentMap(extents);
Collection result = query.evaluate(myBook);
当然,想很熟练的应用EMF OCL,那么就必须会构造正确的Expression。
所以,不得不花费点时间学习OCL。
OCL的概念和作用就不用在这里啰嗦了,以前的MDAChina那帮爱好者们写了很多有关这方面的文章(可惜mdachina已经不存在),比较典型的就是“MDA之路”那个兄弟写的几篇blog 文章,
http://www.blogjava.net/wxb_nudt/archive/2006/11/29/2188.html 和 http://www.blogjava.net/wxb_nudt/archive/2005/04/04/2858.html 。
对于更精细的了解OCL,可以读读OCL之父Addison Wesley的著作 《Object Constraint Language, The: Getting Your Models Ready for MDA》第二版,可以从下面的地址获取电子书:
http://www.netyi.net/training/4d9e427c-3d58-4f74-b540-ad642c9afccc
另外,建议大家再看看 《UML2.0参考手册》附录B部分的,这部分内容也是讲OCL的,而且讲了OCL的Basic Type和Syntax。
粗略的把这两本书中一些相关的章节翻了翻,还是很有收获的。当然限于时间问题,只是翻翻而已,留个大概映像,以后慢慢再研究查阅了。
针对OCL,这里简单提几个重点性内容:
OCL是一种语言,而且是一个Query-Only语言,利用OCL所塑造的Expression为模型中的类与类、类方法、类属性做了一层约束。既然是一种语言,那么就具有最基本的两个特性:类型和语法。
OCL 具有最基本的built-in类型,同时,会将Meta-Model中的所有自定义classifier都认为是类型。针对built-in类型,会有相应的很多逻辑操作相关联,比如“ and, or, xor, not”或者“ *, +, -, /”等等。这方面可以参考,里面有专门的一章节介绍OCL的类型和逻辑操作。
针对Classifier之类的类型,则存在三个纬度:作用于Classifier的约束;作用于操作(方法)的约束;作用于属性的约束。这三个层面的约束,有不同的语法表达。
Contraints on Classifiers
context Student
inv: self.GPA > 2.0
Contraints on Operators
context Course::registerStudent(s : Student) : boolean
pre: s.tuitionPaid = true
Contraints on Attributes
context School::tuition : float
init: 2500.00
另外,提醒一下。从Eclipse CVS中抓下的ocl plugin project,需要依赖eclipse orbit包中的lpgjavaruntime组件,可以去 http://download.eclipse.org/tools/orbit/downloads/下载,其实就是net.sourceforge.lpg.lpgjavaruntime 包。
先讲讲OCL的小知识吧,今天只顾钻研OCL的基础知识和语法了,还没有来得及研究EMF OCL的源码和结构。简单的扫了几眼,着实比EMF Query复杂很多,看来要花费更多的时间在上面了。

相关文章:

  • 北师计算机硕士有宿舍吗,学校不提供宿舍北大北师大研究生吐槽
  • 放弃完美的需求管理
  • 2012服务器远程连接设置,Win Server2012怎么添加用户并设置远程登录
  • win7怎么看服务器芯片,Win7如何查看CPU使用率?Win7CPU使用率的查看方法
  • Image Tessellation
  • 2020黑龙江大学计算机调剂,2020年黑龙江大学硕士招生拟接收调剂专业信息公告...
  • 今天挺冷
  • 乐播投屏服务器响应失败是怎么回事,乐播投屏搜索设备失败的处理操作
  • wp全站ajax插件,WordPress的全站Ajax加载(四)完整代码篇(完结)
  • Linux操作系统的目录结构
  • 怪物猎人ol服务器维护,怪物猎人OL什么时候关服_2019年停运时间公布
  • C# 字符串操作
  • FMF与UF的对比分析
  • Linux多线程编程
  • Linux内存映射(mmap)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Brief introduction of how to 'Call, Apply and Bind'
  • ECMAScript入门(七)--Module语法
  • Javascripit类型转换比较那点事儿,双等号(==)
  • js算法-归并排序(merge_sort)
  • tweak 支持第三方库
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 阿里云Kubernetes容器服务上体验Knative
  • 程序员该如何有效的找工作?
  • 关于Flux,Vuex,Redux的思考
  • 聚类分析——Kmeans
  • 排序算法学习笔记
  • 设计模式 开闭原则
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 回归生活:清理微信公众号
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​VRRP 虚拟路由冗余协议(华为)
  • ${ }的特别功能
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (js)循环条件满足时终止循环
  • (MATLAB)第五章-矩阵运算
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (待修改)PyG安装步骤
  • (多级缓存)缓存同步
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (三)终结任务
  • (一)WLAN定义和基本架构转
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @SentinelResource详解
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [Android]通过PhoneLookup读取所有电话号码