具有粒度方法和属性访问的编程语言
题
想象一下这样的事情:
import class B.*;
interface A supports A.testSum
{
int sum( int a , int b ) access from B.calculator;
testSum() { Assert(sum(1,1)==2); }
........
class B ...
{
void calculator() { A.sum(3,5); //ok }
void someOtherMethod() { A.sum(0,3); //compile error }
“支持”的想法是次要的但相关的,因为在这种情况下测试适用于接口(因此该语言将区分所有实现都必须通过的接口测试和特定于实现私有的实现测试
但我想在这里传达的重要思想是访问控制语义;请注意,带有“access from”关键字的 A.sum 只能从方法 B.calculator 中调用。其他任何内容都会被检测为编译时错误。这里的想法是以更细粒度的方式强制实施架构约束。如果您没有添加“访问自”或仅添加“访问自*”,则意味着允许从任何地方调用该方法的默认行为。什么样的架构限制?嗯,在进行分层设计时手动强制执行的那种:A 层(最低级别)从 B 层(中级)开始使用,B 层又从 C 层(高级)开始使用。但是 B 层无法从 A 层访问,并且 C 层无法从 A 或 B 访问,但否则它是公共的(这可能是最终用户可以直接访问的内容)
问题:你知道有什么语言(包括源到源的中间语言)支持上述语义吗?讨论这种语义是否会适得其反、危险或只是鼓励糟糕的设计的额外要点
更新: 这种限制还有另一个非常重要的用例:
事件驱动编程:通常事件的问题是事件往往会做太多事情,并且理解事件的依赖链可能会变得棘手
例如,可以定义事件处理程序仅具有可以与之交互的特定一组可见类(或者相反,它无法触及的特定对象集)
解决方案
Java支持的东西几乎同样的事情。
首先,字段和方法的可视性是在运行时执行,它是不可能的非特权代码来旁路此。
您也可以使自己的特权,并授予代码的某些部分。例如,打开一个文件,即要访问一个文件需要FilePermission
该文件的代码。你可以让你想虽然任何类型的许可,它可能使一个许可称为SumPermission
其总结前Calculator
检查,并只授予它到任何你想要的课程。保护域跨越横跨类,在不类个体的方法,因为一整类通常从单个源获得的。其实该模型的不断深入,你提出了什么。领导到一个安全检查必须具有的权限,因此,如果一些不信任的代码调用你的代码有SumPermission
堆栈(包括线程创建的历史)上的每一个类,它会失败的安全检查。当然,这仅仅是默认的,只要你做任何事情,需要的权限,你可以使用一个doPrivileged
块,说即将到来的检查,只检查您的权限,而不是双方你和你的来电。
然而,在Java当前默认的安全方案有很大的局限性。对于一个不受信任的代码不能细分它的权限或定义嵌套不可信代码自身的权限。此外,这是一个疼痛以防止不可信代码块。
您可能想看看ê。特别是,它遵循对象的能力模型。它用于相互不可信代码由安全地交互,并且具有语言级别的结构,以防止死锁的问题。
这是完全可能和可行的在Java中实现相互信任的代码之间健壮的行为,但ē将可能使你的工作更容易,并在JVM上运行,所以你应该仍然能够使用Java库和库从任何其他语言使用该JVM。
其他提示
此它做-能够在红宝石,尽管有不同的语法。采取以下:
module T
def check
raise unless self.is_a?(Ca)
raise unless %r{in `good_func'} =~ caller.first #`
true
end
end
class Ca
include T
def good_func
check
end
def bad_func
check
end
end
class Cb
include T
def good_func
check
end
def bad_func
check
end
end
a = Ca.new
b = Cb.new
a.good_func
=> true
a.bad_func
=> (RuntimeError)
b.good_func
=> (RuntimeError)
b.bad_func
=> (RuntimeError)
当使用模块作为一个mix-in,self
对应于类include
s该模块。 caller
返回当前调用堆栈,和caller.first
让你上调用堆栈中的第一条目(即,所谓的这一个功能)。