FAQ для программистов

Здесь мы ответим на частые вопросы программистов, которые начинают работать с Denizen. Если у вас нет бэкграунда в программировании, эти темы, скорее всего, покажутся малопонятными.

Похож ли Denizen на (такой-то язык программирования)?

Если в роли (такого-то языка программирования) выступают C / C# / Java / JavaScript или что-то из этой же категории, ответ — твёрдое «нет». Для остальных случаев — посмотрите на распространённые сравнения, которые делают с Denizen:

Визуально Denizen часто сравнивают с Python — выглядит похоже.

По духу логики Denizen очень близок к Bash и другим командным скриптовым языкам.

Чтобы понять, почему так, полезно знать основные категории синтаксиса языков программирования:

  • Функциональный синтаксис (не путать с функциональным программированием — это разные вещи) — это синтаксис, знакомый большинству современных программистов. Он используется в C, C++, C#, Java, JavaScript и во множестве других языков (все «C-подобные» языки относятся к этой категории). Эту категорию характеризует то, что весь код находится внутри функций (или «методов») и по сути сводится к вызовам других функций. Обычно используется формат с круглыми скобками и аргументами через запятую, вроде SomeFunction(arg1, arg2). Python формально не относится к «C-подобным», но всё равно использует функциональный синтаксис.

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

  • Синтаксис «команда + тег» — это то, с чем в той или иной форме знакомится любой сисадмин. Этот синтаксис хорошо ложится на набор команд в командной строке: каждая строка — это команда, за которой идёт список (обычно разделённых пробелами) аргументов; весь ввод по умолчанию воспринимается как сырой текст, но определённые спецсимволы указывают, что часть ввода нужно обработать как подстановку и заменить результатом. Именно так устроены Bash, CommandPrompt, PowerShell (по большей части) и, разумеется, Denizen.

Например, строка в Bash ls -la $FOLDER — выполняет команду с именем ls (list files) с первым аргументом в виде сырого текста -la (он будет интерпретирован как флаги формата вывода) и вторым аргументом с префиксом $, означающим, что значение нужно подставить из переменной окружения (предположительно из переменной, содержащей путь к нужной папке). Вход $FOLDER заменится на конкретный путь, и в итоге команда превратится в ls -la mydir/.

Denizen устроен по той же логике. Например, строка на Denizen narrate "hello there!" targets:<[players]> — выполняет команду narrate с первым аргументом в виде сырого текста hello there! (он будет интерпретирован как сообщение для вывода) и вторым аргументом, где <> означает подстановку тега, а [] — подстановку определения (предположительно списка игроков). В итоге выполненная команда будет выглядеть примерно так: - narrate "hello there!" targets:li@p@bob|p@joe.

Denizen — это ООП?

Короткий ответ: Нет.

Средний ответ: Denizen — объектно-ориентированный в своей основе, но не «только ООП».

Длинный ответ: Denizen не попадает ни в категорию «чистого ООП» (как Java), ни в категорию «мультипарадигменный, но может быть ООП» (как C#).

Denizen использует объекты для представления всех данных — поэтому он объектно-ориентированный в этом смысле. В нём также можно определять свои собственные типы объектов, но он активно отговаривает от этого.

Denizen спроектирован под очень короткие, лаконичные строки кода (можно уложить довольно сложную логику в скрипт из одной-двух цифр строк — благо есть множество команд-«швейцарских ножей»), а естественная многословность ООП этому прямо противоречит. Заводить аккуратные определения собственных типов объектов в языке, где почти все ваши методы/функции будут в одну-две строки, попросту не даёт особого выигрыша. Кроме того, длинные и тщательные определения объектов на синтаксисе Denizen дадут в итоге длинный, путаный скрипт — гораздо менее понятный, чем если просто написать нужную логику императивно.

Denizen — это open source?

Denizen на 100% является свободным ПО с открытым исходным кодом (FOSS) под лицензией MIT.

Мы твёрдо убеждены, что публикация читаемого, хакабельного и собираемого исходного кода нашей работы — это объективное благо: пользователи получают практически неограниченную свободу, любой человек с нужными навыками может внести вклад в развитие Denizen, и это гарантирует, что проект продолжит жить и останется доступен пользователям, даже если что-то пойдёт не так в его обычной разработке (например, если текущие разработчики прекратят работу над проектом, или если проект перейдёт в руки кого-то, кто не стал бы публиковать его на честных условиях).

Реализация Denizen для Spigot лежит на GitHub здесь. Ядро Denizen — здесь. Исходники именно этого руководства можно найти здесь. Также может быть интересен бот-помощник по мета-документации для Discord здесь и расширение для VS Code здесь.

Можно ли отправить Pull Request в Denizen?

Конечно! За эти годы мы приняли множество pull request'ов от самых разных контрибьюторов. Только просим сначала обсудить то, что вы хотите предложить, в Discord — чтобы не тратить время на то, что уже реализовано, и чтобы понимать, как правильно подступиться к конкретной задаче.

Когда вы делаете Pull Request, у вас автоматически попросят принять CLA — соглашение о том, что ваш вклад безвозмездно передаётся проекту Denizen, и вы согласны с тем, что в дальнейшем не сможете ограничивать использование этого вклада. Это нужно для того, чтобы Denizen навсегда оставался свободным и доступным для всех.