0307 지식의 관계

지식의 관계이다.

프로그래밍을 하면서 문득 생각이 드는 지식 A와 지식 B의 관계.

또는 지식 A와 지식 B를 프로그래밍하며 나타나는 관계.

아주 옛날부터 생각해오던 건데 마침 정리 끝나서 여기에 적는다.

뭐 이런 분류는 누군가 이미 해두지 않았을까? 이산수학책같은데 써있을 수도 있다.

하지만 아래는 '프로그래밍 개념'을 붙여놓았다는 점에서 의의가 있다.

관계 이름은 내가 임의로 지은 거란 점 참고바란다.

아래에서 언급되는 A와 B는 정보, 지식, 개념 뭐 그런걸 뜻한다.


  • 동등 (대체) 관계
    • 슬롯이 1개 있다면, A와 B 모두 배치할 수 있다. A를 빼고 대신 B를 넣는다.
    • A와 B는 완벽하게 대체된다.
    • 슬롯은 A와 B 각각의 상황에서 완벽하게 동작한다. 특정 상황에만 가능하거나, 불가능한 건 없다.
    • 적용 : (상속) 추상화 구조 (플랫폼, 렌더러 등...)
  • 순차 관계
    • A는 B 이전에 일어난다.
    • B는 A 다음에 일어난다.
    • A는 아무 조건 없이 일어날 수 있다.
    • B는 A가 일어난 후에만 일어날 수 있다.
    • 적용 : 절차지향 프로그래밍. Init을 한 후에 기능 사용하기.
  • 포함 관계
    • A에는 B가 포함된다.
    • B에는 A가 포함되지 않는다.
    • A의 내용은 무조건 B보다 크거나(=길거나) 같다.
    • 적용 : 컴포지션. 함수 일반화.
  • 의존 관계
    • B는 A가 필요하다. (=A의 정보가 필요하다)
    • A는 B가 필요없다.
    • C는 A와 B가 필요하다.
    • 대충 A -> B 가 있고 A -> C 가 있고 B -> C 가 있음
    • 적용 : DI(Dependency Injection) 구조.
graph LR
  A --> B
  B --> C
  A --> C
  • 공통 관계
    • A와 B의 교집합은 공집합이 아니다.
    • 적용 : 상속구조.
  • 제네릭 (일반성) 관계
    • A와 B에 대한 특정 연산들이 완벽하게 정의되어 있다.
    • 적용 : 템플릿. concepts. requires
      • int, float, bool은 전부 std::is_arithmetic_v<>가 true이다.
      • int, char는 둘다 std::is_integral_v<> 가 true이다.
  • 주체 - 행위 관계
    • A가 B를 한다. 할 수 있다.
    • A는 주체이다.
    • B는 행위이다.
    • B는 주체가 될 수 없다.
    • 적용 : 객체지향. 이 지식이 클래스로 구현되어야 하는가? 아니면 함수로 구현되어야 하는가?
      • 이 지식 / 정보가 주체가 될 수 있는가? 아니면 그냥 '사용되기만 하는' 개념 / 정보 덩어리인가?
  • 소비자 - 제품 관계
    • A는 B를 사용한다.
    • B는 사용될 뿐이다.
    • B는 정보가 저장되는 덩어리다.
    • A는 B의 정보를 사용한다.
    • 적용 : Data-Oriented design
  • 정의 의존 관계
    • A가 정의되면 B는 하나로 정의된다.
    • A가 정의되지 않으면 B는 무엇으로 정의될지 모른다.
    • 적용 : 템플릿 타입 추론. 특수화. SFINAE 개념.