← Back to list

entity-design-skill
by pretodev
⭐ 0🍴 0📅 Jan 21, 2026
SKILL.md
name: Entity Design Skill description: "Create and modify domain entities following DDD principles with proper encapsulation, validation, and identity management.
- Creating new domain entities
- Modifying existing entities
- Adding business methods to entities
- Refactoring anemic models to rich domain models
- Implementing entity validation"
-
Choose the correct identity type:
GuidEntityfor client-side generated UUIDsSerialEntityfor database auto-increment IDsEntity<T>for custom ID types
-
Create public constructor with all required fields including:
id,createdAt,updatedAt,isActive- All domain-specific fields
-
Add creation factory (e.g.,
.create()) that:- Generates appropriate ID using
GuidEntity.newId()orSerialEntity.unsavedId - Sets
createdAtandupdatedAtto current time - Sets
isActive: trueby default - Initializes entity in valid state
- Generates appropriate ID using
-
Protect internal collections:
- Use private fields with underscore prefix
- Return
List.unmodifiable()from getters - Never expose mutable collections directly
-
Implement domain methods for state changes:
- Mutate entity state directly (entities are mutable)
- Always update
updatedAt = DateTime.now()when changing state - Enforce business rules before allowing changes
- Throw specific failure types (extend
EntityFailure)
-
Override
validate()to enforce invariants:- Check required fields
- Validate business rules that must always be true
- Throw specific
EntityFailuresubclass with clear messages
-
Create specific failure class extending
EntityFailure -
Override
propsfor debugging (include key domain properties)
Key principles
- Entities are mutable - change state directly in domain methods
- Always update
updatedAtwhen modifying state - Use public constructor for all fields (enables reconstitution from persistence)
- Validate via
validate()hook (called automatically by Entity base class) - Make illegal states unrepresentable through types and validation
- Prefer composition with Value Objects over complex attributes
- Keep entities focused on single aggregate root per bounded context
Anti-patterns to avoid
- Public setters (breaks encapsulation)
- Public mutable collections (allows external corruption)
- Empty
validate()(invariants not enforced) - Logic in getters (hidden side effects)
- Anemic entities without behavior
- Using
copyWith(treat entities as mutable, not immutable) - Not updating
updatedAton changes - Private-only constructors (can't reconstitute from database)
Example structure
class Order extends GuidEntity {
final String customerId;
final List<OrderItem> _items;
OrderStatus _status;
// Public constructor with all fields
Order({
required super.id,
required super.createdAt,
required super.updatedAt,
required super.isActive,
required this.customerId,
required List<OrderItem> items,
required OrderStatus status,
}) : _items = items.toList(),
_status = status;
// Creation factory
factory Order.create({required String customerId}) {
final now = DateTime.now();
return Order(
id: GuidEntity.newId(),
createdAt: now,
updatedAt: now,
isActive: true,
customerId: customerId,
items: [],
status: OrderStatus.draft,
);
}
// Protected collection with unmodifiable view
List<OrderItem> get items => List.unmodifiable(_items);
// Domain methods that enforce rules
void addItem(OrderItem item) {
if (_status != OrderStatus.draft) {
throw OrderFailure('Cannot add items to non-draft order');
}
_items.add(item);
updatedAt = DateTime.now();
}
void submit() {
if (!canBeSubmitted) {
throw OrderFailure('Order cannot be submitted');
}
_status = OrderStatus.submitted;
updatedAt = DateTime.now();
}
@override
void validate() {
if (customerId.isEmpty) {
throw OrderFailure('Customer ID cannot be empty');
}
}
@override
List<Object?> get props => [customerId, 'items: ${_items.length}'];
}
class OrderFailure extends EntityFailure {
OrderFailure(super.message);
}
Score
Total Score
50/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
○LICENSE
ライセンスが設定されている
0/10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
○タグ
1つ以上のタグが設定されている
0/5
Reviews
💬
Reviews coming soon