ruby - 多个类的 DRY-ing 方法救援
问题描述
我正在尝试做一些在我看来非常基本的事情,但我想不出办法让它变干。
这是我最初的代码:
我的第一个工人
class WorkerOne < BaseWorker
def perform
# do stuff
rescue *exceptions_to_rescue_with_error => error
job_error(error, try_later: false)
rescue *exceptions_to_rescue_with_error_and_try_later => error
job_error(error, try_later: true)
rescue *exceptions_to_rescue_with_warning => message
job_warning(message, try_later: false)
end
end
我的第二个工人
class WorkerTwo < BaseWorker
def perform
# do stuff
rescue *exceptions_to_rescue_with_error => error
job_error(error, try_later: false)
rescue *exceptions_to_rescue_with_error_and_try_later => error
job_error(error, try_later: true)
rescue *exceptions_to_rescue_with_warning => message
job_warning(message, try_later: false)
end
end
父类
class BaseWorker
def exceptions_to_rescue_with_error
[
Exceptions::SomeOtherError,
ActiveRecord::RecordNotFound
]
end
def exceptions_to_rescue_with_error_and_try_later
[
Exceptions::SomeError1,
Exceptions::SomeError2,
]
end
def exceptions_to_rescue_with_warning
[
Exceptions::SomeWarning
]
end
end
这是我添加到 BaseWorker 以使其工作的方法:
def self.with_job_rescue_for_perfom
define_method(:perform) do |*args, &block|
self.perform(*args, &block)
rescue *exceptions_to_rescue_with_error => error
job_error(error, try_later: false)
rescue *exceptions_to_rescue_with_error_to_try_later => error
job_error(error, try_later: true)
rescue *exceptions_to_rescue_with_warning => message
job_warning(message, try_later: false)
end
end
end
我被困在那里,我不知道下一步该往哪里看。似乎这里使用的方法对我不起作用,因为我没有使用模块。
任何想法?
解决方案
我会做这样的事情:
class BaseWorker
def exceptions_to_rescue_with_error
[
Exceptions::SomeOtherError,
ActiveRecord::RecordNotFound
]
end
def exceptions_to_rescue_with_error_and_try_later
[
Exceptions::SomeError1,
Exceptions::SomeError2,
]
end
def exceptions_to_rescue_with_warning
[
Exceptions::SomeWarning
]
end
def perform
do_stuff
rescue *exceptions_to_rescue_with_error => error
job_error(error, try_later: false)
rescue *exceptions_to_rescue_with_error_and_try_later => error
job_error(error, try_later: true)
rescue *exceptions_to_rescue_with_warning => message
job_warning(message, try_later: false)
end
end
class WorkerOne < BaseWorker
def do_stuff
# do stuff
end
end
class WorkerTwo < BaseWorker
def do_stuff
# do stuff
end
end
推荐阅读
- functional-programming - 如何解决此“两个列表的差异”功能?
- java - 使用 Java8 将列表转换为映射,以空列表作为值
- git - 如何在 jenkins 管道代码中输入 git 凭据
- linux - docker容器中无法启动超过5个slave节点
- iphone - iPhone 捕获会话:设置自定义帧速率
- docker - Docker 撰写 ECS 错误:资源处理程序返回消息:“模型验证失败(#/Volumes:数组项不唯一)”
- java - 未找到 [SaajSoapMessage {http://schemas.xmlsoap.org/soap/envelope/}UpdateXXXRequest] 的端点映射
- c# - 依赖注入是一种设计模式吗?
- windows - Docker for windows 使用 WSL2 无需将文件移动到发行版驱动器以增加加载时间
- qt - 如何更改滚动视图以相反方向滚动