Имеет ли смысл этот 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.
Несколько заметок:
bind
/to
короче написать чемgiven
/thenUse
, Само по себе это не проблема, но если вы можете достичь того же значения с более короткими именами, нет особой причины использовать более длинные (в приведенных примерах они оба читают одно и то же)Если существует установленный шаблон имени для того же самого использования, то жизнь будет проще (например, понимание концепции / значения) для пользователей, которые знают установленный шаблон, приходящий к вашей реализации, что будет преимуществом.
Если вы после "преобразования" пользователей других подобных библиотек / инструментов в свои, использование соглашения об именах smae снижает барьер входа для этих пользователей.
Если ваша имплементация концептуально отличается от некоторых, однако, может быть лучше использовать разные имена, чтобы подчеркнуть разницу и уменьшить когнитивный диссонанс (между тем, что ожидается, и тем, что происходит).
Если вы думаете (один из), что другие шаблоны именования имеют недостаток, который создает когнитивный диссонанс (между тем, что подразумевает имя, и тем, что он на самом деле делает), то замена его на лучшую схему именования может означать больше последователей.
В то время как
given(class).inject(param).inMethod(method)
хорошо читает на английском, у него есть порядок объектов, которые могут быть для кого-то нелогичными (класс / param / method в отличие от class / method / param, который является естественным порядком для ОО-языков:Class.method(param);
); рассматривать:given(class).and(method).useParam(param)