What didn't work for me with --
   shindig.foo = function() {
     return { 'bar': ... };
   }();
... is that methods in the same namespace have to be all defined/implemented
in one file.

ie: it's fine if all gadgets.rpc.* is implemented in a file rpc.js, but not
fine when gadgets.util.* are implemented across different files/features
across core.util.dom, core.util.string, etc. When feature core.util pulls
all these files in, it will effectively stomp all the previously-defined
core.util.*.

The tendency has been to make libraries smaller and more focussed to what
they do, ie: this means breaking up features into sub-features. To do so, I
had to convert more-focussed core.util.[dom|string|...] to fully-defined
names. Unless the above style (with shindig.foo) doesn't have this
limitation (ie: can incrementally define more methods on top what has been
defined), I personally prefer the fully-defined names, for consistency.



2011/7/26 ๏̯͡๏ Jasvir Nagra <[email protected]>

> I don't have a strong preference either way although it's nice when
> reviewing code to have all the exported things exported once when they
> share
> a scope full of private helpers and other state.  It also helps convey when
> the setup of a particular part of the object graph is done.
> Eg.
>
> shindig.foo = (function() {
>  // ... all the helper functions and shared state ...
>  ...
>  return { bar: bar, baz: baz };
> }();
> // at this point I know from convention that shindig.foo is done being
> setup
> and will have just "bar" and "baz"
>
> vs.
>
> shindig.foo.bar = function() { ... }
> /// ... a lot of code later
> shindig.foo.baz = function() { ... }
>
> If the amount of code between shindig.foo and the return is long, I'd
> suggest another alternative that I think has the advantage of both:
>
> (function() {
>  // ... all the helper functions and shared state ...
>
>  shindig.foo = {
>    bar: bar,
>    baz: baz
>  }
> })();
>
> On Tue, Jul 26, 2011 at 2:19 PM, John Hjelmstad <[email protected]> wrote:
>
> > With the model we're using with exportJs, you actually can't as easily do
> > that or wrap "singleton"/namespaced items, unless you . exportJs(...) is
> > injected after the closure.
> >
> > function() {
> >  foo.bar.baz = function() { }
> > }();
> > exportJs("foo.bar", [foo,foo.bar], {baz:"baz"});
> >
> > Of course, you can if you also update the style guide to prepend window:
> >
> > function() {
> >  window.foo.bar.baz = function() { }
> > }();
> >
> > ...though that requirement seems a little awkward and verbose to me.
> >
> > --j
> >
> > On Tue, Jul 26, 2011 at 2:12 PM, Dan Dumont <[email protected]> wrote:
> >
> > > As mentioned by Paul before you can define:
> > >
> > > function(){
> > >   FooClass.prototype.method = function() { }
> > >  FooClass.prototype.method2 = function() { }
> > > }();
> > >
> > > to get a local scope.
> > >
> > > I think this makes it easier to audit what must be included in an
> export.
> > > And when you come up for air soon, maybe we can talk about AMD format
> and
> > > what that brings to the table.  :)
> > >
> > >
> > >
> > > From:   John Hjelmstad <[email protected]>
> > > To:     [email protected],
> > > Date:   07/26/2011 04:43 PM
> > > Subject:        Re: javascript readability..
> > >
> > >
> > >
> > > I still prefer status quo, as it reads more like a proper class to me,
> > > while
> > > being less verbose and centralizing the exported method definitions in
> a
> > > single place.
> > >
> > > As well, this question's corollary is whether to convert all
> instantiable
> > > objects to the form:
> > >
> > > FooClass.prototype.method = function() { }
> > > FooClass.prototype.method2 = function() { }
> > >
> > > ...from:
> > > FooClass = function() {
> > >  // private state
> > >  function method() { }
> > >  function method2() { }
> > >  return {
> > >    method: method,
> > >    method2: method2
> > >  };
> > > };
> > >
> > > On this note, I'm conflicted. I like having actual private state, but
> > > prototype-style is more efficient.
> > >
> > > Enough people have complained over time about each of the existing
> idioms
> > > though that I suppose I could go the other direction, if it's causing
> > > development trouble.
> > >
> > > --j
> > >
> > > On Tue, Jul 26, 2011 at 6:17 AM, Ryan J Baxter <[email protected]>
> > > wrote:
> > >
> > > > +1 As well, I think its easier to read.
> > > >
> > > > -Ryan
> > > >
> > > > Email: [email protected]
> > > > Phone: 978-899-3041
> > > > developerWorks Profile
> > > >
> > > >
> > > >
> > > > From:   Dan Dumont/Westford/IBM@Lotus
> > > > To:     [email protected],
> > > > Date:   07/26/2011 09:00 AM
> > > > Subject:        Re: javascript readability..
> > > >
> > > >
> > > >
> > > > +1
> > > >
> > > >
> > > >
> > > > From:   Paul Lindner <[email protected]>
> > > > To:     [email protected],
> > > > Date:   07/26/2011 02:51 AM
> > > > Subject:        javascript readability..
> > > >
> > > >
> > > >
> > > > Hi,
> > > >
> > > > I'm curious to know what people think about some of the idioms in the
> > JS
> > > > code you find in shindig.  There's an awful lot of stuff like this:
> > > >
> > > > shindig.foo = function(){
> > > >  //...
> > > >  var myFunction = function() {
> > > >     }
> > > >
> > > >  return {'foo': myFunction,
> > > >            'bar': function() {
> > > >               return 'bar';
> > > >            }};
> > > > }();
> > > >
> > > >
> > > > Just search for @member to see the various places.
> > > >
> > > > What would people think if we moved to fully defined names for
> > > > function/method definitions instead?
> > > >
> > > > You could still wrap this inside a closure if you wanted local scope:
> > > >
> > > > function() {
> > > >  shindig.foo.foo = function() {
> > > >     ...
> > > >  }
> > > >  shindig.foo.bar = function() {
> > > >     ...
> > > >  }
> > > > }();
> > > >
> > > > --
> > > > Paul Lindner -- [email protected] -- linkedin.com/in/plindner
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > >
> >
>

Reply via email to