"stereotyping" (was: Re: Strong Typing (Re: Managing metadata about attribute types) )<Pine.LNX.4.44.0311171402340.1133-100000@ool-4355dfae.dyn.optonline.net> <Pine.LNX.4.44.0311181524130.2236-100000@ool-4355dfae.dyn.optonline.net>

Sean O’Dell wrote:

···

On Wednesday 19 November 2003 01:01 pm, Chad Fowler wrote:

On Thu, 20 Nov 2003, Sean O’Dell wrote:

As demonstrated previously in this thread, class and/or module inheritance
checking doesn’t give you any info about what a method does or what
parameters it takes.

Actually, it tells you exactly. If a class inherits from String, you know it
has all the methods String does, and you know exactly what parameters they
… Sean O’Dell

No, you don’t know that at all. It’s a reasonable presumption, but any,
or all, or the methods that you think are there might have been
overridden. And might do something totally different. And this may be
for either a good reason or a silly reason.

Hi,

···

On Thu, 20 Nov 2003, Yukihiro Matsumoto wrote:

In message “Re: “stereotyping” (was: Re: Strong Typing (Re: Managing metadata about attribute types)”

on 03/11/20, Chad Fowler chad@chadfowler.com writes:

|Why not? By the way, I think types.rb is the only library that actually

|does type checking in the accurate ruby sense.

Really? As long as I checked last time, its check is done based on

“kind_of?” relation.

Eivind’s module is really a generalized checker, for which he happens to
have implemented support for kind_of? and respond_to? I was referring
to the respond_to? part when I said that it accurately supports type
checking.

Though I (and Eivind) don’t really see much of a point in using it.

Chad

Sean O’Dell wrote:

and doesn’t have to be dynamically loaded via “require.”
Why should everybody pay for it?
Because that’s where the hit should occur. If you don’t need it,
don’t use it.

Again: why should everybody pay for it? It’s a runtime cost, not a
design time cost.

I also don’t believe type checking is something that there
should be competing libraries for.
Why? Monocultures are often a bad thing.
So where is the alternate implementation of the String class, or
the Regexp class?

Oniguruma is being worked on – but it’s a compile-time option.
Simon Strandgaard is working on a pure Ruby regexp engine. There’s a
proposal to allow MatchData to be created outside of Regexp#match
that would allow alternative implementations of regular expression
engines to be created.

Something this big really ought to have a stamp of approval. But
that’s a stretch; it doesn’t look like Matz wants anything of this
nature in Ruby anyway.

Not quite true. Matz recognises the need for something like it (it’s
in his Ruby2 presentation). At the beginning of my plunging into
this round of the discussion, I admitted the need for a few classes
of applications. But design-time/compile-time stuff isn’t one of
those classes.

Static typing helps the compiler, not the developer.

That’s not true in any case. If checking for an implemented
interface was sufficient, then the interface would have to look
like a Java interface or something similar. The questionable
feature that you are asking for implies IMHO a lot more changes
than we all see now. And I cannot see a real benefit.
It requires NO CHANGES. It’s entirely optional. It’s just a
declaration of an interface.

If it isn’t like the Java/C# interface, then it’s less “useful” than
what we have now in Ruby. Why? Because then it’s a runtime cost
added to the program but it’s merely a signal to the programmer.

To go back to your example from a different post:

class MockRuwiki
interface Ruwiki
end

This adds overhead (executing “interface Ruwiki”) without enforcing
that MockRuwiki actually implements the interface. If I did:

def accept_ruwiki(foo as Ruwiki)
foo.backend
end

Then I’d happily accept your MockRuwiki but then I’d blow up because
you violated the contract anyway. How is this better than:

def accept_ruwiki(foo)
foo.backend
end

Seriously.

-austin

···

On Thu, 20 Nov 2003 06:08:30 +0900, Sean O’Dell wrote:

On Wednesday 19 November 2003 12:42 pm, Maik Schmidt wrote:

austin ziegler * austin@halostatue.ca * Toronto, ON, Canada
software designer * pragmatic programmer * 2003.11.19
* 18.35.18

Why only in SOAP or RPC mechanisms? What makes them different from
someone who calls into a library?
SOAP, for example, is meant for use by a variety of different
languages and rather expects type mechanisms, mostly because it
was first designed for languages that require static typing. I
can either build the SOAP description manually or have
meta-information available.
Plus the fact that when you’re passing data rather than object
references (which is the case with any remote invocation), you
need to do one of the following: (a) expect exactly the same class
at the other end, (b) serialize the class (executable code) and
send it along with the data, (c) serialize the object’s data in
such a way that equivalent types can be instantiated at the
other end.

You’re right.

Even when doing Ruby->Ruby remote invocations, I presume that
type information is required. Any of the “distributed ruby” people
here care to comment?

Drb uses Marshal#dump and Marshal#load. YAPC uses YAML which has
type markers.

I don’t really want a “prescriptive” mechanism – it makes the
interface too brittle. If I wanted something like that, I think
that I’d want something like the rudimentary DbC stuff that Dave
& Andy put together.
Does anyone have a URL to “the rudimentary DbC stuff”?

http://www.pragmaticprogrammer.com/ruby/downloads/dbc.html

There are other discussions, too.

-austin

···

On Thu, 20 Nov 2003 14:08:51 +0900, Simon Kitching wrote:

On Thu, 2003-11-20 at 16:42, Austin Ziegler wrote:

On Thu, 20 Nov 2003 08:53:21 +0900, Sean O’Dell wrote:

austin ziegler * austin@halostatue.ca * Toronto, ON, Canada
software designer * pragmatic programmer * 2003.11.20

                                     * 01.49.54

But I would make the assumption that if they were overridden, they were
overridden properly, and that the methods my object needs are present. To
declare a certain inheritance, and then to break it, is something I don’t
feel we should be enforcing. That’s up to the developer if they choose to do
that. Also, if you want to enforce parameter checking, that’s a whole other
ballgame to me. Not something I’m interested in; it’s too intrusive.

Sean O'Dell
···

On Wednesday 19 November 2003 02:09 pm, Charles Hixson wrote:

Sean O’Dell wrote:

On Wednesday 19 November 2003 01:01 pm, Chad Fowler wrote:

On Thu, 20 Nov 2003, Sean O’Dell wrote:

As demonstrated previously in this thread, class and/or module
inheritance checking doesn’t give you any info about what a method
does or what parameters it takes.

Actually, it tells you exactly. If a class inherits from String, you know
it has all the methods String does, and you know exactly what parameters
they … Sean O’Dell

No, you don’t know that at all. It’s a reasonable presumption, but any,
or all, or the methods that you think are there might have been
overridden. And might do something totally different. And this may be
for either a good reason or a silly reason.

Sean O’Dell wrote:

and doesn’t have to be dynamically loaded via “require.”

Why should everybody pay for it?

Because that’s where the hit should occur. If you don’t need it,
don’t use it.

Again: why should everybody pay for it? It’s a runtime cost, not a
design time cost.

Because it’s a feature I feel Ruby should have.

Something this big really ought to have a stamp of approval. But
that’s a stretch; it doesn’t look like Matz wants anything of this
nature in Ruby anyway.

Not quite true. Matz recognises the need for something like it (it’s
in his Ruby2 presentation). At the beginning of my plunging into
this round of the discussion, I admitted the need for a few classes
of applications. But design-time/compile-time stuff isn’t one of
those classes.

What is -w for then?

Static typing helps the compiler, not the developer.

What part of “I don’t want static typing” didn’t you understand?

Have you even read my RCR yet?

That’s not true in any case. If checking for an implemented
interface was sufficient, then the interface would have to look
like a Java interface or something similar. The questionable
feature that you are asking for implies IMHO a lot more changes
than we all see now. And I cannot see a real benefit.

It requires NO CHANGES. It’s entirely optional. It’s just a
declaration of an interface.

If it isn’t like the Java/C# interface, then it’s less “useful” than
what we have now in Ruby. Why? Because then it’s a runtime cost
added to the program but it’s merely a signal to the programmer.

You do realize we’re talking about probably 20 lines of C code, plus whatever
it takes for Matz to add the syntactic sugar to parameters.

To go back to your example from a different post:

class MockRuwiki
interface Ruwiki
end

This adds overhead (executing “interface Ruwiki”) without enforcing
that MockRuwiki actually implements the interface. If I did:

def accept_ruwiki(foo as Ruwiki)
foo.backend
end

Then I’d happily accept your MockRuwiki but then I’d blow up because
you violated the contract anyway. How is this better than:

def accept_ruwiki(foo)
foo.backend
end

Seriously.

You are so stuck on “the cost” of this. It’s such a tiny amount of code in
exchange for the ability to warn each every developer who calls your code
that you expect a certain interface from their object.

It’s a LOT better. For you, who knows the contract, no, it’s the same thing.
For a person using the library trying to pass in an unsuitable object, where
the documentation is lacking (and that’s MOST of the code out there, MOST
code is completely undocumented) it results in an extremely useful and
time-saving error message.

Sean O'Dell
···

On Wednesday 19 November 2003 03:35 pm, Austin Ziegler wrote:

On Thu, 20 Nov 2003 06:08:30 +0900, Sean O’Dell wrote:

On Wednesday 19 November 2003 12:42 pm, Maik Schmidt wrote:

“Sean O’Dell” sean@celsoft.com writes:

It’s a LOT better. For you, who knows the contract, no, it’s the
same thing. For a person using the library trying to pass in an
unsuitable object, where the documentation is lacking (and that’s
MOST of the code out there, MOST code is completely undocumented) it
results in an extremely useful and time-saving error message.

It’s not a lot better to me, because it’s inconsistent. If, as you
propose, it should work one way in some cases (the person honors the
interface) and not in others (they don’t), then you’re right back
where you started!

Consider:

Library A asks for interface “foo”.
Library B does trickery to pretend to provide it, but only sorta
does so.
Programmer C uses Library B, only oops Library B forgot to
implement one method that A needs, so hey, we’re right
back to status quo.

Only it’s worse, because now Programmer C sees that B promised to
implement interface ‘foo’, and now she has to figure out where
interface ‘foo’ is defined (probably in Library D, which she may not
even have installed) and is even more confused than before. And I
speak as someone who is continually irritated by having to troll
through, say, cgi.rb or dbi.rb to discover there’s a method that does
what I want it to.

Honestly, I think 90% of what bugs me about Ruby library interfaces
would be fixed if RDoc would dump formatted data somewhere useful, the
way perldoc does. That way, you just type ‘man ’ or at least
‘rdoc ’ (or whatever, I’m not trying to suggest a specific
implementation here), and the class’ requirements are there for all to
see. This works well for Perl modules, and I think it’d work equally
well for Ruby.

-=Eric

···


Come to think of it, there are already a million monkeys on a million
typewriters, and Usenet is NOTHING like Shakespeare.
– Blair Houghton.

“Sean O’Dell” sean@celsoft.com writes:

It’s a LOT better. For you, who knows the contract, no, it’s the
same thing. For a person using the library trying to pass in an
unsuitable object, where the documentation is lacking (and that’s
MOST of the code out there, MOST code is completely undocumented) it
results in an extremely useful and time-saving error message.

It’s not a lot better to me, because it’s inconsistent. If, as you
propose, it should work one way in some cases (the person honors the
interface) and not in others (they don’t), then you’re right back
where you started!

That’s just how Ruby is, though. When you get an object, you never know what
you’re going to get with it. It’s completely open-ended. This is just one
way to clear the air. In exceptional cases like half-implemented interfaces,
you’re going to get the same old errors you always got. My feeling is, the
higher the quality of object you have, the better your errors. If you are
inheriting from a well-developed class, it will implement the interface
fully. If you inherited from a class that was written by a guy who had to
take a CompSci class on this way to earning an agricultural degree, you’re
probably going to see the old Ruby error you get when you pass a method an
unsuitable object.

Consider:

Library A asks for interface “foo”.
Library B does trickery to pretend to provide it, but only sorta
does so.
Programmer C uses Library B, only oops Library B forgot to
implement one method that A needs, so hey, we’re right
back to status quo.

Perhaps comment in the RCR that you don’t think interfaces should carry
through inheritance. I feel they should.

Only it’s worse, because now Programmer C sees that B promised to
implement interface ‘foo’, and now she has to figure out where
interface ‘foo’ is defined (probably in Library D, which she may not
even have installed) and is even more confused than before. And I
speak as someone who is continually irritated by having to troll
through, say, cgi.rb or dbi.rb to discover there’s a method that does
what I want it to.

How does Ruby work right now? Better than that?

Honestly, I think 90% of what bugs me about Ruby library interfaces
would be fixed if RDoc would dump formatted data somewhere useful, the
way perldoc does. That way, you just type ‘man ’ or at least
‘rdoc ’ (or whatever, I’m not trying to suggest a specific
implementation here), and the class’ requirements are there for all to
see. This works well for Perl modules, and I think it’d work equally
well for Ruby.

But extensions written in C would be tricky. I don’t think just fixing the
documentation mechanism is all there is to this. To me, the issue isn’t
precise documentation as much as just getting a heads up most of the time
when I’ve bad an unsuitable object to a method.

Sean O'Dell
···

On Wednesday 19 November 2003 03:57 pm, Eric Schwartz wrote:

“Sean O’Dell” sean@celsoft.com writes:

It’s not a lot better to me, because it’s inconsistent. If, as you
propose, it should work one way in some cases (the person honors the
interface) and not in others (they don’t), then you’re right back
where you started!

That’s just how Ruby is, though. When you get an object, you never
know what you’re going to get with it.

Exactly! And if you sorta-promise something, and you only
sorta-deliver on it, you get more confused than if you know you’re
promised nothing.

It’s completely open-ended. This is just one way to clear the air.

But it doesn’t clear the air, it only pretends to, and only in some
cases.

In exceptional cases like
half-implemented interfaces, you’re going to get the same old errors
you always got.

But with Ruby, it’s not exceptional to only half-implement interfaces.
In fact, it’s probably the default-- with duck typing, you only
implement enough to do the job. I haven’t seen enough other code to
know for sure, but I think you’re being biased by your C++/Java
background to expect complete interface implementations more often
than no.

Only it’s worse, because now Programmer C sees that B promised to
implement interface ‘foo’, and now she has to figure out where
interface ‘foo’ is defined (probably in Library D, which she may not
even have installed) and is even more confused than before. And I
speak as someone who is continually irritated by having to troll
through, say, cgi.rb or dbi.rb to discover there’s a method that does
what I want it to.

How does Ruby work right now? Better than that?

Yes, because at least right now Programmer C won’t waste all that time
trying to figure out what ‘foo’ is, whether or not Library B
implemented all of it, and whether that’s even relevant to the problem
at hand. She’ll dive right into library C’s code and check it out,
which will save her much more time getting to the right answer.

Honestly, I think 90% of what bugs me about Ruby library interfaces
would be fixed if RDoc would dump formatted data somewhere useful, the
way perldoc does. That way, you just type ‘man ’ or at least
‘rdoc ’ (or whatever, I’m not trying to suggest a specific
implementation here), and the class’ requirements are there for all to
see. This works well for Perl modules, and I think it’d work equally
well for Ruby.

But extensions written in C would be tricky.

They’re not tricky in Perl right now, and they’re used all the time.
Writing structured documentation isn’t hard, and in fact, Perl
libraries have some of the best documentation I’ve found, regardless
of the languages they’re written in.

I don’t think just fixing the
documentation mechanism is all there is to this. To me, the issue isn’t
precise documentation as much as just getting a heads up most of the time
when I’ve bad an unsuitable object to a method.

If I get an error in a call to a library, be it C, Java, Perl, or
Ruby, the first thing I do is look up where in my code it happened,
and then check the documentation of the method or class I’m using at
that point, and see if it documents what the problem is. Currently,
this is harder in Ruby than it needs to be, but when that’s fixed,
there will be a relatively brief period of time where documentation
patches will be flying around left and right, and then it’ll be a
doddle.

What you’re asking for (currently) misses the spirit and attitude of
the language, so it’s not surprising that people are reacting badly to
it. You might just as well head over to comp.lang.python and tell
them that any sensible language wouldn’t require significant
indentation, and create a PCR (or whatever it’s called) to “fix” that.

-=Eric

···

On Wednesday 19 November 2003 03:57 pm, Eric Schwartz wrote:

Come to think of it, there are already a million monkeys on a million
typewriters, and Usenet is NOTHING like Shakespeare.
– Blair Houghton.

On Wednesday 19 November 2003 03:57 pm, Eric Schwartz wrote:

> “Sean O’Dell” sean@celsoft.com writes:

> > It’s a LOT better. For you, who knows the contract, no, it’s the

> > same thing. For a person using the library trying to pass in an

> > unsuitable object, where the documentation is lacking (and that’s

> > MOST of the code out there, MOST code is completely undocumented) it

> > results in an extremely useful and time-saving error message.

>

> It’s not a lot better to me, because it’s inconsistent. If, as you

> propose, it should work one way in some cases (the person honors the

> interface) and not in others (they don’t), then you’re right back

> where you started!

···

On Thu, 20 Nov 2003, Sean O’Dell wrote:

That’s just how Ruby is, though. When you get an object, you never know what

you’re going to get with it. It’s completely open-ended. This is just one

way to clear the air.

But what Eric is correctly saying is that this doesn’t clear the air. It
pollutes it with potential lies.

To Glenn Vanderburg’s point, objective-c does interface checking in a way
that actually checks the interface–by grouping selectors into something
called an interface and then creating code that requires that the
selectors are implemented. This “interface Blah” idea you’ve proposed
isn’t any better than checking for class, which I believe 99.9+% of us
believe does not guarantee an interface at all.

Classes and modules are convenient groupings of behaviors. They are
neither declarations nor contracts that guarantee that such behaviors will
persist in the objects that inherit from/include them.

> Only it’s worse, because now Programmer C sees that B promised to

> implement interface ‘foo’, and now she has to figure out where

> interface ‘foo’ is defined (probably in Library D, which she may not

> even have installed) and is even more confused than before. And I

> speak as someone who is continually irritated by having to troll

> through, say, cgi.rb or dbi.rb to discover there’s a method that does

> what I want it to.

How does Ruby work right now? Better than that?

Yes. Because objects don’t lie about what their capabilities are. They
either respond_to? or they don’t. class, module, or your “interface” have
nothing to do with the “contract” of the object.

“Sean O’Dell” sean@celsoft.com writes:

It’s not a lot better to me, because it’s inconsistent. If, as you
propose, it should work one way in some cases (the person honors the
interface) and not in others (they don’t), then you’re right back
where you started!

That’s just how Ruby is, though. When you get an object, you never
know what you’re going to get with it.

Exactly! And if you sorta-promise something, and you only
sorta-deliver on it, you get more confused than if you know you’re
promised nothing.

It’s completely open-ended. This is just one way to clear the air.

But it doesn’t clear the air, it only pretends to, and only in some
cases.

But, as with Ruby’s dynamic typing, that’s good enough. Having strong typing
wasn’t the boom everyone thought it was. Ruby’s success is proof of that.
It follows then that an interface declaration system would work the same way.
It would just fine, and in those instances where it doesn’t, they’re
exceptions and the developer will just have to deal with it the way we deal
with dynamic typing issues now. The interface declaration system is just
another way to help them, it’s not a guarantee of perfection.

In exceptional cases like
half-implemented interfaces, you’re going to get the same old errors
you always got.

But with Ruby, it’s not exceptional to only half-implement interfaces.
In fact, it’s probably the default-- with duck typing, you only
implement enough to do the job. I haven’t seen enough other code to
know for sure, but I think you’re being biased by your C++/Java
background to expect complete interface implementations more often
than no.

This is why I feel the worry over half-implemented interfaces is unfounded.
This isn’t a static typing system, it’s just a declaration system.

Only it’s worse, because now Programmer C sees that B promised to
implement interface ‘foo’, and now she has to figure out where
interface ‘foo’ is defined (probably in Library D, which she may not
even have installed) and is even more confused than before. And I
speak as someone who is continually irritated by having to troll
through, say, cgi.rb or dbi.rb to discover there’s a method that does
what I want it to.

How does Ruby work right now? Better than that?

Yes, because at least right now Programmer C won’t waste all that time
trying to figure out what ‘foo’ is, whether or not Library B
implemented all of it, and whether that’s even relevant to the problem
at hand. She’ll dive right into library C’s code and check it out,
which will save her much more time getting to the right answer.

To you, it’s easier to dig around in someone else’s code than simply read an
error message? I guess I’m a bit out of touch with that method of
development. To me, digging around in the source code comes only when I
don’t understand what the error message is telling me.

What you’re asking for (currently) misses the spirit and attitude of
the language, so it’s not surprising that people are reacting badly to
it. You might just as well head over to comp.lang.python and tell
them that any sensible language wouldn’t require significant
indentation, and create a PCR (or whatever it’s called) to “fix” that.

What I think is that so many people have expounded for so long on dynamic
typing that it’s hard to admit that perhaps there’s a benefit to something
resembling type checking. Apparently there is too much invested in dynamic
typing to compromise.

I give up here, if that’s the case. I never close my mind to anything, and it
seems that most people here are simply closed to the idea of anything
resembling type checking.

Sean O'Dell
···

On Wednesday 19 November 2003 04:22 pm, Eric Schwartz wrote:

On Wednesday 19 November 2003 03:57 pm, Eric Schwartz wrote:

But it doesn’t clear the air, it only pretends to, and only in
some cases.
But, as with Ruby’s dynamic typing, that’s good enough. […] It
follows then that an interface declaration system would work the
same way. […]

An interface declaration system is useless unless it’s used. I
frankly don’t see ever using it in my libraries.

This is why I feel the worry over half-implemented interfaces is
unfounded. This isn’t a static typing system, it’s just a
declaration system.

The same is achieved through Ruby without an unnecessary declaration
system.

What I think is that so many people have expounded for so long on
dynamic typing that it’s hard to admit that perhaps there’s a
benefit to something resembling type checking. Apparently there is
too much invested in dynamic typing to compromise.

Incorrect.

I give up here, if that’s the case. I never close my mind to
anything, and it seems that most people here are simply closed to
the idea of anything resembling type checking.

Wrong. The reasons for not thinking that your proposal is useful
have been discussed several times. It is not a value-add. If there’s
going to be an interface declaration system, it should be (a) easy
to use, and (b) optionally enforce the contract. Your system doesn’t
do (b) and that makes it even worse because it’s got a nonzero
mental cost when the alleged promise is broken.

-austin

···

On Thu, 20 Nov 2003 10:17:36 +0900, Sean O’Dell wrote:

On Wednesday 19 November 2003 04:22 pm, Eric Schwartz wrote:

austin ziegler * austin@halostatue.ca * Toronto, ON, Canada
software designer * pragmatic programmer * 2003.11.19
* 22.56.08

But it doesn’t clear the air, it only pretends to, and only in
some cases.

But, as with Ruby’s dynamic typing, that’s good enough. […] It
follows then that an interface declaration system would work the
same way. […]

An interface declaration system is useless unless it’s used. I
frankly don’t see ever using it in my libraries.

Thus the optional component of the RCR.

This is why I feel the worry over half-implemented interfaces is
unfounded. This isn’t a static typing system, it’s just a
declaration system.

The same is achieved through Ruby without an unnecessary declaration
system.

No, it is not. Methods have no way of informing anyone of their needs
currently. Not without a lot of messy code.

What I think is that so many people have expounded for so long on
dynamic typing that it’s hard to admit that perhaps there’s a
benefit to something resembling type checking. Apparently there is
too much invested in dynamic typing to compromise.

Incorrect.

No, I think I got it right.

I give up here, if that’s the case. I never close my mind to
anything, and it seems that most people here are simply closed to
the idea of anything resembling type checking.

Wrong. The reasons for not thinking that your proposal is useful
have been discussed several times. It is not a value-add. If there’s
going to be an interface declaration system, it should be (a) easy
to use, and (b) optionally enforce the contract. Your system doesn’t
do (b) and that makes it even worse because it’s got a nonzero
mental cost when the alleged promise is broken.

Read the RCR. It’s entirely optional, and it’s extremely simple. Too simple,
as someone pointed out.

Sean O'Dell
···

On Wednesday 19 November 2003 07:56 pm, Austin Ziegler wrote:

On Thu, 20 Nov 2003 10:17:36 +0900, Sean O’Dell wrote:

On Wednesday 19 November 2003 04:22 pm, Eric Schwartz wrote:

I did. It adds no value over and above what Ruby already has and
uses. You can say that the error messages will be better, but I
disagree. How is saying that “I expect a Socket” any better than
saying “I don’t know how to deal with #accept”?

And that, Sean, is fundamentally why I disagree with this
proposal. It doesn’t add value, and it makes promises that it can’t
even come close to keeping.

-austin

···

On Thu, 20 Nov 2003 14:31:37 +0900, Sean O’Dell wrote:

On Wednesday 19 November 2003 07:56 pm, Austin Ziegler wrote:

Wrong. The reasons for not thinking that your proposal is useful
have been discussed several times. It is not a value-add. If
there’s going to be an interface declaration system, it should be
(a) easy to use, and (b) optionally enforce the contract. Your
system doesn’t do (b) and that makes it even worse because it’s
got a nonzero mental cost when the alleged promise is broken.
Read the RCR. It’s entirely optional, and it’s extremely simple.
Too simple, as someone pointed out.


austin ziegler * austin@halostatue.ca * Toronto, ON, Canada
software designer * pragmatic programmer * 2003.11.20
* 01.16.12