это выглядит как функция JS, чем Руби :)
Несколько вещей, чтобы заметить:
- переменные не используются, так что вы можете избавиться от них
- Есть целый лот
else nil
, который может быть удален как метод Ruby, возвратит nil
по умолчанию
- Вы используете тернарный оператор только для возврата
nil
, опять же, вы можете избежать его
- Этот метод делает слишком много вещей: Это проверка, какой журнал это, а также отображать/форматирования
- Стиль Примечание: В Ruby мы используем snake_case, поэтому метод должен быть называется
find_logs
Вы можете избежать повторения, как уже было сказано, и заменить его чем-то вроде:
def find_logs(obj)
log_type = ["E", "T", "L", "Te", "Le"].detect do |type|
obj[type] && obj[type]["pkg"]
end
"@#{log_type} = #{obj[log_type]['pkg']}," if log_type
end
Теперь, это не особенно красива и она по-прежнему делать две разные вещи, но это может быть достаточно хорошим , и я t удалили дублирование.
Я не знаю проблемы, которую вы пытаетесь решить, но поскольку мы в Ruby, вероятно, лучше решить ее с помощью класса, например. что-то вроде этого (не проверял, поэтому он не может работать):
class LogFormatter
LOG_TYPES = ["E", "T", "L", "Te", "Le"]
def initialize(obj:)
@obj = obj
end
def format
"@#{log_type} = #{pkg}," if log_type
end
private
attr_reader :obj
def pkg
@pkg ||= obj[log_type]["pkg"]
end
def log_type
@log_type ||= LOG_TYPES.detect { |type| obj[type] && obj[type]["pkg"] }
end
end
Теперь, имейте в виду, что в зависимости от того, что вы пытаетесь сделать, это может быть немного излишним - но лично я предпочитаю иметь а не иметь этот «сложный» метод в каком-то другом классе с совершенно несвязанной ответственностью.
возможно, если вы удалите переменные и сделайте их ключами в хеше, или что-то в этом роде. Ключи хэша намного проще перебирать. поэтому 'te = obj [...]' становится 'my_hash ['te'] = obj [...]' –
Вы тоже можете делать это для локальных варов, но не должны. –
Что должен делать ваш код? Локальные переменные бессмысленны, если вы их не используете. – Stefan