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
Поделил на разные модули и допустил ошибку. Лучше делай по книге
То есть делить не надо было? Или я поделил неправильно?
пока файл не сильно большой, обычно не выделяют логику в отдельный файл (только переиспользуемую). В коде обычно строкой-разделителем обозначают/разделяют секции с имплементацией ф-й ген поведений и логики.
UPD: в скрине модуль sword_tcp_server вызывает не тот модуль в gen_server но суть думаю ясна что там должен быть sword_tcp_gen_server
Понял. Спасибо. Делить модуль комментариями это конечно сильно Я не ругаюсь просто удивляюсь
такова идея ген-поведений - это то, что повторяется везде и всегда, для чего одно и то же каждый раз в отдельной файле писать?
Оно в одном модуле, потому что клиентские функции, это публичный апи этого модуля. Всё остальное -- детали реализации, и они приватные. Да, можно вынести серверную часть в отдельный модуль. Тогда публичным становится протокол общения клиента и сервера (аргументы в вызове 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 вот статья от Юрия, для понимания что там под капотом у генсервера упрощенно. кмк, лучшее для понимания принципа построения кода в Э
Обсуждают сегодня