I also prefer E, but as a close second to A.

I prefer A because in practice, your application modules evolve as your
application grows in scope and understanding. So a "usermodel" may
eventually also find it necessary to export utility functions like
validation. In this case, ABCD are all more flexible, not requiring you to
update all your requires everywhere.

WRT ABCD, I consider A idiomatic JavaScript, but there are unresolved
opinions like, do you capitalize factory functions or only constructors
where instanceof works. Tim's point about instanceof failing across npm
installs is accurate, but usually doesn't apply to application code (not
installed via npm). I would at least rule out B though, as your functions
should indicate in some way if they're intended to be used as a factory.

Summary: A for constructors or factories, E for everything else.

Cheers,
Adam Crabtree

On Thu, Jul 11, 2013 at 9:16 AM, Tim Caswell <[email protected]> wrote:

> Besides simplicity, there are several reasons to simply export a function
> that accepts config options and returns an instance of the module.
>
>  - Instanceof is dangerous and doesn't work cross-context or if you have
> more than one copy of a module (something that's very common in the default
> behavior or npm)
>  - If your module does one thing and one thing only, why expose that one
> thing as a property, just expose that one thing.
>  - Don't oversimplify it to the point of `var foo = module` because then
> you have this weird almost singleton (remember there can be multiple
> instances of your module in somebody's dependency tree)
>  - Pass in dependent interfaces in your setup function.
>
> For example, in jsgit I have an fs interface.  To create an instance of it
> for node, you would do:
>
>     var fs = require('simple-fs')('/my/base/path');
>
> Then later I have a git database module that creates a real git repo on
> the filesystem.  Instead of hard-coding a dependency on node's fs module, I
> pass in an instance of the git fs interface.  That way the same code can
> work in the browser.
>
>     var db = require('git-fs-db')(fs);
>
> Many of my modules are helper functions and so I export the function
> directly:
>
>     var pushToPull = require('push-to-pull');
>
> Then later when I have a codec implemented in push style, but I need to
> consume it pull style, I can do simply.
>
>     var parse = pushToPull(require('git-pack-parse'));
>
> Keep it simple.  As simple as possible, but no simpler.
>
>
>
> On Wed, Jul 10, 2013 at 5:39 PM, Andy W. <[email protected]> wrote:
>
>> I have seen a wide variety in different style for creating custom Node
>> modules. What style do you prefer or are there any best practices? I'm
>> fairly new to the Node community.
>>
>> var module = require('module');
>>
>> // A
>> var foo = new module.Foo();
>>
>> // B
>> var foo = module.foo();
>>
>> // C
>> var foo = module.createFoo();
>>
>> // D
>> var foo = Module.Foo.create();
>>
>>  --
>> --
>> Job Board: http://jobs.nodejs.org/
>> Posting guidelines:
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> You received this message because you are subscribed to the Google
>> Groups "nodejs" group.
>> To post to this group, send email to [email protected]
>> To unsubscribe from this group, send email to
>> [email protected]
>> For more options, visit this group at
>> http://groups.google.com/group/nodejs?hl=en?hl=en
>>
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "nodejs" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>>
>>
>
>  --
> --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>
> ---
> You received this message because you are subscribed to the Google Groups
> "nodejs" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>



-- 
Better a little with righteousness
       than much gain with injustice.
Proverbs 16:8

-- 
-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to