2009-05-18 4 views
41

프로토 타입 기반 OO 대신 클래스 기반 OO가 인기가있는 이유는 무엇입니까? 그들은 학교에서 후자를 가르치고 있습니까? Javascript는 프로토 타입 기반이지만 대부분의 사람들은 주로 기능적으로 사용하거나 클래스 기반 시스템을 에뮬레이트하려고하는 프레임 워크를 사용합니다.프로토 타입 기반 OO가 클래스 기반 OO보다 갖는 이점은 무엇입니까?

나는 Sun이 Self에 대한 약간의 연구를했다는 것을 알고있다. 프로토 타입 기반의 oo에 대한 다른 지식의 원천이 있는가? 자기 학습을 위해 접근 가능한 무언가가 바람직합니다. Prototype-Based Programming: Concepts, Languages and Applications 사람이 그것을 읽은

:

나는 게시 된 논문을 포함하는 책을 발견?

-

그래서 나는 대부분의 준 대답에 대한 현상금을했다. 아직도, 나는 정말로 만족하지 않는다. 나는 훨씬 더 기술적 인 대답을 듣고 싶었을 것이다. 어쩌면 나는 자신을 잘 설명하지 않았을 것이다.

+0

이 – pramodc84

+0

논쟁이하는 https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model : 그들은 읽기 정말 긴하지만, 가치, 당신을 마음 여기서 끝나지 않아? 나는 흥미로운 논문을 요약한다. 요컨대, 클래스 기반의 세계관은 프로토 타입보다 더 결함이 있습니다. 그래서 조심해야합니다.요약은 다음과 같습니다. http://carnotaurus.tumblr.com/post/3248631891/class-based-javascript-or-not – CarneyCode

+0

클래스 기반 OO는 역사적으로 OO 프로토 타입 기반이되었으며, 결과적으로 이제는 세계에서 대다수의 코드가 존재합니다. Javascript가 출현 할 때까지 개념을 바꾸는 것은 비실용적 인 것으로 입증되었습니다. 학교에서 스타일로 작성된 코드의 양에 비례하여 프로토 타입 기반 OO를 세계 곳곳에서 가르 칠 것으로 기대합니다. 아래 답변 중 일부는 프로토 타입 기반 OO와 동적 상속을 결합합니다. – blueberryfields

답변

23

프로토 타입 체인의 장점은 프로토 타입 체인을 쉽게 조작 할 수 있기 때문에 잠재적으로 멋진 메타 프로그래밍을 간단하게 허용한다는 것입니다. 이것은 메타 프로그래밍이 99 %의 잘못된 대답이기 때문에 다소 학문적 인 이점입니다. 예를 들어, 오프라인 일 때 로컬 SQLite 백업과 프로토 타입 스왑을 통해 온라인 일 때 REST 기반 서버 스토어간에 투명하게 전환되는 특수 DSL로 Javascript Key-Value Observer 스타일 데이터 조작 레이어를 가질 수 있습니다. 이렇게하는 것이 최선의 방법인지는 모르지만 늦게까지 생각해 낼 수있는 최선의 방법입니다. 이런 일종의 간접 지정은 일단 여러 레이어를 사용하기 시작하면 디버그하기가 쉽지 않기 때문에 프로젝트 코드에서 일반적으로하고 싶은 일은 아니지만 라이브러리에 보관하면 나쁘지 않습니다.

덜 도움이되는 또 다른 이점은 자신의 클래스 시스템을 설계 할 수 있다는 것입니다. 나는 다소 덜 도움이된다고 말하는데, 다소간의 모든 자바 스크립트 라이브러리는 '클래스'가 어떻게 조합되는지에 대한 약간의 양립 불가능한 접근법을 가지고 있기 때문이다.

누가 상속 모델을 누가 그 모델에 구현 된 언어와 혼합하고 있는지 답장하는 사람들이 많이 있습니다. 자바 스크립트가 동적이고 약하게 타입이 지정되어 도구가 어렵다는 사실은 프로토 타입 언어와 아무 관련이 없습니다.

+0

Javascript의 구현을 사용하면 프로토 타입 객체를 전환 할 수 없습니다. SQLite에서 REST 로의 실제 프로토 타입 객체 자체의 변경 일 뿐이니까? –

+0

예. save() 함수를 통해 모든 속임수를 쓰고 있다면 SQLite save()를 REST save()로 바꿉니다. >>> rest_save = function() {return "REST"} >>> sql_save = 함수() {창 "SQL"} >>> 저장 = 함수() {/ * 초기화 등 * /} >>> Storage.prototype.save = rest_save >>> my_obj = 새로운 스토리지() >>> my_obj.save() 'REST' >>> Storage.prototype.save = sql_save 함수() >>> my_obj.save() "SQL"은 이 용이 전체 개체에 대해 수행 모든 주요 js 라이브러리에서 사용할 수있는 업데이트/병합 기능을 사용합니다. "사실"교환은 아니지만 유용 할 수 있습니다. –

+10

나는이 주석에 개행 문자가 부족하다는 것을 싫어한다. –

12

나는 이유가 여기에 대한 정확한 이유를 알고 있지만하지 않는

내가 사용할 수, 동적 정적 대, 클래스가 객체의 정적 정의이기 때문에이 주장은 같은 생각 오브젝트에서 기대할 수있는 것을 쉽게 알 수 있으며 오브젝트에서 다른 멤버와 메소드가 무엇인지 쉽게 알 수 있기 때문에 언어를 툴링하여 적절한 인텔리 센스 지원과 문서화를 할 수 있습니다. 또 다른 패러다임은 객체에 표시되지 않는 클래스의 비공개 멤버를 선언하면 프로토 타입 패러다임에서이를 수행 할 수 없습니다.

프로토 타입 패러다임은 멋지지만 객체의 메서드와 멤버에 대한 정보를 제공 할 수 없기 때문에 툴링이 어려워지며 동적 타이핑 프로그래밍에 더 적합합니다.

+2

이 켜져 있습니다. 정적 언어는 컴파일러가 무엇을 기대/금지 하는지를 알 수 있도록 클래스를 필요로합니다. 동적 인 언어는 그것들을 필요로하지 않으므로 프로토 타입을 사용하는 것이 더 편리합니다. – Javier

+0

동의. 그러나 Javascript는 프로토 타입 기반 상속을 기본적으로 지원하지만 클로저를 사용하여 일부 OO 기능을 구현하는 것은 어렵지 않습니다. 예를 들어 개인 메소드와 변수를 실제로 쉽게 보호 할 수 있습니다. 더스틴 디아즈 (Dustin Diaz)의 주제에 관한 책은 최고 수준이다. "Pro Javascript Design Patterns"(http://jsdesignpatterns.com/) 이러한 동적 언어를위한 툴링은 어렵다. Javascript와 같은 유연한 언어를 사용하면 개발 환경에서 사용중인 상속 패턴을 파악하기가 어렵습니다. –

+4

"프로토 타입 기반은 객체의 메서드와 멤버에 대한 정보를 제공 할 수있는 기능이 부족합니다"라는 견해에 동의하지 않습니다. 클래스 기반에 반대하여 런타임에 쉽게 열거됩니다. – Thevs

18

당신이 사람들의 장단점을 그들의 인기에 대한 설명으로 지적하고자한다면, 나는 당신이 기술적으로 매우 일반적인 몇 가지 이유로 오류가 있다고 생각합니다. 품질의 절대 척도와 관련이있다.

Java가 고전적인 OO를 사용하고 Sun이 수백만 달러를 들여 Java의 대중성을 구축하는 데 많은 시간을 투자하여 기업에 성공적으로 사용된다는 사실을 알게 되었기 때문에 사실은 훨씬 수준급이 아닙니다. 대학 및 고등학교 AP 시험에서 널리 가르칩니다.

프로토 타입/클래식 OO는 아이디어를 구성하는 여러 가지 방법 일뿐입니다. 기본으로 지원하지 않는 언어 (PythonJava이 염두에두고 다른 언어는 JavaScript)로 구현할 수 있습니다.

클래식 OO에서는 객체에 대한 클래스의 추상 계층을 정의한 다음 실제로 해당 클래스의 인스턴스로 작업합니다. 프로토 타입 상속에서는 객체 인스턴스의 계층 구조를 만듭니다. 두 캠프에서 모두 이단 적이라는 생각이 들더라도 두 언어를 섞을 수없는 이유는 없습니다 ...

+1

프로토 타입 기반 OO를 개발자에게 더욱 힘들게 만드는 것이 있는지 궁금합니다. 그리고 주로 복잡한 소프트웨어를 만들 때 어떤 종류의 문제가 있는지 알고 싶습니다. 나는 인기가 패러다임의 질에 기반을두고 있다고 말하지는 않지만, 그 이유는있을 수있다. – egaga

+0

고전적인 OO가 무엇인지 궁금합니다. Smalltalk & CLOS (protoptype-like) 또는 Simula (Java 객체 기반과 비슷합니다)입니까? 어떤 모델이 클래식인가요? – Thevs

+0

죄송합니다, 고전적으로 말하자면, 저는 수업 기반이었습니다. –

3

차이점은 역동적 인 (프로토 타입의) 언어가 제공하는 것입니다. . Javascript는 LISP와 마찬가지로 프로그래머에게 거의 무한한 힘을줍니다. 이 힘은 프로그래머의 책임과 자신감의 수준에 의해서만 제한됩니다. 따라서 토론은 그 자체로 정체되어 있습니다. 정적 타이핑과 유형없는 타이핑이 동일합니다.프로그래밍 능력과 자제력이 충분히 강하다고 생각한다면 프로토 타입 스타일을 선택하십시오.

재능은 그가 (읽기 : 클래스 기반) 할 수있는 작업을 수행합니다, 천재는 자신이 원하는 것을 수행 한 유명한 말 의역

(읽기 : 프로토 타입 기반).

+1

하지만 당신이 말하는이 권력은 무엇입니까? 그게 내가 따라 온거야. – egaga

+4

대부분 발에서 자신을 쏠 수있는 힘. 정적 타이핑 (그리고 유사하게 클래스)은 프로그래머를 그 자신으로부터 구하기위한 시도이다. 그것은 고의로 위험한 일을하기가 더 어렵게 만드는 언어입니다. 정적이 아닌 타이핑과 프로토 타입 기반의 객체 지향 시스템을 사용하면 놀라운 일을 간단하게 수행 할 수 있습니다. 그러나 마찬가지로 여러분은 정말 끔찍한 일을 할 수 있습니다. – Orclev

+2

프로그램에서 상상할 수있는 구조를 만드는 것은 힘입니다. 그것은 당신의 환상에 의해서만 제한됩니다. 때로는 환상이 충분히 아플 수도 있습니다 :) – Thevs

10

이 질문은 나에게 흥미로웠다. 그래서 나는 원래의 논문을 읽었다. 스몰 토크 세계에서 1980 년대 중반에 시작된 것처럼 보였으 나 마침내 Self의 설립 교장 중 하나가되었습니다. 훨씬 나중에 자바 스크립트도 그것을 채택했습니다.

논문에 제시된 논거는 배우기가 더 쉽다는 것입니다. 실제로 학습 이외의 기술적 혜택은 없습니다. 이 논문은 모두 수업 기반 언어만큼이나 표현력이 뛰어나지 만 배우기가 훨씬 쉬워 진다고 설명합니다. 사람들은 자연스럽게 추상보다는 사물에 대해 구체적으로 생각합니다. 우리는 동물원에서 본 코끼리를 생각합니다. 일반적인 "코끼리"는 아닙니다. 우리가 다른 코끼리를 볼 때, 우리는 그것들을 첫 번째 코끼리와 다른 점으로 분류합니다. 프로토 타입 기반 언어는 이러한 생각을 용이하게합니다. 차별화 된 프로그래밍으로 생각하십시오.

언어로 사용하는 이유가 충분합니까? 혹시. 아이디어가 처음으로 여과되기 시작한 이래로 25 년 동안 나는 클래스 기반 OO와 같은 추상화 된 개념이 대부분의 사람들이 배우기에 너무 어렵지 않았다고 주장 할 것입니다. 반면에 아마도 블루 칼라 프로그래밍 언어 (예 : 자바 스크립트)가 더 쉬울 필요가 있으며이를 달성하는 방법이 될 수 있습니다.

관심이 있으신 분은 this paper으로 시작하십시오.

+0

이 질문을 보니 좋은 점이 흥미 롭습니다! 감사 :) – egaga

관련 문제