Robert Dober
4/13/2007 8:01:00 PM
On 4/13/07, Tim Pease <tim.pease@gmail.com> wrote:
> On 4/13/07, Robert Dober <robert.dober@gmail.com> wrote:
> > Hi list
> >
> > this is incredibly simple, but I just wanted to know what you think about it.
> >
> > I really often write the following code
> >
> > puts <whatever> if $DEBUG
> >
> > I guess you all do that to some extent, James just talked a newbie
> > into it recently ;)
> >
> > The first programmer's virtue of course makes me do some things like
> > def debug *args, &blk
> > return unless $DEBUG
> > <do something incredibly smart with the args ;)>
> > end
> > and sometimes on some of my machines I will do something like
> >
> > require 'ilmig/tools/debug'
> >
> > I feel that this might be so common place that a Kernel::debug or
> > whatever other suitable name might be a good idea.
> >
> > I am listening .... ;)
> >
>
> For medium to large programs having a global $DEBUG flag is going to
> create lots of "line noise" as all those debug messages go whipping
> by.
Tim the $DEBUG mechanism is quite primitive and other things are
needed for large scale development, no doubt.
My idea of the CR is orbiting around $DEBUG which is widely used in
quick hacks or small to medium scale development, but...
>
> I much prefer the fine grained control that the 'logging' and 'log4r'
> packages give you.
>
>
> require 'logging'
>
> class A
> def initialize
> @log = Logging::Logger[self]
> @log.debug "new object created '#{self.object_id}'"
> end
> end
>
> class B
> def initialize
> @log = Logging::Logger[self]
> @log.debug "new object created '#{self.object_id}'"
> end
> end
>
> Logging::Logger['A'].level = :warn
> Logging::Logger['B'].level = :debug
>
>
> It's a little more setup, but you have far greater control over what
> gets logged and what doesn't. The framework also takes care of
> timestamps, outputting class info, etc.
>
> And if you don't want all that complexity, there is always the core
> Logger class that comes with Ruby.
>
> Blessings,
> TwP
... I take one idea from your mail, with your kind permission ;)
Why not enhancing the semantics of $DEBUG at the same moment, I will elaborate
-----------------------------------------------------------------------------------
def Kernel.debug *args, &blk
return unless $DEBUG
begin
$DEBUG.puts args.join(" ") unless args.empty?
blk.call $DEBUG if blk
rescue
warn $DEBUG does not respond to the #puts message
end
end
now you can write code like
debug "OMG this should be deadcode, why I am here, I just kept that
code for sentimental reasons!!!!"
or
debug do
puts "whatever"
end
or
debug {
| stream |
stream.puts "@inst = #{@inst}"
}
or
debug do
$DEBUG.print "one"
end
of course the -d switch of ruby would just set $DEBUG to $stdout,
maybe a -l <stream>
switch could be introduced to set $DEBUG to a writeable IO object
representing <stream>
------------------------------------------------------------------------------------------------------
Now I realize I did not think about other debugging mechanisms, the
core idea is just to simplify what I think is a common and useful
idiom namely
puts "/...." if $DEBUG
I do not think that this will compete with more advanced debugging,
logging features, but why not enhance the $DEBUG switch as suggested
above.
Yeah and before I forget, thx for your input Tim.
Cheers
Robert
--
You see things; and you say Why?
But I dream things that never were; and I say Why not?
-- George Bernard Shaw