저에게는 커플 링 문제이며 디자인의 세분성과 관련이 있습니다. 가장 느슨한 형태의 커플 링조차도 서로간에 의존성을 유발합니다. 그것이 수백에서 수천의 객체에 대해 수행된다면, 그것들이 모두 비교적 단순하더라도 SRP를 고수하고 모든 의존성이 안정적인 추상화로 흐르더라도 상관 관계 전체로서 추론하기가 매우 어려운 코드베이스를 생성합니다.
이론적 SE에서 자주 논의되지 않는 코드베이스의 복잡성을 측정하는 데 도움이되는 실질적인 사항이 있습니다. 마지막에 도달하기 전에 얻을 수있는 콜 스택의 깊이, 도달하기 전에 필요한 깊이 등 많은 자신감을 갖고 예외 상황을 포함하여 해당 수준의 호출 스택에서 발생할 수있는 모든 부작용을 이해하십시오.
그리고 필자의 경험으로는 콜 스택이 더 얕은 플랫 형 시스템은 추론하기가 훨씬 쉽다는 것을 알게되었습니다. 극단적 인 예는 구성 요소가 단순한 원시 데이터 인 엔티티 구성 요소 시스템입니다. 시스템은 기능 만 갖추고 있으며 ECS를 구현하고 사용하는 과정에서 수십만 줄의 코드로 구성된 복잡한 코드베이스가 기본적으로 수십 개의 시스템으로 비등 할 때 가장 쉬운 시스템이라는 것을 알게되었습니다. 모든 기능을 포함합니다.
기능이 너무 많은 것
이전 코드베이스에서 일할 때의 대안은 한 객체에서 다른 객체로 메시지를 전달하는 데 사용되는 일부 객체가있는 수십 개의 부피가 큰 시스템과 달리 수십에서 수천 개의 주로 객체가있는 시스템이었습니다 ( Message
예 : 자체 공용 인터페이스). 기본적으로 ECS를 구성 요소에 기능이 있고 엔터티에있는 각 구성 요소의 고유 한 조합이 고유 한 개체 유형을 생성하는 지점으로 되돌릴 때 유사하게 얻을 수 있습니다. 그리고 그것은 조그마한 아이디어를 모델링하는 객체의 끝없는 조합에 의해 상속되고 제공되는 더 작고 간단한 함수를 생성하는 경향이 있습니다 ( Particle
객체 대.Physics System
예). 그러나 실제로는 코드베이스에 실제로 무언가를 할 수 있고 무언가 잘못 할 수있는 것들이 너무 많기 때문에 광범위한 수준에서 발생하는 것을 추론하기 어려운 복잡한 상호 의존성 그래프를 생성하는 경향이 있습니다. - "데이터"유형이 아닌 관련 기능이있는 "객체"유형. 연관된 기능이없는 순수한 데이터로 사용되는 유형은 자체적으로 아무것도 할 수 없으므로 잘못 될 수 없습니다.
순수한 인터페이스는 "컴파일 타임 종속성"을 덜 복잡하게 만들고 변경 및 확장을위한 더 많은 호흡 공간을 제공하더라도 "런타임 종속성"과 상호 작용을 덜 복잡하게 만들지 않기 때문에이 포괄적 인 문제를 크게 도움이되지 않습니다. 클라이언트 객체는를 통해 호출 되더라도 구체적인 계정 객체에서 함수를 호출합니다 IAccount
. 다형성과 추상 인터페이스는 그 용도가 있지만 특정 지점에서 발생할 수있는 모든 부작용에 대해 추론하는 데 실제로 도움이되는 방식으로 사물을 분리하지는 않습니다. 이러한 유형의 효과적인 디커플링을 달성하려면 기능이 포함 된 항목이 훨씬 적은 코드베이스가 필요합니다.
더 많은 데이터, 적은 기능
따라서 ECS 접근 방식을 완전히 적용하지 않더라도 수백 개의 객체를 대량의 시스템을 사용하여 원시 데이터로 변환하고 더 조밀하게 설계하여 모든 것을 제공하므로 매우 유용합니다. 기능. "데이터"유형의 수를 최대화하고 "개체"유형의 수를 최소화하므로 시스템에서 실제로 잘못 될 수있는 장소 수를 최소화합니다. 최종 결과는 복잡한 종속성 그래프가없고 시스템과 구성 요소 간, 그 반대의 구성 요소와 다른 구성 요소의 구성 요소가없는 매우 "평평한"시스템입니다. 기본적으로 훨씬 더 많은 원시 데이터와 훨씬 더 적은 추상화로 코드베이스의 기능을 주요 영역, 주요 추상화로 중앙 집중화하고 평탄화하는 효과가 있습니다.
복잡한 것 자체가 독립적 인 반면 30 개의 단순한 것들은 서로 연관되어 있다면 30 개의 단순한 것들은 1 개의 복잡한 것보다 추론하기가 반드시 더 간단하지는 않습니다. 따라서 제 제안은 실제로 객체 간의 상호 작용에서 복잡한 것을 더 큰 부피의 객체로 옮기고 대량의 분리를 달성하기 위해 다른 것과 상호 작용할 필요가없는 대량의 객체로, 전체 "시스템"(모놀리스 및 신의 객체가 아닌) 200 개의 메서드가있는 클래스가 아니라 최소한의 인터페이스를 가지고 있음에도 불구하고 a Message
또는 a 보다 상당히 높은 수준의 클래스 Particle
). 보다 평범한 오래된 데이터 유형을 선호합니다. 더 많이 의존할수록 커플 링이 줄어 듭니다. 그것이 SE 아이디어와 모순 되더라도, 그것이 실제로 많은 도움이된다는 것을 알았습니다.