我正在处理由许多不同类组成的大量代码,我想构建一种在运行时收集一些统计信息的方法。理想情况下,我希望内部类能够运行类似
record_stat(:api_requests, 1)
整个过程从单个入口点(引擎)开始,但是理想情况下,我希望避免将该实例传递给所有内部类。最明显的解决方案(但我想避免)是:
record_stat
方法最初,我在看第二个选项,因为我已经为某些内部函数提供了一个返回值类,但是我只是认为,只要有一个处理该问题而不需要传递任何东西的方法,那就干净得多了。一直。
我目前与日志记录有些相似,我可以在其中运行::Engine::Logger.debug('...')
,但是正在使用Thread.current
做某事,而且感觉永远不对,所以不确定我是否也应该这样做。
是否有任何方法可以使record_stat
方法仅适用于该过程,或者仅对某个块全局可用,以使所有内部成员都可以访问该方法,并使该方法对于引擎的运行而言是唯一的?>
编辑:提供示例
引擎
class Engine
...
def sync
remote = fetch_remote_data
records = map_remote_to_records(remote)
save_records(records)
end
def fetch_remote_data
@types.map do |type|
DataFetcher.new(type).fetch
end
end
def map_remote_to_records(remote)
remote.map do |r|
RecordMapper.new.map(r)
end
end
def save_records(records)
records.each do |record|
RecordSaver.new(record).save!
end
end
end
DataFetcher
class DataFetcher
def fetch(query = nil)
provider.fetch(query)
end
end
提供商
class SomeRemoteServerProvider
def fetch(query)
make_api_request.map do |remote|
<convert to internal format>
end
end
end
RecordMapper
class RecordMapper
def map
local = find_or_build(@remote)
assign_attributes(local, @remote)
local
end
end
RecordSaver
class RecordSaver
def save!
@records.each do |record|
save_record!
save_associations!
...
end
end
end
好的,所以这是一个简化的简化示例,但是在这种情况下,我要跟踪的是诸如SomeRemoteServerProvider
之类的类,以报告其已进行的API调用的次数,或{{1 }}报告实际找到的本地记录数量以及必须创建的本地记录数量。像这样