Messaging vs. Methoding
Stephen Pair
spair at advantive.com
Tue Mar 23 17:10:06 UTC 1999
The common way of handling this is to provide the most common options as
methods on String (i.e. #reMatch:), but encapsulate the less frequently used
options in some object (in which defalt values could be initilized). I
don't know the details of your implementation, but the calling code could
look something like:
aString reMatchPattern:
(RePattern new
patternString: pattern;
opt: oString;
from: begin;
to: end;
yourself)
You then only need to specify the options that differ from the defaults.
When you find yourself providing many such methods (to set individual
options), it's probably a good indication that things are either factored
incorrectly (requiring a new object) or you're trying provide too much for
the user.
- Stephen
P.S. For more clarity, you might even break out the options into
individual, settable instance variables.
> -----Original Message-----
> From: agree at carltonfields.com [mailto:agree at carltonfields.com]
> Sent: Tuesday, March 23, 1999 11:14 AM
> To: DanI at wdi.disney.com; kpgrant at mindspring.com
> Cc: squeak at cs.uiuc.edu
> Subject: Messaging vs. Methoding
>
>
> I have found the discussions quite informative, and have
> surprised myself as I find me leaning away from changes to syntax
> and convention of Smalltalk-80 in favor of less invasive
> solutions. To that end, I found myself wishing for a better
> solution, but was unable to find it. I would appreciate the
> advice of Smalltalkers with more experience than I.
>
> In building a module, I find myself wishing to provide broad
> functionality with a range of options, but also desiring to have
> the morass of options mostly hidden by use of highly common
> defaults. For the simplest example, consider this message from
> the rePlugin package:
>
> aString reMatch: pattern opt: oString from: begin to: end
>
> This directs a search of the receiver for matches of patterns
> from the specified substring indices, using certain options
> specified by oString. Assume that this full functionality is all
> warranted and necessary. The problem is that users most
> frequently will call this by using:
>
> aString reMatch: pattern opt: ' ' from: 1 to: (aString size)
>
> tending to make us want to provide:
>
> aString reMatch: pattern
>
> with defaults for the opt:, from: and to: portions of the
> message. On the other hand, the other calls are not infrequent,
> leading us to want to provide message for EVERY combination, in
> this case a total of 8 messages. Worse, every new degree of
> freedom requires another doubling of the message count. In many
> cases, each of these messages simply call the "most heavily
> specified" version, using the appropriate defaults.
>
> This leads to lots of messages, and IMHO, aesthetically too many.
> Practically, managing new factorings becomes unwieldy and
> error-prone. In languages such as Python, methods can be defined
> to have a plurality of default keywords, such as:
>
> reMatch(self,pattern,opt='',from=1,to=self.size())
>
> which has the effect of the combinatorial expansion of
> independent messages, but the virtue of having the code handled
> all in one place, and requires no "pure glue" messages.
> (Actually, I'm not sure that the default for to can be specified
> in this way. You may need to default to nil and put the logic in
> the preamble of the method.)
>
> I think this is a good thing. I note that from a messaging
> standpoint, this approach requires no change in syntax (as would
> the Python keyword parameters, for example). I presume that the
> reason this isn't done in Smalltalk is that dynamic lookups of
> methods would be complicated and slowed thereby. Still, it seems
> to me that the a method lookup process needn't be impeded by
> default keywords -- the compiler can still generate each method
> selector independently, having them all point to the same code,
> or perhaps code that performs the "glue assignments," followed by
> a message to the "fully specified" procedure. Of course,
> browsers would need to know that removing or modifying such a
> message would require removal or modification of ALL of the
> "derivative" methods, but that doesn't seem too complex. It
> would be "nice," IMHO, to be able to specify every one of the
> messages above with a single message (from a browsing
> perspective) having a declaration, perhaps, of the form:
>
> reMatch: pattern opt: oString := ' ' from: begin := 1 to:
> to := (self size)
>
> or equivalent (and perhaps better-looking) syntax?
>
> I presume that this has all been considered and weighed before.
> What am I missing? Should I have better factored the design? Is
> the keyword defaults approach practical (or even desirable) in
> Squeak? Would it be straightforward to implement? How would you
> go about it?
>
More information about the Squeak-dev
mailing list
|