185 похожих чатов

Всем привет. Сейчас я изучаю erlang по книге Erlang and

OTP in action. Дошел до главы где реализуется первый gen server на примере tcp rpc сервера. Меня очень сильно смутил код который пишет автор. Поэтому хочу у вас спросить это у меня архитектурно слоеная деформация или автор нарошно или нет но говнокодит?

Он написал всю программу в одном файле, тобишь и gen server и api запускающий gen server. Я сидел и получал ментальую боль от того что он не поделил их на разные модули высвабаждая пользователю модуля апи ген сервера. Я как обладатель free will решил их поделить и вышло у меня то что получилось на скрине(пока что без имплементации, представте что она есть). Код автора книги я приложил в ссылке на гитхаб, там сделано все в одном файле. Как по мне мое решение в 1000 раз правильнее, может быть в следующих главах автор перепишет этот скрипт но я хочу спросить сейчас, чтобы успакоится

Код автора книги - https://github.com/erlware/Erlang-and-OTP-in-Action-Source/blob/master/chapter_03/tr_server.erl

12 ответов

22 просмотра

Поделил на разные модули и допустил ошибку. Лучше делай по книге

Freezing-Death Автор вопроса
Sergei
Поделил на разные модули и допустил ошибку. Лучше ...

То есть делить не надо было? Или я поделил неправильно?

Freezing Death
То есть делить не надо было? Или я поделил неправи...

пока файл не сильно большой, обычно не выделяют логику в отдельный файл (только переиспользуемую). В коде обычно строкой-разделителем обозначают/разделяют секции с имплементацией ф-й ген поведений и логики.

Freezing-Death Автор вопроса

UPD: в скрине модуль sword_tcp_server вызывает не тот модуль в gen_server но суть думаю ясна что там должен быть sword_tcp_gen_server

Freezing-Death Автор вопроса
Nikita Vorontsov
пока файл не сильно большой, обычно не выделяют ло...

Понял. Спасибо. Делить модуль комментариями это конечно сильно Я не ругаюсь просто удивляюсь

Freezing Death
Понял. Спасибо. Делить модуль комментариями это ко...

такова идея ген-поведений - это то, что повторяется везде и всегда, для чего одно и то же каждый раз в отдельной файле писать?

Оно в одном модуле, потому что клиентские функции, это публичный апи этого модуля. Всё остальное -- детали реализации, и они приватные. Да, можно вынести серверную часть в отдельный модуль. Тогда публичным становится протокол общения клиента и сервера (аргументы в вызове gen_server:call) А это менее удобно, чем публичные клиентские функции, которые скрывают протокол.

Нет, ты сделал антипаттерн. Вызов метода на обьекте, т.е. Gen_server call на процессе разрывается и исполняется в одном модуле.

Сколько людей столько и мнений. В целом в Erlang и Elixir принято писать всё в одном модуле. Я видел как пишут в разных, но это скорее исключение. Тут нет правильного или неправильного варианта, есть только как принято и как не принято. Хочешь чтобы твой код был удобен для других разрабов — делай как принято. Если не хочешь, то делай как считаешь нужным, реки вспять не повернутся от этого

Возможно, если вы мысленно поделите секции экспорта модуля на protected (коллбэки gen_server) и public (всё прочее) вам будет легче на это смотреть.

https://ru.hexlet.io/courses/erlang_101/lessons/practical_erlang_gen_server/theory_unit вот статья от Юрия, для понимания что там под капотом у генсервера упрощенно. кмк, лучшее для понимания принципа построения кода в Э

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Oh sorry did you want it in Gunter's chains?
Martin Rys
15
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Раз начали говорить про embassy, то присоединюсь со своими парой вопросов. 1) Есть ли сопоставимые аналоги для асинхронного кода в emdebbed? 2) Можно ли внутри задач embassy ...
NI_isx
4
Карта сайта