偶然看到Wiki百科的
Lua 词条, 注意到它的这个特性:
引用
不过比较遗憾的是, 通过这里链接过去的
http://en.wikipedia.org/wiki/Principle_of_least_privilege 词条中的描述, 似乎这个
最小权限原则 没怎么被用于软件设计开发方法学, 虽然很早就提出来了, 但主要描述的是在系统设计领域的应用.
我最近正好在做 HBI 的 编程语言/平台 互操作性架构, 目前在做 Java 和 ActionScript 3.0 的互操作框架. 而发现 AS3 很多有意思的地方. 其中可以在程序开发中用来实现
最小权限原则 的就是 AS3 语言中的 namespace 机制. 刚看到这个机制的时候我是眼前一亮的感觉, 因为很早以前就觉得 Java 在语法元素方面缺乏这个层次的
information hiding 能力, 但是一直没机会研究这些其他的语言, 也就没有了解到已经存在的实现, 只是脑子里模模糊糊的有个感觉, 如果xxx那样增强一下会更好. 而在最近出来的 ActionScript 3.0 里, 已经有了明确成熟的实现了.
这里很简单的描述一下OO时如果没有足够好
information hiding 的话所带来的后果, 一个非常简单且常见的例子就是在Hibernate中, 你必须在你的持久Java类中定义一个 identity 字段用作 primary key, 并且要暴露一个 public 的 setter 方法, 好让 Hibernate 去给它赋值; 类似的, 对于关联对象你也要自己定义这么一个集合field, 然后暴露 public setter 方法, 只是为了给 Hibernate 方便. 显然所有的人都能看到这些个 public 的方法, 也可以完全没有编译错误的去调用它们, 而只有脑袋里绷住了一根弦儿, 说这个是给 H 用的, 不是给我用的, 才不至于犯傻或者手误去敲错代码, 盛行的带自动提示的Java IDE让这种错误的机率又提高了不少.
这个看起来不像是很严重的问题, 但是在大规模的软件开发维护中毕竟小的出错率也能贡献大量的错误, 况且要占用每个程序员大脑中的一根神经, 不能更好的集中到业务逻辑上去. 就像现在很多流行编程语言, 通过扔掉指针, 实现垃圾回收器从而把程序员从释放内存的负担中解放出来一样, 早晚也得把人类程序员从考虑各种 API 的调用顺序, 适用性 以及 Side Effect的负担中解放出来, 有更多精力专注于业务逻辑的正确实现.
而这里考虑的
最小权限原则, 是其中一个方面. 那么怎么实现呢?
说明在 ActionScript 3.0 中如何通过 namespace 实现最小权限原则之前, 简单介绍一下AS3的背景:
在 3.0 以前, ActionScript 2.0 和 1.0 一直是 Flash Player 的专有编程语言. 最开始并没有版本, 而 AS2 出来的时候加入了大量的实质性面向对象元素, 所以为了加以区别, 就把以前版本的AS称为 1.0. 其实到目前的 AS 3.0 为止它作为Flash的专有语言的情况也没有改变, 只不过其新主 Adobe 和 Mozilla 联手, 准备以开源的形式发展 AS3. 名义上是两家共同开发 ECMAScript 第4版 的规范以及虚拟机实现, 然后Adobe把它用在Flash里, Mozilla把它用在FireFox的SpiderMonkey里, 所以AS3的规范称自己是 "基于" ECMA 规范. 而实际上 ECMAScript 第4版 现在还只是draft, AS3 却已经投入市场了, 并且 Mozilla 上关于 es4 的wiki内容也全是从Adobe资料导入的. 可见整个局势主要还是由Adobe推动的.
另外也必须说一下 AS3 的革命性. 如果你看一段官方推荐风格的 AS3 代码, 就会发现它已经 非常 非常 像 Java. 最早的 ActionScript (1.0) 只是一些最简单的脚本, 那时主要也是给不是程序员的艺术创作人员用的. 到了 AS 2.0, 面向对象被引入了, 但它实质上是动态脚本语言, 虽然已经有了类的概念和
class关键字, 但对象支持还是基于类似JavaScript的prototype机制, 动态继承. 而到了 AS 3.0, 按照官方的说法, 它同时支持静态类型, 基于类的继承方式, 以及动态类型, 基于prototype的继承方式; 虽然后者是AS 3以前唯一支持的方式, 但是在 AS3 中, 并不推荐使用这种方式, 而是建议全部采用前者的静态类型方式. 涉及到这么做的动机时, 官方资料有提到说这是因为用Flash开发的应用规模越来越大. 而即使是在受支持的动态类型机制下, AS3 也并不是完全兼容 AS2, 在事件模型和语法含义上都有打破兼容性的地方. 这在商业意义上的损失无疑是巨大的, 即使 AS3 应用的执行效率要远远高于以前版本, 兼容性方面的损失恐怕也难以弥补. 另外虽然号称是基于 ECMAScript 4, 但是 AS3 默认支持的是
strict dialect 而非 standard es4.
strict dialect 实质上主要就是
静态类型+严格语法检查. 由此可以看出 AS3 已经不是原本的动态类型脚本语言, 而是一种
动静结合, 静态为主, 动态为辅 的程序设计语言. 并且其静态语言特性是Adobe鼎力支持的重点.
基本了解了 AS3 的历史和现状之后, 我们可以确信, 它目前很多特性并非只能在动态语言中实现, 而是有可能在静态语言中重现的. 至少 namespace 是如此. 那么回到
最小权限原则 的话题, 看看它可以怎么实现.
在 AS3 中也有 public, private, protected, internal (==default) 这些权限修饰符, 并且各自含义与Java中的同名修饰符完全相同. 但是, 或许有点难以理解, 在 AS3 中它们都是内置的 namespace 而非仅仅是关键字, 编译器通过维护这些内置 namespace 的 可见/适用范围 来实现其语义. 最重要的, namespace 是 AS3 中的一等公民, 也就是说应用程序可以像定义class一样的定义自己的 namespace. 自定义的 namespace 可以放在 public, private, protected, internal 相同的位置用来限定相应语法元素的可访问性, 包括 类, 类成员方法 和 类成员变量.
有了这件利器, 要解决前面提到的Hibernate持久类setter方法过度暴露的问题, 就显得非常容易了. 假如我们在 AS3 中实现一个 ORM 的话(虽然目前来说意义还不大, AS 因为没有线程机制, 在很多场合还不适用), 就可以定义一个 orm 专用的 namespace:
package orm
{
public namespace ormstub;
public class ObjectStore
{
...
public function save(o:Object):void
{
var pk:Object = o.getID();
if(!pk)
{
pk = assignID();
o.ormstub::setID(pk);
}
...
}
...
}
}
然后应用的持久类就可以利用这个 namespace 把只暴露给orm的setter方法向系统其他部分隐藏起来:
package app
{
import orm.ormstub;
public class User
{
private var id:Object;
public function getID():Object
{
return this.id;
}
ormstub function setID(id:Object):void
{
this.id = id;
}
...
}
}
或者更具 AS3 风格的程序可以写成:
package orm
{
public namespace ormstub;
use namespace ormstub;
public class ObjectStore
{
...
public function save(o:Object):void
{
var pk:Object = o.id;
if(!pk)
{
pk = assignID();
o.id = pk;
}
...
}
...
}
}
package app
{
import orm.ormstub;
public class User
{
private var _id:Object;
public function get id():Object
{
return this._id;
}
ormstub function set id(pk:Object):void
{
this._id = pk;
}
...
}
}
分享到:
相关推荐
软件估算方法学是软件工程学科中重要的研究方向,也是...出了一种多粒度的面向对象软件估算模型,并对模型的4 个层次作了详细的描述,然后利用最小二乘法回归分析探讨 了规模与工作量的关系,最后对实验结果做出了评估。
仿照Windows系统的计算器软件,为通用计算器设计界面,开发一款实用的计算器软件。 计算器软件基本功能: 计算器包括双目运算和单目运算功能。双目运算符包含基本的四则运算及次幂(^)功能,单目运算符包含阶乘,...
1. 面向对象分析与设计是面向对象软件开发过程中的两个重要阶段,下列活动中,_____ 不属于面向对象分析阶段。 A.构建分析模型 B.识别分析类 C.用例动态建模 D.评估分析模型 2. 在面向对象方法中,_____可看成...
1.单一职责原则: 不要存在多于一个导致类变更的原因 ...接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
FDA的医疗器械监管科学:最小负担原则及应用.pdf
本书内容精炼,示例简单明了,适合各层次面向对象开发人员阅读,也是高校相关专业面向对象课程的理想教学参考书。 第1章 面向对象概念介绍 1 1.1 过程式程序设计与OO程序设计 2 1.2 从过程式开发转向面向对象...
本文分析了目前应用一般的最小二乘法建立均匀试验数据的二次多项式回归模型时存在的局限性,提出了应用偏最小二乘法(Partial least-square,PLS)建立二次多项式回归模型的技术,并已在作者开发的统计分析软件(DPS...
DSP最小应用系统的设计 DSP最小应用系统的设计
1.2 从过程式开发转向面向对象开发 1.3 对象到底是什么 1.4 类到底是什么 1.5 使用UML完成类图建模 1.6 封装和数据隐藏 1.7 继承 1.8 多态 1.9 组合 1.10 小结 1.11 本章使用的示例代码 第2章 如何以对象...
基础开发部分介绍了嵌入式系统概述、STM32最小系统设计、STM32程序设计入门、GPIO应用、GCC编译器的安装与应用、STM32外部中断、面向对象设计的本质、USART通信等内容;深入开发部分介绍了深入STM32的工作原理、...
pundit, 通过面向对象设计和纯 ruby 类进行最小授权 Pundit Pundit提供了一组帮助器,它指导你利用正则 ruby 类和面向对象设计模式构建一个简单。健壮和可以扩展的。链接:API文档源代码 。行为准则。赞助: 安装gem...
基础开发部分介绍了嵌入式系统概述、STM32最小系统设计、STM32程序设计入门、GPIO应用、GCC编译器的安装与应用、STM32外部中断、面向对象设计的本质、USART通信等内容;深入开发部分介绍了深入STM32的工作原理、...
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。
主要为大家解析了Linux用户与最小权限原则,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
基础开发部分介绍了嵌入式系统概述、STM32最小系统设计、STM32程序设计入门、GPIO应用、GCC编译器的安装与应用、STM32外部中断、面向对象设计的本质、USART通信等内容;深入开发部分介绍了深入STM32的工作原理、...
极限编程(XP)推崇测试优先原则,由此引发了软件开发方法从传统的瀑布模型转向以测试为驱动的敏捷开发模式的革命。在这场软件开发方法革命中,以xUnit系列的单元测试框架是一切的中心。xUnit的成员有很多,如JUnit,...
该方案首先分析了大量恶意软件和正常软件样本的权限信息,再对权限频率特征去冗余,最后利用最小距离分类器进行软件分类。实验结果表明该方案的可行性,通过与同级别方案对比,在方案复杂度和检测效果上表现出优越性...
该PPT文档介绍了最小二乘法的三种形式及其应用于系统辨识和滤波
谈将最小特权原则应用到WindowsXP上的用户帐户.doc