Anemic model
Data structures at the center, procedural logic around them.
An anemic model carries data while real business behavior lives somewhere else. A rich model keeps meaningful rules close to the state they protect. DDD does not require every object to become clever, but it strongly prefers that the business model actually owns business meaning.
If order status rules, refund rules, and shipment constraints all live in services, the domain model becomes a passive schema. That makes the code look object-oriented while behaving procedurally. Richer models often improve cohesion and make business rules easier to trust.
The real issue is not whether there are getters or services. The issue is where meaningful business decisions live. In an anemic model, entities often expose state while services perform all the important work. In a richer model, entities and value objects protect invariants and express behavior where it belongs.
DDD leans toward richer models when the domain is complex enough to justify them. But richness should be earned through real meaning, not through arbitrary method stuffing.
Data structures at the center, procedural logic around them.
Objects protect invariants and carry meaningful business behavior.
Does the model explain the domain, or do services explain everything for it?
Order state, ask whether part of that logic should live inside Order itself. The goal is not zero services. The goal is honest behavior ownership.
package org.javaomnibus.ecommerce.domain;
public final class Order {
private OrderStatus status;
public void markRefunded() {
if (status != OrderStatus.PAID) {
throw new IllegalStateException("Only paid orders can be refunded");
}
status = OrderStatus.REFUNDED;
}
}