Skip to content

Conversation

@bylevskijSV
Copy link

@bylevskijSV bylevskijSV commented Jun 15, 2025

Предлагаю как новую фишку, создавать отдельные бранчи с выполненными дз, чтобы новички могли подсмотреть, если это им нужно - и в целом увидеть разные решения от разных людей)
P.S. Если где-то это уже обсуждалось, то прошу прощения
UPD: 4 варианта решения:

  1. прямое и тупое
  2. Behaviour
  3. Bad Protocol
  4. Use Metaprogramming

@yzh44yzh
Copy link
Owner

Хорошая идея. Посмотрим, присоединится ли к ней кто-нибудь ещё )

@yzh44yzh
Copy link
Owner

Решение хорошее. Использовать Stream.cycle -- это правильно.

Но есть один нюанс, изначально заложеный в задание -- попытаться избежать дублирования кода в модулях Vocalist, Guitarist и Drummer. Тут надо подумать )

@bylevskijSV
Copy link
Author

bylevskijSV commented Jun 16, 2025

Но есть один нюанс, изначально заложеный в задание -- попытаться избежать дублирования кода в модулях Vocalist, Guitarist и Drummer. Тут надо подумать )

Да, согласен с этим замечанием и в планах реализовать это есть, да и идея как это сделать тоже =)
Сегодня после работы сделаю)

@dmitry-sidorov
Copy link

Предлагаю как новую фишку, создавать отдельные бранчи с выполненными дз, чтобы новички могли подсмотреть, если это им нужно - и в целом увидеть разные решения от разных людей) P.S. Если где-то это уже обсуждалось, то прошу прощения

Неплохая идея! Поддержу) Но есть вероятность, что потом придётся идти дальше и мутить комьюнити Elixir.by 😆

@yzh44yzh
Copy link
Owner

Это прекрасная вероятность )

@bylevskijSV
Copy link
Author

Добавил реализацию через behaviour и protocol. В целом - получилось одинаково, но больше понравилось и лаконичнее выглядит для меня через behaviour.

  1. Behaviour
  2. Protocol

def next(player)
end

defimpl MyMusicBand.Player, for: Any do

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Доброго вечера! Прошу прощения за мои 5 копеек!

Какой смысл объявлять протокол для Any? Protocol == полиморфизм. Его суть как раз-таки в том, чтобы написать различные имплементации для одной и той же функции в зависимости от типа входного параметра.

Пример из документации https://hexdocs.pm/elixir/1.12.3/Protocol.html

defprotocol Size do
  @doc "Calculates the size (and not the length!) of a data structure"
  def size(data)
end

defimpl Size, for: BitString do
  def size(binary), do: byte_size(binary)
end

defimpl Size, for: Map do
  def size(map), do: map_size(map)
end

defimpl Size, for: Tuple do
  def size(tuple), do: tuple_size(tuple)
end

Вы можете сделать импорт PlayerLogic и будет то же самое.
Вероятно, нужно посмотреть в сторону @behaviour.
Behaviour обычно и используется для абстрагирования логики, причём вызываемый модуль при помощи коллбеков @callback говорит вызывающему коду, как нужно работать с данным вызываемым модулем.

P.S. Ещё раз прошу прощения, что влез 🙏

Copy link
Author

@bylevskijSV bylevskijSV Jun 16, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Привет, никаких проблем) Можно и нужно высказываться)
Я понимаю про что Вы говорите, но в данном случае просто проба пера протокола и я тут согласен - он не нужен)
А Any и derive это просто лень =) Чтобы для каждого, опять, не писать одно и тоже, а вернее меньше одного и того же)))
Поэтому есть реализация через callback, которая мне больше нравится.

@dmitry-sidorov
Copy link

Добавил реализацию через behaviour и protocol. В целом - получилось одинаково, но больше понравилось и лаконичнее выглядит для меня через behaviour.

  1. Behaviour
  2. Protocol

Мне один умный человек, Матюшкин Алексей Борисович (Юра знает кто это 😆), сказал очень интересную вещь: если код на Elixir кажется вам некрасивым, то 99% что с этим кодом что-то не так😆 Правильный код на Elixir всегда красивый! ❤️

@bylevskijSV
Copy link
Author

bylevskijSV commented Jun 16, 2025

Добавил реализацию через behaviour и protocol. В целом - получилось одинаково, но больше понравилось и лаконичнее выглядит для меня через behaviour.

  1. Behaviour
  2. Protocol

Мне один умный человек, Матюшкин Алексей Борисович (Юра знает кто это 😆), сказал очень интересную вещь: если код на Elixir кажется вам некрасивым, то 99% что с этим кодом что-то не так😆 Правильный код на Elixir всегда красивый! ❤️

Код на любом ЯП, если он некрасивый, значит с ним что-то не так :)

@bylevskijSV
Copy link
Author

UPD: Добавил еще через use используя metaprogramming :)
3) Use or Metaprogramming

@yzh44yzh
Copy link
Owner

Прекрасно, масса вариантов )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants