想象一下这样的事情:

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。

其他提示

这听起来有点像 对象能力模型. 。也许有一些语言以某种方式实现了这一点。

同样,快速谷歌搜索“方法级安全性”让我发现了企业 Java 社区似乎已经炮制的一些东西。我认为将这种方法专门用于方法调用是毫无意义的。除非你有充分的理由这样做,否则我认为这可能是一个坏主意。如果您出于某种原因确实有兴趣这样做,那么实际上模型应该是让接收者检查调用源是否在某个允许的集合中。

无论如何,这基本上严重破坏了大多数编程模型。您最好强制执行前提条件和类不变量,以确保任何方法调用(从任何地方!)都是有意义的或行为良好的。如果您使用它来强制方法排序,则可以使用不变检查(静态或运行时)或理论模型(例如 界面自动机.

此它做-能够在红宝石,尽管有不同的语法。采取以下:

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对应于类includes该模块。 caller返回当前调用堆栈,和caller.first让你上调用堆栈中的第一条目(即,所谓的这一个功能)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top