I took some advice early on that a good way to structure components in a 
nested TEA is to split each into 3 files; Types.elm, State.elm, and 
View.elm.

Now that I have more experience, I am not so sure that this is providing 
the best design. I feel that it may generally be a good principle to group 
together the definition of a Type with the functions that operate on that 
type, as the 2 are highly coupled (feature envy, all the implementation 
modules want to import Type).

Obviously not all functions that operate on a Type will be in the same 
module. It tends to be 'core' functions that make a type usable, and 
functions that generally only involve that Type and the basics, not other 
types. So Maybe supplies the Maybe type and a basic set of operations on 
it. I write plenty functions that use Maybe in my code, but that code does 
not get pulled up into the Maybe library.

I am just wondering if anyone has some thoughts on how to apply Parnas' 
principles of modular design to optimize the design of Elm modules with 
respect to said principles (https://en.wikipedia.org/wiki/David_Parnas)? 

Some candidate "rules of thumb":

Group Types and 'core' functions on them into the same module. Core 
functions are the basic set of functions that make a Type usable, and 
generally operate only on that Type and the types offered by the Elm core 
libraries.

A module that declares Type only cannot take responsibility for 
implementing some functionality, so modules like this should be avoided.

Never use exposing (..); always declare exactly what will be exposed.

Never import using exposing (..); always expose explicitly what you want or 
use the full name form Module.Type or Module.function

The exposed functions of a module should align well with its 
responsibilities. Group related responsibilities together. Consider 
splitting a module to group related responsibilities into better units. 

If allmost all exposed functions of a module use Types or functions in 
another module, there is a high degree of feature envy between the modules. 
Consider pulling some or all functionality into the calling module, or 
split it out into another module and combine together there.

-- 
You received this message because you are subscribed to the Google Groups "Elm 
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elm-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to