Optimization convention-solid-isp

ISP (Interface Segregation 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/isp" ~/.claude/skills/sunleee-optimization-convention-solid-isp && rm -rf "$T"
manifest: .claude/skills/reference/philosophy/solid/isp/SKILL.md
source content

convention-solid-isp

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

ISP: 클라이언트가 사용하지 않는 메서드에 의존하도록 강제하지 말라. 하나의 큰 인터페이스보다 여러 작은 인터페이스가 낫다.

VIOLATION 1: 뚱뚱한 DataProcessor 인터페이스

# VIOLATION: 모든 처리기가 관련 없는 메서드까지 구현 강제
class DataProcessor(ABC):
    @abstractmethod
    def load_csv(self, path: str) -> pd.DataFrame: ...
    @abstractmethod
    def load_parquet(self, path: str) -> pd.DataFrame: ...
    @abstractmethod
    def save_csv(self, df: pd.DataFrame, path: str) -> None: ...
    @abstractmethod
    def save_parquet(self, df: pd.DataFrame, path: str) -> None: ...
    @abstractmethod
    def validate(self, df: pd.DataFrame) -> bool: ...
    @abstractmethod
    def visualize(self, df: pd.DataFrame) -> None: ...

# 읽기만 하는 ReportGenerator가 save_*, visualize 구현 강제
class ReportGenerator(DataProcessor):
    def load_csv(self, path: str) -> pd.DataFrame: ...
    def load_parquet(self, path: str) -> pd.DataFrame: ...
    def save_csv(self, ...) -> None: raise NotImplementedError  # 불필요
    def save_parquet(self, ...) -> None: raise NotImplementedError  # 불필요
    def validate(self, ...) -> bool: raise NotImplementedError  # 불필요
    def visualize(self, ...) -> None: raise NotImplementedError  # 불필요
# CORRECT: 인터페이스를 역할별로 분리
class DataReader(ABC):
    @abstractmethod
    def load(self, path: str) -> pd.DataFrame: ...

class DataWriter(ABC):
    @abstractmethod
    def save(self, df: pd.DataFrame, path: str) -> None: ...

class DataValidator(ABC):
    @abstractmethod
    def validate(self, df: pd.DataFrame) -> bool: ...

# 필요한 인터페이스만 구현
class CSVReader(DataReader):
    def load(self, path: str) -> pd.DataFrame:
        return pd.read_csv(path)

class ReportGenerator(DataReader):  # 읽기만 필요
    def load(self, path: str) -> pd.DataFrame:
        return pd.read_csv(path)

VIOLATION 2: ADK Agent 인터페이스 과부하

# VIOLATION: 모든 에이전트가 불필요한 메서드 구현
class BaseAgent(ABC):
    @abstractmethod
    def analyze(self) -> dict: ...
    @abstractmethod
    def visualize(self) -> None: ...   # 분석 에이전트에는 불필요
    @abstractmethod
    def export_excel(self) -> None: ... # 대부분 에이전트에 불필요
    @abstractmethod
    def send_email(self) -> None: ...   # 불필요
# CORRECT: 역할별 분리
class Analyzable(ABC):
    @abstractmethod
    def analyze(self) -> dict: ...

class Visualizable(ABC):
    @abstractmethod
    def visualize(self) -> None: ...

class DemandAgent(Analyzable):          # 분석만
    def analyze(self) -> dict: ...

class ReportAgent(Analyzable, Visualizable):  # 분석 + 시각화
    def analyze(self) -> dict: ...
    def visualize(self) -> None: ...

관련 CLAUDE.md 규칙

규칙위치내용
@AW-015@docs/design/ref/team-operations.md § AW-015ISP
@AW-012@docs/design/ref/team-operations.md § AW-012SRP — 단일 책임과 연계
@AW-020@docs/design/ref/team-operations.md § AW-020SoC — 관심사 분리

참조

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