you can call it dogma.  i call it the the javascript-way of solving 
frontend-engineering problems, which is simpler and more practical for laymen 
than what i learned from cs-theory in school using c++/java.

its time we showed some pride in javascript (like the haskell/lisp/etc folks), 
and admit some of our 20+ year-old “hacks” are actually good design-patterns 
that rival and challenge traditional cs-teachings, instead of replacing them 
with bad-practices from other languages (*cough* operator-overloading *cough*).

> On Sep 14, 2017, at 4:26 PM, Andrea Giammarchi <andrea.giammar...@gmail.com> 
> wrote:
> 
> > please use normal method-calls instead, which are more maintainable
> 
> no, thanks.
> 
> 
> > WeakMap's implicit-garbage-collecting feature is error-prone, hard to 
> > validate with tests, and generally becomes unmaintainable over time.
> 
> no, thanks.
> 
> We were discussing patterns here, nothing to "please don't" and IMO, dogma 
> oriented rules are over-engineered anti-pattern too.
> 
> Let's not make this ML an awkward place for who wants to just learn or 
> explore JS language features, thanks.
> 
> 


> 
> On Thu, Sep 14, 2017 at 9:55 AM, kai zhu <kaizhu...@gmail.com 
> <mailto:kaizhu...@gmail.com>> wrote:
> inline
> 
>> ```js
>> class A {
>>   #random;
>>   get random() {
>>     return this.#random ||
>>           (this.#random = Math.random());
>>   }
>> }
>> 
>> 
>> // transpiled
>> var A = function (wm) {
>>   function A() {
>>     wm.set(this, {random: void 0});
>>   }
>>   Object.defineProperties(
>>     A.prototype,
>>     {
>>       random: {
>>         configurable: true,
>>         get: function () {
>>           return wm.get(this).random ||
>>                 (wm.get(this).random = Math.random());
>>         }
>>       }
>>     }
>>   );
>>   return A;
>> }(new WeakMap);
>> ```
> 
> 
> - overloaded getters/setters and Object.defineProperties are generally 
> over-engineered anti-patterns in javascript-programming
>       * please use normal method-calls instead, which are more maintainable
> 
> - WeakMap is an over-engineered anti-pattern in javascript-programming
>       * they are inferior to using a plain-object cache-dictionary in pretty 
> much every use-case.
>       * WeakMap's implicit-garbage-collecting feature is error-prone, hard to 
> validate with tests, and generally becomes unmaintainable over time.
> 
> ```javascript
> /*jslint node: true */
> 'use strict';
> 
> function LazyClass() {
>     this.cacheDict = {};
> }
> LazyClass.prototype.getRandomCached = function () {
>     this.cacheDict.random = this.cacheDict.random || Math.random();
>     return this.cacheDict.random;
> };
> LazyClass.prototype.clearCache = function () {
>     this.cacheDict = {};
> };
> 
> var lazyObject = new LazyClass();
> console.log(lazyObject.getRandomCached());
> console.log(lazyObject.getRandomCached());
> lazyObject.clearCache();
> console.log(lazyObject.getRandomCached());
> ```
> 
> <PastedGraphic-4.png>
> 
> 
> 
>> On Sep 13, 2017, at 9:32 PM, Andrea Giammarchi <andrea.giammar...@gmail.com 
>> <mailto:andrea.giammar...@gmail.com>> wrote:
>> 
>> > Maybe you mean "will behave more or less as if (except more efficiently)"?
>> 
>> no, I meant: it will transpiled into something using private WeakMaps.
>> 
>> I don't have any interest in talk nanoseconds for something unrelated to the 
>> topic though.
>> 
>> Best Regards
>> 
>> On Wed, Sep 13, 2017 at 1:54 PM, Alex Kodat <alexko...@gmail.com 
>> <mailto:alexko...@gmail.com>> wrote:
>> What do you mean by “will be transpiled through”? My understanding of the 
>> private property proposal is that private properties will be in fixed slots 
>> (inaccessible outside the class) in the object so there would be no WeakMap. 
>> Maybe you mean "will behave more or less as if (except more efficiently)"?
>> 
>> ----
>> Alex Kodat
>> 
>> From: es-discuss [mailto:es-discuss-boun...@mozilla.org 
>> <mailto:es-discuss-boun...@mozilla.org>] On Behalf Of Andrea Giammarchi
>> Sent: Wednesday, September 13, 2017 2:31 AM
>> To: Steve Fink <sph...@gmail.com <mailto:sph...@gmail.com>>
>> Cc: es-discuss@mozilla.org <mailto:es-discuss@mozilla.org>
>> Subject: Re: Lazy evaluation
>> 
>> > The properties already existed, so defineProperty shouldn't modify the 
>> > order IIUC
>> 
>> well, nope. the property existed in the prototype, not in the object.
>> 
>> anyway, I guess private properties, that are a possible solution, will be 
>> transpiled through a WeakMap so that most likely anything discussed in here 
>> won't make sense and the future code would look like the following
>> 
>> ```js
>> class A {
>>   #random;
>>   get random() {
>>     return this.#random ||
>>           (this.#random = Math.random());
>>   }
>> }
>> 
>> 
>> // transpiled
>> var A = function (wm) {
>>   function A() {
>>     wm.set(this, {random: void 0});
>>   }
>>   Object.defineProperties(
>>     A.prototype,
>>     {
>>       random: {
>>         configurable: true,
>>         get: function () {
>>           return wm.get(this).random ||
>>                 (wm.get(this).random = Math.random());
>>         }
>>       }
>>     }
>>   );
>>   return A;
>> }(new WeakMap);
>> ```
>> 
>> 
>> 
>> 
>> 
>> 
>> On Tue, Sep 12, 2017 at 10:39 PM, Steve Fink <mailto:sph...@gmail.com 
>> <mailto:sph...@gmail.com>> wrote:
>> My intent was only to respond to the performance analysis, specifically the 
>> implication that the only performance cost is in building the new hidden 
>> class. That is not the case; everything that touches those objects is 
>> affected as well.
>> 
>> Whether or not it's still the right way to accomplish what you're after, I 
>> wasn't venturing an opinion. I could probably come up with a benchmark 
>> showing that your WeakMap approach can be faster -- eg by only accessing the 
>> property once, but feeding the old and new versions of the object into code 
>> that executes many many many times (doing something that never looks at that 
>> property, but is now slightly slower because it isn't monomorphic). But I 
>> suspect that for practical usage, redefining the property *is* faster than a 
>> WeakMap.
>> 
>> If I were to look beyond for other solutions for your problem, then I'm just 
>> speculating. Can decorators populate multiple properties once the expensive 
>> work is done?
>> 
>> I really want to tell the VM what's going on. I guess if it knew that 
>> accessing a getter property would convert it into a value property, and that 
>> it was doing something that would access the getter, then it could know to 
>> use the outgoing shape instead of the incoming shape. If only it knew that 
>> the getter was pure... but that way lies madness.
>> 
>> Given that most code that would slow down would also trigger the lazy 
>> defineProperty(), it's really not going to be that much of an issue. Any 
>> access after the first will see a single shape.
>> 
>> meh. Just take the perf hit, with awareness that you may be triggering 
>> slight slowdowns in all users of that object. Or you might not. I doubt 
>> it'll be that big, since you'll probably just end up with an inline cache 
>> for both shapes and there won't be all that much to optimize based on 
>> knowing a single shape.
>> 
>> Oh, and I think I was wrong about property enumeration order. The properties 
>> already existed, so defineProperty shouldn't modify the order IIUC. (I am 
>> awful with language semantics.)
>> 
>> On 9/11/17 2:48 PM, Andrea Giammarchi wrote:
>> Steve it's not solved in any other way. Even if you use a WeakMap with an 
>> object, you gonna lazy attach properties to that object.
>> 
>> I honestly would like to see alternatives, if any, 'cause so far there is a 
>> benchmark and it proves already lazy property assignment is around 4x faster.
>> 
>> So, it's easy to say "it's not the best approach" but apparently hard to 
>> prove that's the case?
>> 
>> Looking forward to see better alternatives.
>> 
>> 
>> On Mon, Sep 11, 2017 at 8:15 PM, Steve Fink <mailto:sph...@gmail.com 
>> <mailto:sph...@gmail.com>> wrote:
>> On 9/11/17 5:36 AM, Matthew Robb wrote:
>> > I think it's irrelevant if internally VMs are not too happy. VMs are there 
>> > to solve our problems, not vice-versa ;-)
>> ​
>> This ^​ is very important for everyone to get on board with. Regardless the 
>> cost should be negligible as the shape is only changing at the point of 
>> delayed init. This will cause, for example V8, to deop the object and have 
>> to build a new hidden class but only the one time. I guess it would 
>> potentially be interesting to support an own property that when undefined 
>> would delegate up the proto chain.
>> 
>> (I don't know, but) I would expect it to be worse than this. The shape is 
>> changing at the point of delayed init, which means that if an engine is 
>> associating the possible set of shapes with the constructor (or some other 
>> form of allocation site + mandatory initialization), then that site will 
>> produce multiple shapes. All code using such objects, if they ever see both 
>> shapes, will have to handle them both. Even worse, if you have several of 
>> these delayed init properties and you end up lazily initializing them in 
>> different orders (which seems relatively easy to do), then the internal slot 
>> offsets will vary.
>> 
>> You don't need to bend over backwards to make things easy for the VMs, but 
>> you don't want to be mean to them either. :-)
>> 
>> Not to mention that the observable property iteration order will vary.
>> 
>> On Mon, Sep 11, 2017 at 7:09 AM, Andrea Giammarchi 
>> <mailto:andrea.giammar...@gmail.com <mailto:andrea.giammar...@gmail.com>> 
>> wrote:
>> 
>> Hi Peter.
>> 
>> Unless you have a faster way to do lazy property assignment, I think it's 
>> irrelevant if internally VMs are not too happy. VMs are there to solve our 
>> problems, not vice-versa ;-)
>> 
>> Regards
>> 
>> 
>> 
>> On Mon, Sep 11, 2017 at 11:54 AM, peter miller 
>> <mailto:fuchsia.gr...@virgin.net <mailto:fuchsia.gr...@virgin.net>> wrote:
>> Hi Andrea,
>> ```
>> class CaseLazy {
>>   get bar() {
>>     var value = Math.random();
>>     Object.defineProperty(this, 'bar', {value});
>>     return value;
>>   }
>> }
>> ```
>> 
>> Doesn't this count as redefining the shape of the object? Or are the 
>> compilers fine with it?
>> 
>> 
>> _______________________________________________
>> es-discuss mailing list
>> mailto:es-discuss@mozilla.org <mailto:es-discuss@mozilla.org>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss@mozilla.org <mailto:es-discuss@mozilla.org>
>> https://mail.mozilla.org/listinfo/es-discuss 
>> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> 
> _______________________________________________
> es-discuss mailing list
> es-discuss@mozilla.org <mailto:es-discuss@mozilla.org>
> https://mail.mozilla.org/listinfo/es-discuss 
> <https://mail.mozilla.org/listinfo/es-discuss>
> 
> 

_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to