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 ответов

32 просмотра

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

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 вот статья от Юрия, для понимания что там под капотом у генсервера упрощенно. кмк, лучшее для понимания принципа построения кода в Э

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта