Этот код ruby ​​(rails) читается просто? - PullRequest
0 голосов
/ 03 июля 2019

Первый

[1] pry(main)> 1.month.from_now.change(%i(min sec).inject({}){|h, i| h.merge(i => Time.current.send(i))}.merge(hour: 10))
=> Sat, 03 Aug 2019 10:25:00 KST +09:00

Второй

[2] pry(main)> 1.month.from_now.change(min: Time.current.min, sec: Time.current.sec, hour: 10)
=> Sat, 03 Aug 2019 10:26:31 KST +09:00

Какой код более читабелен?

Я думаю, что первый код менее прост для чтения.

Первый код может быть разделен на две части.

1.month.from_now.change - https://api.rubyonrails.org/classes/Time.html#method-i-change

[3] pry(main)> %i(min sec).inject({}){ |h, i| # https://apidock.com/ruby/Enumerable/inject
[3] pry(main)*   h.merge(i => Time.current.send(i)) # https://apidock.com/ruby/Object/send
[3] pry(main)* }.merge(hour: 10)
=> {:min=>34, :sec=>48, :hour=>10}

Так что, когда кто-то, кто не знаком с ruby, читает первый код, это немного сложно.

Кстати, если кто-то знает метод Time.change, второй код проще.

Разница в том, что первый код менее повторяется, чем второй.

  1. Time.current
  2. мин
  3. сек

Первый код используется только один раз над ключевым словом. Поэтому в первом коде используется дополнительный метод inject и метод merge, а также дополнительная сложность.

Какой я использую код?

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

2-я версия легче читается. Вот еще несколько вещей, которые могут помочь

  • Помещение текущего времени в переменную так, что вы вызываете 1.month.from_now, а ваши min и sec аргументы используют одно и то же время
  • Установка времени в логическом порядке чтения (часы, минуты, секунды)
  • Цепочка с advance делает это немного более читабельным, я думаю

Пример:

today = Time.current
next_month = today.
  advance(months: 1).
  change(hour: 10, min: today.min, sec: today.sec)
0 голосов
/ 03 июля 2019

Второй код абсолютно более читабелен, чем первый. Кажется, легче получить первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...