E11016: excessive module coupling - references too many external modules

Category: E11xxx Code quality and IR analysis · Reported in phase: PRE_IR_CHECKS · Classification: EXCESSIVE_MODULE_COUPLING · All error codes

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

  1. Create wrapper modules that group related external dependencies
  2. Your core module depends on wrappers, not external modules directly
  3. 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

  • E11016: module coupling (external module count) (this error)
  • E11015: type coupling (external type count)

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 ?