Является ли этот ориентированный на ключ шаблон защиты доступа известной идиомой?
Matthieu M. этом ответе Matthieu M.. привел образец защиты доступа в этом ответе, который я видел раньше, но никогда не рассматривал образец сознательно:
class SomeKey {
friend class Foo;
SomeKey() {}
// possibly make it non-copyable too
};
class Bar {
public:
void protectedMethod(SomeKey);
};
Здесь только friend
ключевой класс имеет доступ к protectedMethod()
:
class Foo {
void do_stuff(Bar& b) {
b.protectedMethod(SomeKey()); // fine, Foo is friend of SomeKey
}
};
class Baz {
void do_stuff(Bar& b) {
b.protectedMethod(SomeKey()); // error, SomeKey::SomeKey() is private
}
};
Это позволяет более тонко-гранулированный контроль доступа, чем создание Foo
friend
из Bar
и избегает более сложных шаблонов проксирования.
Кто-нибудь знает, есть ли у этого подхода имя, т. Е. Является известным шаблоном?
4 ответа
Благодаря вашему другому вопросу, похоже, что этот шаблон теперь называется шаблоном "passkey".
В C++11 все становится еще чище, потому что вместо вызова
b.protectedMethod(SomeKey());
Вы можете просто позвонить:
b.protectedMethod({});
Такой скучный человек, как я, сделал бы код:
int FraudKey=0;
b.protectedMethod(reinterpret_cast<SomeKey&>(FraudKey));
Это довольно близко к этому:
http://minorfs.wordpress.com/2013/01/18/raiicap-pattern-injected-singleton-alternative-for-c/
По сути, если вы считаете, что ссылка на объект хорошо спроектированного класса обеспечивает управление доступом, вам нужно реализовать любую политику управления доступом, которая действительно имеет смысл, применение этого шаблона к чему-либо другому, кроме конструктора, похоже, не имеет особого смысла.
Таким образом, как говорится в статье, если вы используете этот ключ вместе с этими конструкторами, для чего может иметь смысл управление доступом, объекты, которые представляют значительную часть ресурсов паники, которые в C++ обычно реализуются как объекты RAII, чем имя RAIICap или RAII-Возможность действительно имеет смысл.
http://www.eros-os.org/essays/capintro.html
В качестве альтернативы вы можете обратиться к нему с более общим именем, например, авторитет конструкции.
Реализация, описанная в этой статье, имеет много общего с основным, то есть с основными потребностями необходимо создать все ключи авторизации. Вы можете расширить его и сделать его более гибким, добавив дополнительный открытый конструктор для самого ключа:
template <typename T>
class construct_authority {
public:
construct_authority(construct_authority<void> const&)
friend int main(int,char **);
private:
construct_authority(){}
};
Таким образом, main может делегировать создание ключа другим частям программы.
Лично я считаю, что имя RAIICap вполне подходит для полезной части этого паттерна.
Некоторое время назад я предложил добавить этот простой шаблон выше в стандартную библиотеку.
https://groups.google.com/a/isocpp.org/forum/
К сожалению, есть проблемы с идеей, что может быть один основной отпечаток, который составляет вычислительный корень, поэтому что-то вроде этого, очевидно, не может быть в стандартной библиотеке. Сказав это, по крайней мере, для использования с конструктором классов RAII, этот шаблон кажется весьма полезным.