【问题标题】:How to name this key-oriented access-protection pattern?如何命名这种面向密钥的访问保护模式?
【发布时间】:2011-03-20 10:47:53
【问题描述】:

显然是this key-oriented access-protection pattern:

class SomeKey { 
    friend class Foo;
    SomeKey() {} 
    // possibly non-copyable too
};

class Bar {
public:
    void protectedMethod(SomeKey); // only friends of SomeKey have access
};

... 还没有一个已知的名称,因此我想为它找到一个好的名称,这样我们就可以在不说脏话的情况下参考它。有什么建议吗?

应该是:

  • 简洁
  • 传达访问保护的意图
  • 理想情况下意味着不需要代理 (?)

【问题讨论】:

  • 好问题。我觉得好像它可以在某种程度上重新构建以允许最大程度地重用。考虑一下...
  • @GMan:现在我很好奇,我不知道如何提高可重用性。
  • 伙计,它就在我的舌尖上!布拉格。
  • 啊,明白了。打字吧。简单的概括,几乎有点尴尬花了我这么长时间。 :) (其实没什么大不了的……)
  • 打开 side question 以提高可重用性以排除旁白。

标签: c++ design-patterns idioms friend access-protection


【解决方案1】:

我喜欢,偏好递减:

  • 密友成语
  • 密码门朋友成语
  • 过门朋友成语
  • 钥匙门朋友成语
  • 部分朋友成语
  • 受限朋友习语

我从 key-lock/key-keyhole 命名方案转移到 pass 命名方案,它在我身上不断发展。

【讨论】:

  • 嗯,我曾希望有更多的投票,而不必在 2 个答案之间做出选择……嗯,显然这对那么多人来说并不重要。我现在亲自使用 passkey
【解决方案2】:

SomeKey 看起来有点像进入 Bar::protectedMethod 的 Backstage 通行证。所以那个领域的任何东西都应该是好的:护照成语,口号成语,密码成语,VIP成语..err优雅访问?

【讨论】:

  • 你有一个最喜欢的吗?我最喜欢 pass-key,因为它简短且(至少对我而言)具有描述性。
【解决方案3】:

我建议将其命名为 Badge Idiom,表示根据请求提供的令牌,以证明拥有权限。我相信这比这里的许多其他答案中围绕Key这个词的比喻更好。

'Key' 在编程术语中已经相当多,至少混淆了查找和受限访问的概念。此外,真正的钥匙通常操作单独的锁,而不是制造商提供的所有锁的集合,并且此模式中的接受类不是锁的集合,而是被要求执行操作的自我保护实体的集合。

“徽章”传达了令牌授予整个类其他实体的权限的原则,而不仅仅是单个对象。该术语可能过于依赖(以美国为中心?)警察或安全图像,我确实考虑过 SubpoenaWarrant 之类的术语,但它们似乎过于关注第三方授予访问权限。无论如何,具有给定徽章类型的个人可以强制遵守这些徽章的个人类别的编码行为。我看到的整体交互是这样的:

  • A:这个聚会太吵了。关掉你的立体声音响。 (出示徽章)
  • B:哦,好的,警官。 (呻吟)

【讨论】:

  • 嗯,我明白你的意思,但(就我个人而言)这种关联并没有像钥匙/锁等那样在我的脸上跳动:)而且钥匙并不总是在单个锁上操作: 我这所房子的钥匙打开了我的公寓、大门、地窖门……
【解决方案4】:

还有其他方法可以做到这一点,以更一般的方式,使用继承。在这里,蛋糕类既是钥匙孔又是钥匙。在这里,任何从 cake 继承(也可以是静态继承)的类都可以访问在 cake 中定义为可访问的 SomeClass 的子集,当然,您可以在多个不同的类中拥有多个不同的子集。

class cake;
class SomeClass {
    friend class cake;
    void foo();
};
class cake {
    void DoFoo(SomeClass& class) { class.foo(); }
};
class lols : cake {
    // Now we can DoFoo().
};

我将它命名为锁和钥匙。

【讨论】:

  • 虽然GMan另外加了一个扩展,但问题还是关于通用方式的命名问题。
  • 打开side question 这样我们就可以进行这两个单独的讨论了。
猜你喜欢
  • 2011-03-14
  • 2011-03-20
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 2019-02-05
  • 2017-10-30
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多