Elm 언어를 통해 LSP 위반을 막는 방법: 타입 시스템을 활용하라!

by DD
3개월 전
조회수 10

LSP는 상속(Inheritance)에 국한된 원칙이 아니며, 서브타입(Subtype)의 동작 일관성을 강조한다.

Elm 언어는 불변성(Immutability)과 예외 부재(Absence of Exceptions)를 통해 구조적 LSP 위반(Structural LSP Violations)을 방지한다.

의미적 계약(Semantic Contracts)은 타입 시스템(Type System)을 통해 강화할 수 있으며, 유효하지 않은 값을 런타임(Runtime)에 방지한다.

SOLID 원칙의 유효성에 대한 논쟁이 커뮤니티에서 벌어지며, OOP와 FP의 차이점에 대한 논의가 진행된다.

LSP의 핵심: 서브타입(Subtype)의 동작 보장

LSP는 상속(Inheritance)에 대한 내용이 아니라, 서브타입(Subtype)이 슈퍼타입(Supertype)의 모든 동작을 보장해야 한다는 원칙이다. 즉, 인터페이스(Interface)를 사용하는 코드는 해당 인터페이스를 구현하는 모든 서브타입에 대해 동일하게 동작해야 한다. Elm 언어는 불변성(Immutability)과 예외 부재(Absence of Exceptions)를 통해 구조적 LSP 위반(Structural LSP Violations)을 방지하며, 컴파일러(Compiler)가 이를 보장한다.

Elm 언어의 LSP 준수(Compliance) 보장

Elm 언어는 불변성(Immutability)을 통해 객체 상태 변경(Object State Mutation)으로 인한 LSP 위반을 원천적으로 차단한다. 또한, 예외(Exception)가 없어 예상치 못한 오류 발생 가능성을 줄인다. 이러한 특징은 Elm에서 LSP를 준수하기 위한 노력이 필요 없도록 한다. 즉, 컴파일러(Compiler)가 구조적 LSP 위반(Structural LSP Violations)을 자동으로 방지한다.

의미적 계약(Semantic Contracts)의 중요성

Elm은 의미적 계약(Semantic Contracts)을 타입 시스템(Type System)에 통합하여 LSP 위반을 방지한다. 예를 들어, 유효하지 않은 할인율(Discount)을 나타내는 `Discount` 타입을 생성하는 것을 막아, 런타임(Runtime)에서 발생할 수 있는 오류를 컴파일 타임(Compile Time)에 방지한다. 이는 개발자가 의미적 제약 조건(Semantic Constraints)을 코드에 명시적으로 표현하도록 유도하여, 코드의 안정성을 높인다.

OOP와 FP의 LSP 적용 차이

OOP에서는 상속(Inheritance)과 가변성(Mutability)으로 인해 LSP 위반이 발생하기 쉽다. 반면, FP에서는 불변성(Immutability)과 타입 시스템(Type System)을 통해 LSP를 더 쉽게 준수할 수 있다. OOP는 캡슐화(Encapsulation)와 상속(Inheritance)을 통해 코드 재사용성(Code Reusability)을 높이지만, LSP 위반의 위험이 있다. FP는 불변성(Immutability)과 순수 함수(Pure Function)를 통해 코드의 예측 가능성(Predictability)을 높이고, LSP 준수를 용이하게 한다.

SOLID in FP: Liskov Substitution, or The Principle That Was Never About Inheritance