E11016: excessive module coupling - references too many external modules
What went wrong
Your module depends on too many EXTERNAL modules. This counts modules, not individual types - using 5 types from one module = 1 dependency.
Worked examples
Compilable examples demonstrating this error and the correct fix:
- ek9 -q 311 (What code quality checks does the EK9 compiler perform?)
Rationale
- Counts distinct external modules referenced
- Using 5 types from external.db = 1 module dependency
- Using 1 type from 5 different modules = 5 module dependencies
- Threshold: 10 external modules (11+ triggers error)
[REFACTORING PATTERN (Wrapper Module)] Before: my.app depends on stripe, paypal, square (3 modules) After:
my.payments module wraps stripe, paypal, square my.app depends on my.payments (1 module)
How to fix it
- Create wrapper modules that group related external dependencies
- Your core module depends on wrappers, not external modules directly
- Split module if it genuinely needs many unrelated external modules
Common causes
- Dependencies accumulated organically as features were added
- Missing abstraction layer to group related dependencies
See also
Examples
Every example is compiled by the EK9 compiler: the first fails exactly as captioned, the others fix it.
Fails with E11016: excessive module coupling - references too many external modules
bad/excessiveModuleCoupling.ek9
#!ek9 //Module-level error: this module references 11 external modules (threshold is 10) defines module error.e11016.bad references error.e11016.bad.eight::Type8 error.e11016.bad.eleven::Type11 error.e11016.bad.five::Type5 error.e11016.bad.four::Type4 error.e11016.bad.nine::Type9 error.e11016.bad.one::Type1 error.e11016.bad.seven::Type7 error.e11016.bad.six::Type6 error.e11016.bad.ten::Type10 error.e11016.bad.three::Type3 error.e11016.bad.two::Type2 defines class HighModuleCouplingClass dep1 as Type1: Type1() dep2 as Type2: Type2() dep3 as Type3: Type3() dep4 as Type4: Type4() dep5 as Type5: Type5() dep6 as Type6: Type6() dep7 as Type7: Type7() dep8 as Type8: Type8() dep9 as Type9: Type9() dep10 as Type10: Type10() dep11 as Type11: Type11() default operator ?
bad/externalone.ek9
#!ek9 defines module error.e11016.bad.one defines record Type1 mainValue as Integer: 0 default operator ?
bad/externaltwo.ek9
#!ek9 defines module error.e11016.bad.two defines record Type2 mainValue as Integer: 0 default operator ?
bad/externalthree.ek9
#!ek9 defines module error.e11016.bad.three defines record Type3 mainValue as Integer: 0 default operator ?
bad/externalfour.ek9
#!ek9 defines module error.e11016.bad.four defines record Type4 mainValue as Integer: 0 default operator ?
bad/externalfive.ek9
#!ek9 defines module error.e11016.bad.five defines record Type5 mainValue as Integer: 0 default operator ?
bad/externalsix.ek9
#!ek9 defines module error.e11016.bad.six defines record Type6 mainValue as Integer: 0 default operator ?
bad/externalseven.ek9
#!ek9 defines module error.e11016.bad.seven defines record Type7 mainValue as Integer: 0 default operator ?
bad/externaleight.ek9
#!ek9 defines module error.e11016.bad.eight defines record Type8 mainValue as Integer: 0 default operator ?
bad/externalnine.ek9
#!ek9 defines module error.e11016.bad.nine defines record Type9 mainValue as Integer: 0 default operator ?
bad/externalten.ek9
#!ek9 defines module error.e11016.bad.ten defines record Type10 mainValue as Integer: 0 default operator ?
bad/externaleleven.ek9
#!ek9 defines module error.e11016.bad.eleven defines record Type11 mainValue as Integer: 0 default operator ?
Fixed: Split the module by responsibility: each part depends on ten or fewer modules
good/core.ek9
#!ek9 defines module error.e11016.good references error.e11016.good.five::Type5 error.e11016.good.four::Type4 error.e11016.good.one::Type1 error.e11016.good.six::Type6 error.e11016.good.three::Type3 error.e11016.good.two::Type2 defines class CoreServices dep1 as Type1: Type1() dep2 as Type2: Type2() dep3 as Type3: Type3() dep4 as Type4: Type4() dep5 as Type5: Type5() dep6 as Type6: Type6() default operator ?
good/reporting.ek9
#!ek9 defines module error.e11016.good.reporting references error.e11016.good.eight::Type8 error.e11016.good.eleven::Type11 error.e11016.good.nine::Type9 error.e11016.good.seven::Type7 error.e11016.good.ten::Type10 defines class ReportingServices dep7 as Type7: Type7() dep8 as Type8: Type8() dep9 as Type9: Type9() dep10 as Type10: Type10() dep11 as Type11: Type11() default operator ?
good/externalone.ek9
#!ek9 defines module error.e11016.good.one defines record Type1 mainValue as Integer: 0 default operator ?
good/externaltwo.ek9
#!ek9 defines module error.e11016.good.two defines record Type2 mainValue as Integer: 0 default operator ?
good/externalthree.ek9
#!ek9 defines module error.e11016.good.three defines record Type3 mainValue as Integer: 0 default operator ?
good/externalfour.ek9
#!ek9 defines module error.e11016.good.four defines record Type4 mainValue as Integer: 0 default operator ?
good/externalfive.ek9
#!ek9 defines module error.e11016.good.five defines record Type5 mainValue as Integer: 0 default operator ?
good/externalsix.ek9
#!ek9 defines module error.e11016.good.six defines record Type6 mainValue as Integer: 0 default operator ?
good/externalseven.ek9
#!ek9 defines module error.e11016.good.seven defines record Type7 mainValue as Integer: 0 default operator ?
good/externaleight.ek9
#!ek9 defines module error.e11016.good.eight defines record Type8 mainValue as Integer: 0 default operator ?
good/externalnine.ek9
#!ek9 defines module error.e11016.good.nine defines record Type9 mainValue as Integer: 0 default operator ?
good/externalten.ek9
#!ek9 defines module error.e11016.good.ten defines record Type10 mainValue as Integer: 0 default operator ?
good/externaleleven.ek9
#!ek9 defines module error.e11016.good.eleven defines record Type11 mainValue as Integer: 0 default operator ?