Полез отлаживать вебсокеты на работе и окунулся из уютного мира Кложи в чан с Джавой. Конкретно, меня триггернул вот этот класс:
org.eclipse.jetty.websocket.server.config.JettyWebSocketServletContainerInitializer$Configurator
Да, прям так и написано, в одну строчку. 96 символов, между прочим. В перфокарту не влезет.
Но давайте смотреть. Все что до точки это пакет.
org.eclipse.jetty
, понятно, название библиотеки. Тут у меня уже начинает болеть голова, потому что почему нельзя просто
jetty
сделать? В смысле нельзя потому что в Джаве так не принято, а почему в Джаве так не принятно?
Мне кажется, люди в 2000-х, когда интернет только начинался, немножко боялись, что имен не хватит на всех и нужно их как-то «занимать». А вот если разделить весь пул имен на три под-пула (com, org, net) то тогда хватит.
Название организации
eclipse
тут присутствует по похожей причине, типа, а вдруг имена закончатся, а кому-то очень надо будет сделать проект, который тоже будет называться
jetty
, вот тогда он просто организацию поменяет и будет норм! (спойлер: будет все равно не норм)
Прошло 20 лет и выяснилось, что имен пока всем хватает, даже когда разобрали всех животных, все планеты и латинские слова. Npm вон как-то справляется.
Дальше идет
websocket.server.config
. Это, собственно, пакет. Точнее, подпакет. Тут у меня три вопроса.
Во-первых, ну ты уже застолбил
org.eclipse.jetty
, ну и положи туда все, что у тебя есть, что, жопа отвалится? То есть сама необходимость подпакетов.
Во-вторых, если ты делаешь подпакеты, делай их для себя, а пользователю ими голову не парь. В Джаве это, к сожалению, любят. Например, они запилили работу со временем в
java.time
. Вопросов ноль. Но и положи ты в этот пакет все, Якове, брате, зачем аРхИтЕкТуРу городить? Но нет, таймзоны у них в
java.time.zone
, форматтеры в
java.time.format
, остальное размазано равномерно-случайно между
java.time.temporal
,
java.time.chrono
и собственно
java.time
. Может в момент придумывания это и звучало как-то стройно и логично
для какого-то одного конкретного случая, но на практике получается, что я всегда импортирую пару классов из одного, пару из другого и остаток из третьего. И чего? В чем, так сказать, глубокий смысл? У нас нет задачи выкопать яму, есть задача заебать солдата.
Ну и в-третьих, окей, у тебя офигеть сложный проект, прям миллион классов, и если вывалить их в один пакет, то файловой системе поплохеет (сомневаюсь, но давайте предположим). НУ СДЕЛАЙ ТЫ ДВА УРОВНЯ ТОГДА. Не городи эту бесконечную вложенность, как программисты любят. Вехний уровень и на нем несколько папок. ВСЕ. Больше ничего не нужно. Красиво. Плоско. Наглядно. В голове помещается. Есть ли в жизни что-то более идиотское, чем бегать туда-сюда по миллиону мелких папок (привет, `src/main/java/`), в каждой из которых по две-три других папки? Я не знаю.
Ура. С пакетами разобрались. Переходим к классу. JettyWebSocketServletContainerInitializer. Шесть существительных. Добрый вечер.
При этом, в чем смысл пакетов? Это неймспейсы, так? Чтобы классы с одинаковыми именами, например,
Зарплата
, не перепутались, один кладут в пакет
лупа
, а другой в
пупа
.
ТОГДА ЗАЧЕМ ЭТУ ВСЮ ИНФОРМАЦИЮ ПОВТОРЯТЬ В НАЗВАНИИ КЛАССА?
А, Джависты? Зачем? Зачем, а? Jetty. Было в пакете. Чего молчишь? А? WebSocket. Было. Заело, да?
Дальше.
$
означает вложенный класс. То есть есть класс JettyWebSocketServletContainerInitializer, а у него внутри еще Configurator. Зачем? А никто не знает. Вроде бы пакеты и так выполняют функцию неймспейсов, но в данном случае неймспейсом может поработать класс.
На семантику я даже боюсь смотреть. Зачем нужен целый класс
Initializer
, почему нельзя просто проинициализировать что-то? Почему нельзя сказать
obj.option = "abc"
. Ну или ладно,
obj.initialize(options)
? Зачем инициализатору нужен свой отдельный конфигуратор? Никто не знает. Джависты боятся простоты как огня.
Пишите, короче, на Кложе.