그렇습니다. 일종의.
Newspeak 에는 정적 상태와 전역 상태가 없습니다. 이는 종속성에 액세스 할 수있는 유일한 방법은 명시 적으로 삽입하는 것입니다. 분명히 이것은 언어 또는 Newspeak의 경우 IDE 가 종속성 주입을 쉽게 해야 한다는 것을 의미합니다. 그렇지 않으면 언어를 사용할 수 없게됩니다.
따라서 언어는 DI를 위해 설계된 것이 아니라 DI의 필요성은 언어 디자인의 결과입니다.
정적 상태와 전역 상태가없는 경우 에테르에 "도달"하여 무언가를 끌어낼 수 없습니다. 예를 들어, Java에서 패키지 구조는 정적 상태입니다. 그냥 말할 수 java.lang.String
있고 String
수업이 있습니다. Newspeak에서는 불가능합니다. 작업하는 모든 것이 명시 적으로 제공되어야합니다. 그렇지 않으면 얻을 수 없습니다. 따라서 모든 것은 종속성이며 모든 종속성은 명시 적입니다.
당신은 문자열을 원하십니까? 글쎄, 당신은 먼저 stdlib
물건을 당신에게 String
수업 에 넘겨 달라고 부탁해야 합니다 . 아,하지만 어떻게 액세스 할 수 stdlib
있습니까? 글쎄, 당신은 먼저 platform
당신에게 stdlib
물건 을 건네 달라고 요청 해야 합니다. 아,하지만 어떻게 액세스 할 수 platform
있습니까? 글쎄, 당신은 먼저 다른 사람에게 당신에게 platform
물건 을 건네달라고 요청해야 합니다. 아,하지만 어떻게 다른 사람에게 접근 할 수 있습니까? 글쎄, 당신은 먼저 다른 사람에게 당신에게 물건을 건네달라고 요청해야합니다.
토끼 구멍이 얼마나 아래로 가나 요? 재귀는 어디에서 멈추는가? 실제로, 실제로. 멈추지 않습니다. 그렇다면 Newspeak에서 어떻게 프로그램을 작성할 수 있습니까? 글쎄, 엄밀히 말하면, 할 수 없습니다!
모든 것을 묶는 외부 실체가 필요합니다. Newspeak에서 해당 엔티티는 IDE입니다. IDE는 전체 프로그램을 봅니다. 서로 다른 조각들을 서로 연결할 수 있습니다. Newspeak의 표준 패턴은 응용 프로그램의 중앙 클래스에 접근자가라는 접근자가 platform
있고, Newspeak IDE는 프로그래밍에 필요한 일부 기본 String
클래스 인 Number
클래스, Array
클래스, 클래스, 등등.
응용 프로그램을 테스트하려면 더미 메서드가있는 클래스를 반환하는 메서드를 가진 platform
개체를 주입 할 수 있습니다 File
. 애플리케이션을 클라우드에 배포하려면 File
실제로 Amazon S3에서 지원 하는 클래스 의 플랫폼을 주입하십시오 . 크로스 플랫폼 GUI는 OS마다 다른 GUI 프레임 워크를 주입하여 작동합니다. Newspeak에는 실험적인 Newspeak-ECMAScript 컴파일러와 HTML 기반 GUI 프레임 워크가있어 완전한 GUI 기능을 갖춘 GUI 응용 프로그램을 기본 데스크탑에서 브라우저로 변경없이 다른 GUI 요소를 주입하여 이식 할 수 있습니다.
응용 프로그램을 배포하려는 경우 IDE는 응용 프로그램을 디스크상의 개체로 직렬화 할 수 있습니다. (소형 스몰 토크와는 달리 Newspeak는 이미지 외부 객체 직렬화 형식을 가지고 있습니다. 모든 의존성이 주입되기 때문에 전체 이미지를 가져갈 필요는 없습니다. IDE는 시스템의 어떤 부분이 애플리케이션 인지 정확히 알고 있습니다 따라서 응용 프로그램을 구성하는 객체 공간의 연결된 하위 그래프를 더 이상 직렬화하지 않습니다.)
이 모든 것은 단순히 객체 지향을 극단으로 가져 오는 것만으로 작동합니다. 모든 것이 가상 메서드 호출입니다 (Smalltalk 용어에서 "메시지 전송", Newspeak는 후손입니다). 수퍼 클래스 조회조차도 가상 메소드 호출입니다! 같은 것을 가지고
class Foo extends Bar // using Java syntax for familiarity
또는 Newspeak에서 :
class Foo = Bar () () : ()
자바에서이 이름이 생성됩니다 Foo
정적 글로벌 네임 스페이스를하고 찾아 Bar
정적 글로벌 네임 스페이스와 만드는 Bar
Foo
의 슈퍼 클래스입니다. 훨씬 더 역동적 인 Ruby에서도 글로벌 네임 스페이스에 정적 상수가 생성됩니다.
Newspeak에서 동등한 선언은 다음과 같은 의미를 갖습니다. 이름이 지정된 getter 메소드를 작성하고 이름이 지정된 메소드 Foo
를 호출하여 수퍼 클래스를 찾는 클래스를 리턴하게하십시오 Bar
. 참고 : 이것은 실행 가능한 Ruby 코드를 수퍼 클래스 선언으로 넣을 수 있는 Ruby와는 다르지만 클래스가 생성되고 해당 코드의 반환 값이 고정 된 수퍼 클래스가 되면 코드는 한 번만 실행 됩니다. 아니요. 메소드 Bar
는 모든 단일 메소드 조회 마다 호출됩니다 !
여기에는 몇 가지 중요한 의미가 있습니다.
- mixin은 기본적으로 아직 슈퍼 클래스를 모르는 클래스이므로 Newspeak에서 슈퍼 클래스는 동적 가상 메소드 호출이므로 알 수 없으므로 모든 클래스는 자동으로 믹스 인입니다. 믹스 인은 무료입니다.
내부 클래스는 클래스를 반환하는 메서드 호출 일 뿐이므로 외부 클래스의 하위 클래스에서 해당 메서드를 재정의 할 수 있으므로 모든 클래스는 가상입니다. 가상 수업은 무료로 제공됩니다.
class Outer {
class Inner { /* … */ }
}
class Sub extends Outer {
override class Inner { /* … */ }
}
뉴스 피크 :
class Outer = () (
class Inner = () () : ()
) : ()
class Sub = Outer () (
class Inner = () () : ()
) : ()
수퍼 클래스는 클래스를 리턴하는 메소드 호출이므로 외부 클래스의 서브 클래스에서 해당 메소드를 대체 할 수 있으며 수퍼 클래스에 정의 된 내부 클래스는 서브 클래스에서 다른 수퍼 클래스를 가질 수 있습니다. 클래스 계층 상속을 무료로 얻습니다.
class Outer {
class MyCoolArray extends Array { /* … */ }
}
class Sub extends Outer {
override class Array { /* … */ }
// Now, for instances of `Sub`, `MyCoolArray` has a different superclass
// than for instances of `Outer`!!!
}
뉴스 피크 :
class Outer = () (
class MyCoolArray = Array () () : ()
) : ()
class Sub = Outer () (
class Array = () () : ()
) : ()
마지막으로,이 토론에서 가장 중요한 것은 : (클래스에서 정의한 클래스를 제외하고는 분명히) 어휘를 둘러싼 클래스와 최상위 클래스 인 최상위 클래스의 메소드 만 호출 할 수 있기 때문입니다. 어떤 방법을 호출 할 수 없습니다 전혀 명시 적으로 주입을 제외한 것은 : 슈퍼 클래스 선언이 있기 때문에, 최상위 클래스는 그 방법이 호출 할 수있는 둘러싸는 클래스를 가지고 있지 않으며, 기본 이외의 수퍼 클래스를 가질 수 없습니다 메서드 호출, 그것은 분명히이 (슈퍼에 갈 수 있다수퍼 클래스) 및 어휘 포함 클래스로 이동할 수 없습니다. 이것이 의미하는 것은 최상위 클래스가 완전히 캡슐화되어 있으며 명시 적으로 주입 된 항목에만 액세스 할 수 있으며 명시 적으로 요청한 것만 주입됩니다. 다시 말해 최상위 클래스는 모듈입니다. 전체 모듈 시스템이 무료로 제공됩니다. 보다 정확하게 말하면 최상위 클래스는 모듈 선언이고 인스턴스는 모듈입니다. 따라서 파라 메트릭 모듈 선언과 일류 모듈을 무료로 제공하는 모듈 시스템을 얻을 수 있습니다.
이 주입을 모두 고통스럽게 만들기 위해 클래스 선언은 특별한 구조를 갖습니다. 두 가지 선언으로 구성됩니다. 하나는 클래스 생성자입니다 하지 구축 생성자 인스턴스 환경의 클래스 본문 실행을 구성하는 클래스를, 오히려 생성자입니다. Java와 같은 구문에서는 다음과 같습니다.
class Foo(platform) extends Bar {
Array = platform.collections.Array
String = platform.lang.String
File = platform.io.File
| // separator between class constructor and class body
class MyArray extends Array { /* … */ }
// Array refers to the method defined above which in turn gets it from the
// platform object that was passed into the class "somehow"
}
뉴스 피크 :
class Foo using: platform = Bar (
Array = platform collections Array
String = platform streams String
File = platform files ExternalReadWriteStream
) (
class MyArray = Array () () : ()
) : ()
Newspeak 프로그래머가 실제로 클래스를 보는 방식은 다음과 같습니다.
그래도 나는 그것을 정의하기 시작할 수 없습니다. 직접 가지고 놀아야합니다. Gilad Bracha는 모듈성을 포함하여 시스템의 다양한 측면에 대해 몇 가지 대화를 나 has습니다 . 그는 정말 긴 (2 시간) 대화 를했으며 첫 시간은 모듈화 이야기를 포함하여 언어에 대한 철저한 소개입니다. Newspeak Programming Platform의 2 장 에서는 모듈성을 다룹니다. Squeak – 당황 한자를위한 안내서 (일명 Newspeak-101) 에서 Newspeak 를 훑어 보면 시스템에 대한 느낌을 갖게됩니다. Newspeak by Example 은 기본 구문을 보여주는 라이브 문서입니다 (즉, Newspeak-on-ECMASCript 포트 내에서 실행 중이며 모든 코드 줄을 편집 할 수 있으며 모든 결과를 검사 할 수 있음).
그러나 실제로, 당신은 그것을 가지고 놀아야합니다. 그것은 모든 주류 언어와 대부분의 비 주류 언어와 는 매우 다르기 때문에 설명하기가 어렵습니다.