设为首页 收藏本站
查看: 738|回复: 0

bearcat 0.4.0 发布,统一抽象的 model

[复制链接]
累计签到:77 天
连续签到:1 天
发表于 2015-3-4 20:51:04 | 显示全部楼层 |阅读模式
3月21日 深圳 OSC 源创会开始报名罗,送华为海思开发板
DSC0000.gif   bearcat 0.4.0 发布,本次升级主要是对model进行了抽象,model 代表着系统中的一些数据,也就是一些javaScript对象,对这些数据还可以有操作,比如校验、数据处理、序列化、持久化等 。所有的这些操作,在 bearcat model,统一的抽象成 constraintfilter。(在即将更新的 bearcat-dao 0.2 版本里面还可以看到 model 在数据库 O/R mapping 里面的抽象)
  一个简单的 model 可以是这样的:
var SimpleModel = function() {
    this.$mid = "simpleModel";
    this.num1 = 0;
}
module.exports = SimpleModel;  就是一个简单javaScript对象,然后通过一个 $mid 属性来指明该model的唯一id,通过这个id,我们可以通过 bearcat.getModel 方法来获取这个 model 实例
var simpleModel = bearcat.getModel('simpleModel');  获取实例之后我们可以对这个model进行简单的 set/get 操作
simpleModel.$set('num1', 10);
var num1 = simpleModel.$get('num1'); // num1 === 10  也可以对model进行pack操作
simpleModel.$pack({
    'num1': 5
});
num1 = simpleModel.$get('num1'); // num1 === 5  对model属性,还可以通过定义来添加约束、配置,比如添加type的约束
this.num2 = "$type:Number";  这个之后,num2 属性则必须是 Number 类型,添加其它类型则会返回一个 Error 对象
var r = simpleModel.$set('num2', 'aaa');
if (r) {
    console.log(r.stack);
}  你也可以对属性添加 default 值
this.num3 = "$type:Number;default:20";var num3 = simpleModel.$get('num3'); // num3 === 20model filter
  对于model的数据处理、校验其实都可以抽象为对model的 before filter 与 after filter
  比如你可以添加一个 checkNum 的 before filter,来对 num 属性进行校验
var FilterModel = function() {
    this.$mid = "filterModel";
    this.num = 0;
}
FilterModel.prototype.checkNum = function(key, value) {
    if (typeof value !== 'number') {
        return new Error('num must be number');
    }
    if (value > 10) {
        return new Error('num must be small than 10');
    }
}
module.exports = FilterModel;var filterModel = bearcat.getModel('filterModel');
var r = filterModel.$before('checkNum').$set('num', 5); // ok
r = filterModel.$before('checkNum').$set('num', 'aaa'); // error with the checkNum validation, r is the Error object
if(r) {
    console.log(r.stack);
}
r = filterModel.$before('checkNum').$set('num', 20);
if (r) {
    console.log(r.stack);
}  这里通过 $before api 来指定了 before filter
  num 属性就限定必须是Number类型,且值要  10) {
        return new Error('num must be small than 10');
    }
}
FilterModel.prototype.transformNum = function() {
    this.num = 12345;
}
module.exports = FilterModel;var filterModel = bearcat.getModel('modelId');
filterModel.$after('transformNum').$set('num', 3); // set num to 10, with the after filter transformNum
var num = filterModel.$get('num'); // the num is now 12345  num 值经过after filter的 transformNum 方法之后就变成了 12345
model constraint
  约束描述了对model里的属性的规范、要求。然而,由于javaScript本身的动态性,属性在定义的时候是没有类型的,也就更不必提定义属性的约束了。开发者要实现约束,就必须实现一个validate方法,然后在需要约束的地方调用该方法来限定属性的约束。这个validate方法的粒度、复用性就成为了问题,而且属性的约束只有被validate方法调用到了才知道是怎样约束的,也不便于后期的维护。
  描述总是优于硬编码,这是 bearcat constraint 设计的一个原则。
  通过对属性进行一定的描述来进行规范,这里的描述就是约束,而约束是可以相互组合、叠加的、也可以带有参数来更好的复用
  同样的,定义一个约束,就像定义一个对象
  notNullConstraint.js
var Util = require('util');
var NotNullConstraint = function() {
    this.$cid = "myNotNull";
    this.message = "%s must be not null for value %s";
}
NotNullConstraint.prototype.validate = function(key, value) {
    var message = this.message;
    if (value === null || typeof value === 'undefined') {
        return new Error(Util.format(message, key, value));
    }
}
module.exports = NotNullConstraint;  我们这里定义了一个 notNull 的约束,通过 $cid 属性定义了id 为 myNotNull,在该对象里,我们实现了 validate 接口,该接口以model属性的key、value做为参数
  要在model里面使用这个约束也非常简单,只需要在需要添加约束的属性value里面,加入这个约束的id即可
var ConstaintModel = function() {
    this.$mid = "constaintModel";
    this.num1 = "$myNotNull";   
}
module.exports = ConstaintModel;  这个model,我们有一个num1属性,该属性的约束是 myNotNull
var constaintModel = bearcat.getModel('constaintModel');
var r = constaintModel.$set("num1"); // the Error object
if(r) {
    console.log(r.stack);
}  然后我们拿到model,往 num1 属性 set 一个值,就触发了 myNotNull 这个约束
  这样,约束可以自由的添加到需要的model属性里面,约束的触发完全由 bearcat 来管理
constraint 组合
  约束是可以通过组合成为high level约束的,也即高阶约束
  通过约束的组合可以带来如下好处:

  •   避免对简单约束的重复定义、组合、使用
  •   把简单约束抽象成基础约束来进行复用
  比如,我们可以定义下面的这个组合约束
  sizeConstraint.js
var SizeConstraint = function() {
    this.$cid = "mySize";
    this.$constraint = "$myNotNull";
    this.message = "key %s value %s length over max %d";
    this.max = null;
}
SizeConstraint.prototype.validate = function(key, value) {
    var message = this.message;
    var maxLen = this.max;
    if (maxLen === null) {
        return;
    }
    if (value && value.length > maxLen) {
        return new Error(Util.format(message, key, value, maxLen));
    }
}
module.exports = SizeConstraint;  通过 this.$constraint = "$myNotNull"; 属性,我们添加了 myNotNull 这个基础约束进来,当该约束触发的时候,首先会触发基础约束也即 myNotNull,然后触发自己的 validate 接口所定义的约束
  当然,这个例子的基础约束就一个,也可以添加其它基础约束,只需要依次添加约束id,并且以 ; 分隔即可
this.$constraint = "$myNotNull;myType"  要使用这个约束,简单的把 mySize 添加到需要约束的model属性即可
  constraintModel.js
var ConstaintModel = function() {
    this.$mid = "constaintModel";
    this.num = "$mySize";
}
module.exports = ConstaintModel;r = constaintModel.$set("num2"); // the Error object
if (r) {
    console.log(r.stack);
}constraint 参数
  约束可以带有参数,这样就可以把约束进行函数似的抽象,更好的复用
  比如,上面的 mySize 约束例子中,mySize 约束其实是带了一个参数 max
var ConstaintModel = function() {
    this.$mid = "constaintModel";
    this.num1 = "$myNotNull";
    this.num2 = "$mySize";
    this.value = "$mySize(max=5)";
}
module.exports = ConstaintModel;  因此,我们可以在model属性列中,除了添加 mySize 约束外,还可以指定 约束参数 max 的值,比如 max = 5,限定 value 属性的长度不能大于5
constaintModel.$set("value", "aaa"); // ok
var value = constaintModel.$get("value");
console.log(value);
r = constaintModel.$set("value", "aaaaaa"); // the Error object
if (r) {
    console.log(r.stack);
}  更多关于 bearcat model 请参见官方文档 bearcat model

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-43144-1-1.html 上篇帖子: Hibernate Validator 5.2.0.Beta1 发布 下篇帖子: LibreOffice 4.4.1 最新版已经可以下载了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表