Le 28/08/2012 15:38, Kevin Smith a écrit :
Apologies in advance for the length...
Don't. We're here to discuss as the mailing-list name suggests. And if what you need to say is long, so be it.

    A huge share of this complexity has been removed in recent
    discussions [1]. Conclusions seem to have reach consensus on
    es-discuss, but nothing has been officially accepted by TC39


As I understand it, the solution arrived at was to provide a (possibly updatable) collection of private name objects to the Proxy constructor and let the engine take care of the details. That sounds good, and good work!
Exactly. I'm glad there is one more fan of the proposal :-)

    What do you mean? Private name allow to do mixins without
    collision. It seems to reduce the complexity than increasing it in
    my opinion.


Unique (non-private) names offer mixins without collisions. But any general mixin utility will fail if the source object relies on privately named methods for its functionality:

(code snippet)

Neither the destination object nor the library function "mixin" has access to the private name, and therefore the privately named method will not get copied to the destination object, and the mixin will fail.

Clearly the solution above would be to use a unique name, instead of a private name.
Indeed.

But that begs the question: why do we need private, secured names at all? They complicate the object model without a compelling use case, as far as I can tell. If there are use cases, let's see them.
Private names enable easy encapsulation & code sharing at the same time (which is awkward at best nowadays). As a result of the current awkwardness, developer sacrifice encapsulation by using publicly accessible fields using the _field convention. I could name dozens of Node.js library doing that. And sometimes, developers use a private field while they shouldn't, but it makes their life easier, and abstraction leak, etc.

It all start because of a fundamental missing piece in the language that is the ability to add a private property to an object. Not socially private as per the _field convention. I mean actually private, enforced by the runtime.

In any situation where you want to *really* secure access to data or code, the ergonomics of your code is going to be the least of your worries.
I disagree. A good part of the work toward securing an application is reviewing it. The easier the review is, the less likely you are to leave holes behind. The ergonomics of the code is a security feature.

Security is just generally difficult, and that "soft-tissue" cost will have to be borne by the developer whether they use WeakMaps or private names or closures or whatever. Why complicate the object model, and in the process invalidate the current maxim that all properties are reflective, when the weight will still fall on the developer anyway?
I arrived on es-discuss at a time where private names had been decided to be the mecanism that answer all above-listed constraints. It seems to do the job. I have intuitive concerns about how to use them in large scale applications and preserve proper code sharing, but nothing concrete to either validate nor invalidate this intuition. In a nutshell, I'm wondering whether private names will be easy to use in complex cases. I'm not specifically against the idea of complicating the object model if the benefit is developers stopping _fields. I am open anyway to see if there is an idea that's alternative to private name and would solve all above constraints.

There is still time since no one has implemented private names (or symbols as it's their new name which I'm still not used to) yet.

David
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to