Optimization convention-solid-ocp

OCP (Open/Closed Principle). 확장에 열려 있고, 수정에 닫혀 있다. 새 기능은 기존 코드 수정 없이 추가한다.

install
source · Clone the upstream repo
git clone https://github.com/sunLeee/optimization
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sunLeee/optimization "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/reference/philosophy/solid/ocp" ~/.claude/skills/sunleee-optimization-convention-solid-ocp && rm -rf "$T"
manifest: .claude/skills/reference/philosophy/solid/ocp/SKILL.md
source content

convention-solid-ocp

@AW-013 | @docs/design/ref/team-operations.md § AW-013

OCP: 소프트웨어 엔티티는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다. 새 기능 추가 시 기존 코드를 변경하지 않고 새 코드를 추가한다.

VIOLATION 1: 새 포맷마다 기존 코드 수정

# VIOLATION: 새 데이터 포맷이 생길 때마다 load_data() 수정 필요
def load_data(file_path: str, format: str) -> pd.DataFrame:
    if format == "csv":
        return pd.read_csv(file_path)
    elif format == "parquet":
        return pd.read_parquet(file_path)
    elif format == "json":           # 새 포맷 추가 = 기존 코드 수정 — OCP 위반
        return pd.read_json(file_path)
    # excel 추가하려면 또 수정...
    raise ValueError(f"Unknown format: {format}")
# CORRECT: 새 포맷은 새 클래스로 추가 (기존 코드 무수정)
class DataLoader(ABC):
    @abstractmethod
    def load(self, file_path: str) -> pd.DataFrame: ...

class CSVLoader(DataLoader):
    def load(self, file_path: str) -> pd.DataFrame:
        return pd.read_csv(file_path)

class ParquetLoader(DataLoader):
    def load(self, file_path: str) -> pd.DataFrame:
        return pd.read_parquet(file_path)

# 새 포맷 추가 = 새 클래스만 추가 (기존 코드 무변경)
class ExcelLoader(DataLoader):
    def load(self, file_path: str) -> pd.DataFrame:
        return pd.read_excel(file_path)

VIOLATION 2: ADK tool 확장 시 기존 코드 수정

# VIOLATION: 새 에이전트 타입마다 orchestrator 수정
def run_agent(agent_type: str, context: dict) -> dict:
    if agent_type == "demand":
        return run_demand_analysis(context)
    elif agent_type == "regional":
        return run_regional_analysis(context)
    elif agent_type == "format":     # 추가할 때마다 여기 수정 — OCP 위반
        return run_format_report(context)
# CORRECT: 새 에이전트 = 새 클래스로 등록
class AgentRunner(ABC):
    @abstractmethod
    def run(self, context: dict) -> dict: ...

class DemandAgentRunner(AgentRunner):
    def run(self, context: dict) -> dict:
        return run_demand_analysis(context)

# 새 에이전트 = 새 클래스 추가만 (orchestrator 수정 없음)
class FormatAgentRunner(AgentRunner):
    def run(self, context: dict) -> dict:
        return run_format_report(context)

관련 CLAUDE.md 규칙

규칙위치내용
@AW-013@docs/design/ref/team-operations.md § AW-013OCP
@AW-019@docs/design/ref/team-operations.md § AW-019YAGNI — 확장 전 필요성 확인
@AW-012@docs/design/ref/team-operations.md § AW-012SRP — 함께 적용

참조

  • @docs/design/ref/team-operations.md § AW-013
  • @.claude/skills/convention-solid-srp/SKILL.md
  • @.claude/skills/convention-yagni/SKILL.md