<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Apr 29, 2019, 9:11 AM  <<a href="mailto:ken.dickey@whidbey.com">ken.dickey@whidbey.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Phil,<br>
<br>
Naming is important. I am always for better naming.<br>
<br>
asNumber, asString, asRope, .. I expect an #asDarker method to answer an <br>
object of class #Darker.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Notice that in my response to Juan I said that what I came up with was #asDarkerColor for precisely that reason.  As I think about it more, if we were to explicitly decide that Color is to be treated as an immutable object (which I'm in favor of), the issue I have with Color's definition of #darker (and other similar methods) is probably more that I'm not convinced that it is the strongest use of those valuable terms. (i.e. requesting a new instance vs instructing an existing one to do something to itself for other mutable cases which are likely to be more common).</div><div dir="auto"><br></div><div dir="auto">So I believe either we've used a strong term for a weak purpose or people will have to semantically overload it to use it elsewhere.  Again, I also like immutable classes but that doesn't mean I'm going to ignore the fact that 90%+ of the classes in the image *aren't* immutable.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
With respect to polymorphism, I will give a couple of examples where the <br>
code does not care about the shape or immutability of the underlying <br>
data:<br>
<br>
<br>
vvv=== "foo and bar don't care" ===vvv<br>
<br>
Feature require: #'Ropes'. "immutable strings"<br>
<br>
foo := [ :s | s asLowercase].<br>
  "both answer  'año Comé tomá Camión' "<br>
(foo value: 'año Comé tomá Camión') asString.<br>
(foo value: ('año Comé tomá Camión' asRope)) asString.<br>
<br>
(foo value: ('año Comé tomá Camión' asRope)) class. "--> FlatRope"<br>
<br>
bar := [ :v | v at: 2 ].<br>
"all answer $b"<br>
bar value: {#a. $b. 'c'.}.<br>
bar value: ('abc' asRope).<br>
bar value: 'abc'.<br>
bar value: #abc.<br>
<br>
^^^=== "foo and bar don't care" ===^^^<br>
<br>
Does this make sense?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Of course... both of the classes in your example are String-like things for the subset of methods they both respond to.  As long as they behave consistently for that subset of methods, and don't contradict other methods in the image, things are as they should be.  But I also wouldn't necessarily expect 'bar value: Morph new' to work or make any sense.</div><div dir="auto"><br></div><div dir="auto">Now, if you implemented a #darker method on one or both of those String-like classes which returned a darker (in a prose sense i.e. bleaker) version of the text contained, I would have a problem because now you're semantically overloading #darker.  (And that's ignoring that this new #darker method is probably also language specific (i.e. English, Spanish, whatever))  That's an issue: using generic terms for narrow and/or inconsistent purposes.</div><div dir="auto"><br></div><div dir="auto">This highlights both a strength and weakness of the Smalltalk approach: because the language has a very prose-like approach in a single namespace, what you call things becomes vital because any given class can throw a wrench into the works with bad (ambiguous, inconsistent or overloaded) names.</div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Cheers,<br>
-KenD<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Thanks,</div><div dir="auto">Phil</div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
</blockquote></div></div></div>