Имеет ли смысл этот DSL для моего контейнера DI?

Поскольку я не являюсь носителем английского языка, лучше не создавать DSL, который будет звучать неловко для других. Контейнер DI возник из проекта, и я выделяю его как отдельный проект. Я вижу другие контейнеры DI/IOC, используя синтаксис, такой как bind(interface).to(class), Я бы использовал следующее (псевдокод):

given(interface).thenUse(class)
given(class).constructWith(id=5)
given(class).inject(observer).inMethod(addObserver)

Имеют ли они смысл или это звучит как конструкция того, кто не понимает более тонкую семантику этих слов?

1 ответ

Решение

Я думаю, что ваш подход имеет такой же смысл, как и примеры из других проектов DI.

Несколько заметок:

  1. bind/to короче написать чем given/thenUse, Само по себе это не проблема, но если вы можете достичь того же значения с более короткими именами, нет особой причины использовать более длинные (в приведенных примерах они оба читают одно и то же)

  2. Если существует установленный шаблон имени для того же самого использования, то жизнь будет проще (например, понимание концепции / значения) для пользователей, которые знают установленный шаблон, приходящий к вашей реализации, что будет преимуществом.

    Если вы после "преобразования" пользователей других подобных библиотек / инструментов в свои, использование соглашения об именах smae снижает барьер входа для этих пользователей.

    Если ваша имплементация концептуально отличается от некоторых, однако, может быть лучше использовать разные имена, чтобы подчеркнуть разницу и уменьшить когнитивный диссонанс (между тем, что ожидается, и тем, что происходит).

    Если вы думаете (один из), что другие шаблоны именования имеют недостаток, который создает когнитивный диссонанс (между тем, что подразумевает имя, и тем, что он на самом деле делает), то замена его на лучшую схему именования может означать больше последователей.

  3. В то время как given(class).inject(param).inMethod(method) хорошо читает на английском, у него есть порядок объектов, которые могут быть для кого-то нелогичными (класс / param / method в отличие от class / method / param, который является естественным порядком для ОО-языков: Class.method(param);); рассматривать: given(class).and(method).useParam(param)

Другие вопросы по тегам