gpt4 book ai didi

ruby-on-rails - 如何分离功能和登录 ruby​​ 方法

转载 作者:太空宇宙 更新时间:2023-11-03 17:29:56 26 4
gpt4 key购买 nike

我非常喜欢记录。在我的 Rails 应用程序中,我有很多方法,例如:

def my_method(argument1:, argument2:)
logger.info "Starting my_method with arguments: #{argument1} and #{argument2}"
result = argument1 + argument2
logger.info "Finished my_method with result: #{result}"
end

如何解耦方法的功能和日志记录?

理想情况下,结果应该是这样的(借用 Rails 的回调概念作为示例):

before_method: :my_method_log_start, only: :my_method
after_method: :my_method_log_end, only: :my_method

def my_method(argument1:, argument2:)
result = argument1 + argument2
end

private

def my_method_log_start
logger.info "Starting my_method with arguments: #{argument1} and #{argument2}"
end

def my_method_log_end
logger.info "Finished my_method with result: #{result}"
end

我知道这在代码行方面效率较低,但更具可读性(在我看来)。

我读过面向方面编程和他们的一些杰作,如 Aquarius,但添加一个新的范例只是为了日志记录看起来有点矫枉过正。

最佳答案

我认为Avdi Grimm对您可以使用的技术有很好的解释。这个想法是将日志记录(或其他任何东西)提取到监听器类并将事件发布到该监听器,基本示例是

class Task
# ...
def add_listener(listener)
(@listeners ||= []) << listener
end
# ...

def notify_listeners(event_name, *args)
@listeners && @listeners.each do |listener|
if listener.respond_to?(event_name)
listener.public_send(event_name, self, *args)
end
end
end
end

然后做某事

task = Task.new
task.add_lestener(YourLoggerClass.new)
task.notify_listeners(:start_logging)
task.notify_listeners(:end_logging)

关于ruby-on-rails - 如何分离功能和登录 ruby​​ 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43452180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com