[#6954] Why isn't Perl highly orthogonal? — Terrence Brannon <brannon@...>

27 messages 2000/12/09

[#7022] Re: Ruby in the US — Kevin Smith <kevinbsmith@...>

> Is it possible for the US to develop corporate

36 messages 2000/12/11
[#7633] Re: Ruby in the US — Dave Thomas <Dave@...> 2000/12/19

tonys@myspleenklug.on.ca (tony summerfelt) writes:

[#7636] Re: Ruby in the US — "Joseph McDonald" <joe@...> 2000/12/19

[#7704] Re: Ruby in the US — Jilani Khaldi <jilanik@...> 2000/12/19

> > first candidates would be mysql and postgressql because source is

[#7705] Code sample for improvement — Stephen White <steve@...> 2000/12/19

During an idle chat with someone on IRC, they presented some fairly

[#7750] Re: Code sample for improvement — "Guy N. Hurst" <gnhurst@...> 2000/12/20

Stephen White wrote:

[#7751] Re: Code sample for improvement — David Alan Black <dblack@...> 2000/12/20

Hello --

[#7755] Re: Code sample for improvement — "Guy N. Hurst" <gnhurst@...> 2000/12/20

David Alan Black wrote:

[#7758] Re: Code sample for improvement — Stephen White <steve@...> 2000/12/20

On Wed, 20 Dec 2000, Guy N. Hurst wrote:

[#7759] Next amusing problem: talking integers (was Re: Code sample for improvement) — David Alan Black <dblack@...> 2000/12/20

On Wed, 20 Dec 2000, Stephen White wrote:

[#7212] New User Survey: we need your opinions — Dave Thomas <Dave@...>

16 messages 2000/12/14

[#7330] A Java Developer's Wish List for Ruby — "Richard A.Schulman" <RichardASchulman@...>

I see Ruby as having a very bright future as a language to

22 messages 2000/12/15

[#7354] Ruby performance question — Eric Crampton <EricCrampton@...>

I'm parsing simple text lines which look like this:

21 messages 2000/12/15
[#7361] Re: Ruby performance question — Dave Thomas <Dave@...> 2000/12/15

Eric Crampton <EricCrampton@worldnet.att.net> writes:

[#7367] Re: Ruby performance question — David Alan Black <dblack@...> 2000/12/16

On Sat, 16 Dec 2000, Dave Thomas wrote:

[#7371] Re: Ruby performance question — "Joseph McDonald" <joe@...> 2000/12/16

[#7366] GUIs for Rubies — "Conrad Schneiker" <schneik@...>

Thought I'd switch the subject line to the subject at hand.

22 messages 2000/12/16

[#7416] Re: Ruby IDE (again) — Kevin Smith <kevins14@...>

>> >> I would contribute to this project, if it

17 messages 2000/12/16
[#7422] Re: Ruby IDE (again) — Holden Glova <dsafari@...> 2000/12/16

-----BEGIN PGP SIGNED MESSAGE-----

[#7582] New to Ruby — takaoueda@...

I have just started learning Ruby with the book of Thomas and Hunt. The

24 messages 2000/12/18

[#7604] Any corrections for Programming Ruby — Dave Thomas <Dave@...>

12 messages 2000/12/18

[#7737] strange border-case Numeric errors — "Brian F. Feldman" <green@...>

I haven't had a good enough chance to familiarize myself with the code in

19 messages 2000/12/20

[#7801] Is Ruby part of any standard GNU Linux distributions? — "Pete McBreen, McBreen.Consulting" <mcbreenp@...>

Anybody know what it would take to get Ruby into the standard GNU Linux

15 messages 2000/12/20

[#7938] Re: defined? problem? — Kevin Smith <sent@...>

matz@zetabits.com (Yukihiro Matsumoto) wrote:

26 messages 2000/12/22
[#7943] Re: defined? problem? — Dave Thomas <Dave@...> 2000/12/22

Kevin Smith <sent@qualitycode.com> writes:

[#7950] Re: defined? problem? — Stephen White <steve@...> 2000/12/22

On Fri, 22 Dec 2000, Dave Thomas wrote:

[#7951] Re: defined? problem? — David Alan Black <dblack@...> 2000/12/22

On Fri, 22 Dec 2000, Stephen White wrote:

[#7954] Re: defined? problem? — Dave Thomas <Dave@...> 2000/12/22

David Alan Black <dblack@candle.superlink.net> writes:

[#7975] Re: defined? problem? — David Alan Black <dblack@...> 2000/12/22

Hello --

[#7971] Hash access method — Ted Meng <ted_meng@...>

Hi,

20 messages 2000/12/22

[#8030] Re: Basic hash question — ts <decoux@...>

>>>>> "B" == Ben Tilly <ben_tilly@hotmail.com> writes:

15 messages 2000/12/24
[#8033] Re: Basic hash question — "David A. Black" <dblack@...> 2000/12/24

On Sun, 24 Dec 2000, ts wrote:

[#8178] Inexplicable core dump — "Nathaniel Talbott" <ntalbott@...>

I have some code that looks like this:

12 messages 2000/12/28

[#8196] My first impression of Ruby. Lack of overloading? (long) — jmichel@... (Jean Michel)

Hello,

23 messages 2000/12/28

[#8198] Re: Ruby cron scheduler for NT available — "Conrad Schneiker" <schneik@...>

John Small wrote:

14 messages 2000/12/28

[#8287] Re: speedup of anagram finder — "SHULTZ,BARRY (HP-Israel,ex1)" <barry_shultz@...>

> -----Original Message-----

12 messages 2000/12/29

[ruby-talk:8184] Thoughts on the observer mix-in [long] (was: Re: Method as block to method)

From: "Nathaniel Talbott" <ntalbott@...>
Date: 2000-12-28 17:28:10 UTC
List: ruby-talk #8184
> > I find myself wanting to pass a method as the block to
> another method on a
> > fairly regular basis, and I don't really like how the code
> turns out.
> > Currently it looks like this:
> >
> > 	result.addFaultListener(self, &(method(:addFault).to_proc))
>
> Rather than adding a method, why not add an observer class?

Well, when I first implemented my observable/observer, I had forgotten about
the Observable mixin, so I started from square one, trying to figure out the
simplest and most useful implementation of observer for my needs. What I
came up with (and have used several times now) is something like this (note
that I have not run this example code):

	class ObservableThing
		def initialize
			@thingListeners = Hash.new
		end
		def addThingListener(key, &proc)
			@thingListeners[key] = proc
		end
		def removeThingListener(key)
			@thingListeners.delete(key)
		end
		def notifyThing(thing)
			@thingListeners.each {
				| key, proc |
				proc.call(thing)
			}
		end
	end

	class ThingObserver
		def hookUpTo(observableThing)
			observableThing.addThingListener(self) {
				| thing |
				puts("Notified: #thing")
			}
		end
	end

	observableThing = ObservableThing.new
	thingObserver = ThingObserver.new

	thingObserver.hookUpTo(observableThing)
	observableThing.notifyThing("Wild thang") => Notified: Wild thang

My original question stemmed from the fact that often (but not always),
because of the way my code is factored, the most convenient proc to hook up
is a method on the observing class, i.e.:

	def hookUpTo(observableThing)
		observableThing.addThingListener(self, &method(:thingHappened))
	end
	def thingHappened(thing)
		puts("Notified: #thing)
	end

I like leaving it up to the observing class to choose what's the simplest in
his situation.

So, anyhow, I came up with this solution, and then everyone reminded me
about the observer, so I went to look at it. No offense to the original
author, but I really don't like it. Here's a run down of my thoughts on it:

Pros:
	Easy to mixin
	One method to implement on observer, none on observable (just call changed
and notify_observers)

Cons:
	Observable cannot have multiple 'thing' notifications
	Observer must either only listen to one observable, or he must multicast
the notifications himself
	Observable must often pass himself in the notification so that his
observers can multicast
	Observer must implement the update method

I guess it comes down to where I think the responsibilities for notification
should lie. To me, the observer has almost no responsibilities, other than
hooking himself up (and even that could easily be done by someone else, thus
completely encapsulating the observer from the observable). He should also
have as much flexibility as possible in how he responds to the notification.

OTOH, the observable is responsible for the tracking of observers and for
notifying those observers when something changes. He should _not_ dictate to
his observers how they implement their response to his notification, other
than (maybe) requiring that they accept a certain set of data.

Here are what I see as pros and cons to the approach that I've taken:

Pros:
	Easy many-to-many observer to observable correspondance
	Light, flexible observers

Cons:
	Not an easy mixin
	More code to add for each observable thing

I think that a mixin might be possible, negating both cons above, but I
haven't had time to delve into it yet. My initial thoughts are something
along the lines of:

class ObservableThing
	include Observable
	observable("thing")
end

which would create code equivalent to my ObservableThing class above. I'm
thinking some additional options might be useful, such as a number
indicating the number of arguments that will be passed to observers.

I'm curious to hear everyone else's thoughts on the pros and cons of both
the original observer scheme and my new scheme.


Nathaniel

<:((><
+ - -						+ - -
| RoleModel Software, Inc. &		| EQUIP VI
| The XP Software Studio(TM)		|

In This Thread

Prev Next