Why does EK9 reject classes with too many service and data fields?

← Code Quality · Ref: Q861

A class with 3+ service fields AND 3+ data fields is a 'God Class'. Split into a data class (few services) and a service component.

THRESHOLD: >= 3 service fields AND >= 3 data fields.

THIS EXAMPLE

OrderHandler has 2 service fields + 3 data fields = OK (under threshold).

See Q856 for class vs component. See Q311 for quality checks.

Example

defines module qa.quality.avoid.god.class

  defines trait
    ValidatorService
      validate() abstract
    PricingService
      calculatePrice() abstract
    ShippingService
      ship() abstract

  defines class
    ValidatorImpl with trait of ValidatorService
      override validate()
        require true
    PricerImpl with trait of PricingService
      override calculatePrice()
        require true
    ShipperImpl with trait of ShippingService
      override ship()
        require true

  defines class

    OrderHandler
      //2 service fields (under threshold)
      validator ValidatorService: ValidatorImpl()
      pricer PricingService: PricerImpl()
      //3 data fields
      orderId <- "ORD-001"
      customerName <- "Steve"
      totalAmount <- 0

      processOrder()
        validator.validate()
        pricer.calculatePrice()

      default operator ?

  defines program

    GodClassDemo()
      stdout <- Stdout()
      handler <- OrderHandler()
      if handler?
        handler.processOrder()
        stdout.println("Order processed")

Common mistakes

E11025 — 3+ service fields AND 3+ data fields triggers E11025. Split into a data class and a service component. See ek9 -h E11025 for details.

Incorrect:

      //3 service fields (triggers threshold)
      validator ValidatorService: ValidatorImpl()
      pricer PricingService: PricerImpl()
      shipper ShippingService: ShipperImpl()

Correct:

      //2 service fields (under threshold)
      validator ValidatorService: ValidatorImpl()
      pricer PricingService: PricerImpl()
Other ways to ask this
  • What triggers E11025 EXCESSIVE_MIXED_RESPONSIBILITIES?
  • What is the God Class anti-pattern in EK9?
  • How many service fields can a class have alongside data fields?

Coming from another language?

Java: detected only by SonarQube. Python: no detection. Go: convention only. EK9: compile-time error preventing God Class.

Keywords: service, quality, E11025, god, responsibilities, mixed, field, class