Iñaki Baz Castillo ha scritto:
> Hi, I use Logger class in a programm and since I need to log in lot of
> different places (into classes, into methods...) I use a global variable in
> this way:
>
> $log = Logger.new
> $log.debug ...
>
> so I can use $log anywhere in the code. Is it ellegant and "the Ruby way"?
>
> The other possibility I see is creating a class that stores the logger
> instance into a @@class_variable (@@logger) and call class method anywhere in
> the code:
>
>
> class MyLogger
>
> @@logger = Logger.new
>
> def self.debug(x)
> @@logger.debug(x)
> end
>
> ...
> end
>
> MyLogger.debug ...
>
> Which is a more ellegant way? is there other option?
>
> Thanks for any advice I could receive from you.
>
>
>
>
Maybe and IMHO you can use a simple dependency injection pattern. You
pass a Logger instance to the constructor of your classes. In this way
you keep the logger object decoupled from other objects in the system.
Moreover, testing will be easier (you can mock the logger implementation).
require 'logger'
class Container
def logger
@logger ||= Logger.new STDOUT
end
def foo
Foo.new(logger)
end
end
class Foo
def initialize(logger)
@logger = logger
end
def bar
@logger.info('Foo#bar invoked.')
end
end
c = Container.new
c.foo.bar