Какая метафора подходит для библиотеки внедрения зависимостей?

Я являюсь автором небольшой библиотеки C++, которая реализует внедрение зависимостей (. Думаю, кто-нибудь назовет ее «контейнером IoC» ).

Я всегда думал, что поиск хорошей метафоры для библиотеки может помочь во многих отношениях :

  • . это упрощает использование библиотеки
  • это помогает автору библиотеки найти правильные абстракции
  • это руководство по проверке надежности конструкции
  • это способ найти осмысленные имена для классов
  • и так далее...

Теперь в моей библиотеке я использовал метафору устройства/разъема :: ваши классы — это «устройства», их зависимости — «разъемы», и вы можете подключить разъем к другому устройству. Это пример кода:

REGISTERED_CLASS( Foo ), public Device
{
...
private:
    Plug< Bar > bar;
...
};
...
catalog.Create( "myFoo", "Foo" );
catalog.Create( "myBar", "Bar" );
...
catalog[ "myFoo" ].Plug( "bar" ).Into( catalog[ "myBar" ] );     // this means myFoo.bar = myBar

Что ж, меня эта метафора не совсем устраивает, потому что:

  • в реальном мире вы вставляете вилки в сокеты, поэтому исходный класс должен иметь вилку, а класс назначения - сокет, но в «мире кода» у меня есть указатель класса, указывающий на другой класс;
  • моя метафора не очень хорошо работает, когда у вас есть ассоциация с мощностью > 1. Я пробовал сMultiplePlug< T >(это в основномstd::list< Plug< T > >), но это звучит не очень хорошо :что такое "множественный штекер" в реальном мире?

Здесь вы можете найти мою библиотеку. Есть ли у вас какие-либо предложения по метафоре, которая лучше подходит моему коду?

(Тем не менее, если у вас есть другие хорошие предложения о библиотеке, они будут приветствоваться!)

Большое тебе спасибо.

Примечание:Я знаю, что есть еще один вопрос на тему «Какая хорошая метафора для внедрения зависимостей», но это не ее дубликат.

Изменить:Это — обсуждение на эту тему в комментарии к известному сообщению в блоге.

Редактировать2:Наконец, я решил изменить синтаксис на этот более приятный и простой синтаксис:

// explicit catalog
use( myCatalog["myBar"] ).as( "bar" ).of( myCatalog["myFoo"] );

// implicit catalog:
within( myCatalog )
{
    use( "myBar" ).as( "bar" ).of( "myFoo" );
   ...
}

6
задан Daniele Pallastrelli 9 October 2012 в 11:58
поделиться