---
title: Do Not Ignore Embedded Struct Logic
impact: HIGH
impactDescription: ensures proper composition behavior
tags: composition, embedding, override, quality
---

## Do Not Ignore Embedded Struct Logic

When "overriding" methods of an embedded struct, ensure the embedded behavior is preserved unless explicitly intended otherwise.

**Incorrect (ignoring embedded logic):**

```go
type BaseService struct{}

func (s *BaseService) Save(entity any) error {
    s.Validate(entity)
    s.BeforeSave(entity)
    // ... actual save logic ...
    return nil
}

type UserService struct {
    BaseService
}

func (s *UserService) Save(user any) error {
    // Completely ignores BaseService.Save logic (validation, hooks, etc.)
    return s.repo.Save(user)
}
```

**Correct (explicitly calling embedded method):**

```go
type UserService struct {
    BaseService
}

func (s *UserService) Save(user *User) error {
    // Add user-specific preprocessing
    user.UpdatedAt = time.Now()
    
    // Call embedded struct implementation
    if err := s.BaseService.Save(user); err != nil {
        return err
    }
    
    // Add user-specific postprocessing
    return s.updateSearchIndex(user)
}
```

**When to skip:**
- Complete replacement is intentional
- Base implementation doesn't apply
- Document the reason clearly

**Tools:** Static Analysis, Code Review
