On Tue, Oct 16, 2012 at 4:06 PM, Yehuda Katz <span dir="ltr"><<a href="mailto:wycats@gmail.com" target="_blank">wycats@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Tue, Oct 16, 2012 at 6:26 PM, Mark S. Miller <span dir="ltr"><<a href="mailto:erights@google.com" target="_blank">erights@google.com</a>></span> wrote:<br></div><div class="gmail_quote"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

Getting the comments with a getter seems fine. Appending only the list of comments with a setter is bad, as it does not resemble storage semantics.</blockquote><div><br></div></div><div>Do you mean appending only <b>to</b> to list of comments?</div>
</div></blockquote><div><br></div><div>Yes.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="gmail_quote">

<div><br></div><div>`comment.post = post` has similar semantics to setting a foreign key in a SQL database, which will (obviously) update future requests for "all comments with post_id=<a href="http://post.id" target="_blank">post.id</a>". Bidirectionally linked one-to-many relationships are pretty common, and it's desirable for the relationships to remain in sync automatically. I don't think this is the right heuristic for moving to a method.</div>
<div class="im">

<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">I would expect well written setters to at least be idempotent, and well written getters to be side effect free.</blockquote>


<div> </div></div><div>comment.post = post is, of course idempotent. Setting it to the same value as it already has would have no effect.</div></div></blockquote><div><br></div><div>Good. In light of this, I reread the original post of your example. I had misunderstood it.</div>
<div><br></div><div>I strongly agree with those earlier posts saying that we should have some well thought out design guidelines for when to use an accessor vs a method, and that accessor usage should only be "storage-like". However, now that I understand it, I also agree that your example is storage-like enough to my eyes that I would like guidelines that permit it as a normal case. I do not yet a concrete suggestion other than "getters should be query-only" and "setters should be idempotent and not cause 'external' effects (other than notifying registered observers)." The key thing about your example is "What does external mean?" I don't yet have an answer to offer.</div>
<div><br></div><div>These guidelines are not prescriptive on any external JS community. But we need guidelines for APIs designed by TC39 and (hopefully eventually) by w3c.</div></div><div><br></div>-- <br>    Cheers,<br>    --MarkM<br>

</div>