축하합니다! 당신은 방금 출발했을 때 세계 반대편에 도착하여 프로그래밍 언어 / 타입 시스템 지구를 우회했습니다. 다이나믹 언어 / 프로토 타입 기반 오브젝트 랜드의 경계에 도착했습니다!
많은 동적 언어 (예 : JavaScript, PHP, Python)는 런타임에 객체 속성을 확장하거나 변경할 수 있습니다.
이것의 극단적 인 형태는 Self 또는 JavaScript 와 같은 프로토 타입 기반 언어 입니다. 그들은 엄격하게 말해서 수업이 없습니다. 상속을 사용하여 클래스 기반의 객체 지향 프로그래밍처럼 보일 수 있지만 Java 및 C #과 같이 더 명확하게 정의 된 클래스 기반 언어에 비해 규칙이 크게 완화됩니다.
PHP와 Python과 같은 언어는 중간에 존재합니다. 규칙적이고 관용적 인 클래스 기반 시스템이 있습니다. 그러나 JavaScript에서는 찾을 수없는 몇 가지 제한 사항 (예 : "내장 유형 제외")이 있지만 런타임에 객체 속성을 추가, 변경 또는 삭제할 수 있습니다.
이 역동 성의 큰 단점은 성능입니다. 언어가 얼마나 강하거나 약한 유형인지 또는 기계 코드로 얼마나 잘 컴파일 될 수 있는지 잊어 버리십시오. 동적 객체는 단순한 구조체가 아닌 유연한지도 / 사전으로 표시되어야합니다. 이것은 모든 객체 액세스에 오버 헤드를 추가합니다. 일부 프로그램은이 오버 헤드를 줄이기 위해 많은 시간을 투자하지만 (예 : 파이썬의 팬텀 크 워그 할당 및 슬롯 기반 클래스), 추가 오버 헤드는 일반적으로 코스 및 입학 비용에 필적합니다.
디자인으로 돌아가서 클래스의 하위 집합에 동적 속성을 부여하는 기능을 접목하고 있습니다. ㅏProduct
는 가변 속성을 가질 수 있습니다. 아마 Invoice
또는 의지 Order
와 할 수 없었습니다. 가는 것은 나쁘지 않습니다. 엄격하고 규칙적인 언어 및 유형 시스템을 유지하면서 필요한 곳에서 변형 할 수있는 유연성을 제공합니다. 단점은 이러한 유연한 속성을 관리하는 책임이 있으며, 더 많은 고유 속성과 약간 다른 메커니즘을 통해 처리해야 할 수도 있습니다. p.prop('tensile_strength')
보다는 p.tensile_strength
, 예를 들어, 및 p.set_prop('tensile_strength', 104.4)
보다는p.tensile_strength = 104.4
. 그러나 저는 파스칼, Ada, C, Java 및 심지어 비표준 속성 유형에 대해 이러한 getter-setter 액세스를 사용하는 동적 언어로 많은 프로그램을 작업하고 빌드했습니다. 이 접근법은 분명히 실행 가능합니다.
기본적으로 정적 유형과 매우 다양한 세계 간의 긴장은 매우 일반적입니다. 데이터베이스 스키마를 설계 할 때 특히 관계형 및 사전 관계형 데이터 저장소에 대해 유사한 문제가 종종 발생합니다. 때로는 상상 된 모든 변형의 합집합을 포함하거나 정의하기에 충분한 유연성을 포함하는 "슈퍼 행"을 생성 한 다음 해당 필드에 제공되는 데이터를 채워서 처리합니다. 워드 프레스 wp_posts
테이블 , 예를 들어, 같은 필드가 comment_count
, ping_status
, post_parent
및 post_date_gmt
일부 상황에서 흥미로운 것을, 연습에 자주 비워 갈 것이다. 또 다른 접근 방식은 매우 여분입니다. 표준화 와 같은 테이블 wp_options
처럼 많이, 당신의Property
수업. 좀 더 명시적인 관리가 필요하지만 그 안에있는 항목은 거의 비어 있지 않습니다. 객체 지향 및 문서 데이터베이스 (예 : MongoDB)는 속성 변경을 처리하는 데 더 많은 시간을 할애하는 경우가 많습니다. 속성을 원하는대로 작성하고 설정할 수 있기 때문입니다.