Подтвердить что ты не робот

Является ли этот ключ-ориентированный шаблон защиты доступа известной идиомой?

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 a friend Bar и избегать более сложных шаблонов проксирования.

Кто-нибудь знает, имеет ли этот подход уже имя, т.е. известный шаблон?

4b9b3361

Ответ 1

Благодаря вашему другому вопросу, похоже, что этот шаблон теперь известен как шаблон "passkey".

В С++ 11 он становится еще более чистым, потому что вместо вызова

b.protectedMethod(SomeKey());

вы можете просто позвонить:

b.protectedMethod({});

Ответ 2

Кажется, что эта идиома, как упоминается в другом вопросе SO здесь. Он называется идиомой "Адвокат-клиент" и более подробно описывается там.

Ответ 3

какой-то скучный человек, как я, сделает код fowllow:

int FraudKey=0;
b.protectedMethod(reinterpret_cast<SomeKey&>(FraudKey));

Ответ 4

Его довольно близко к этому:

http://minorfs.wordpress.com/2013/01/18/raiicap-pattern-injected-singleton-alternative-for-c/

В принципе, если вы считаете ссылку на объект хорошо спроектированного класса, чтобы обеспечить вам необходимо реализовать любую политику управления доступом, которая на самом деле имеет смысл, применяя этот шаблон к чему-либо, кроме конструктора, похоже, не имеет такого смысла.

Итак, как говорится в статье, если вы используете этот ключ вместе с этими конструкторами для чего управление доступом может иметь смысл, объекты, которые представляют значительную часть ресурсов пуганий, которые в С++ обычно реализуются как объекты RAII, чем действительно имеет смысл имя RAIICap или RAII-Capability.

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/#!topic/std-proposals/p_v-aYIvO1E

К сожалению, есть проблемы с идеей о том, что может быть один основной отпечаток, который составляет вычислительный корень, поэтому что-то вроде этого, по-видимому, не может иметь места в стандартной библиотеке. Сказав это, по крайней мере, для использования с конструктором классов RAII, эта схема представляется весьма полезной.