동적 언어의 상속과 믹스 인?


19

동적 언어의 믹스 인보다 상속 패턴을 언제 선호해야합니까?

믹스 인이란 런타임에 객체에 함수와 데이터 멤버를 삽입하는 것과 같이 실제 적절한 믹싱을 의미합니다.

예를 들어 믹스 인 대신 프로토 타입 상속을 언제 사용 하시겠습니까? mixin, 의사 코드의 의미를 더 명확하게 설명하기 위해

asCircle(obj) {
  obj.radius = 0
  obj.area = function() {
    return this.radius * this.radius * 3.14
  }

myObject = {}
asCircle(myObject)
myObject.area() // -> 0

2
믹스 인은 직계 상속보다 교차 절단 측면과 비슷합니다. 아마도 유스 케이스를 정의 할 것입니다.
ashes999

1
작곡, 누구나 :)
OnesimusUnbound

답변:


14

프로토 타입 상속은 간단합니다. 믹스 인에 비해 단일 이점이 있습니다.

그것은 그것이 라이브 링크라는 것입니다. 프로토 타입을 변경하면 상속 된 모든 것이 변경됩니다.

pd를 사용한 예

var Circle = {
  constructor: function _constructor() {
    this.radius = 0;
    return this;
  },
  area: function _area() {
    return this.radius * this.radius * Circle.PI
  },
  PI: 3.14
};

var mixedIn = pd.extend({}, Circle).constructor();
var inherited = pd.make(Circle, {}).constructor();

Circle.perimeter = perimeter;

inherited.perimeter(); // wins
mixedIn.perimeter(); // fails

function perimeter() {
  return 2 * this.radius;
}

따라서 기본적으로 "인터페이스"서클에 대한 변경 사항을 런타임에 해당 기능을 "사용"하는 모든 개체에 반영하도록하려면 해당 인터페이스에서 상속합니다.

변경 사항을 반영하지 않으려면 혼합하십시오.

믹스 인은 그보다 더 많은 목적을 가지고 있습니다. 믹스 인은 다중 "상속"을위한 메커니즘입니다.

당신은 객체가 다수의 "인터페이스"를 구현하려면 당신은 몇 가지를 혼합해야합니다. 당신은 프로토 타입 상속에 사용하는 사람이 당신이 실행시, 다른 사람이 혼합됩니다에 대한 변경 사항을 반영 할 것입니다.


12

내 말 감각이 나에게 말해줍니다.

  • 뭔가 유용한 경우 에서 개체 또는 클래스 계층 다중 - 그것을 믹스 인 할
  • 무언가가있는 경우 에만 유용 함께 사용 상속 - 단일 계층 구조

관련 메모 :

  • "유용한"이라는 단어는 은유 적으로 사용되어야합니다
  • 다중 상속이없는 언어의 경우 믹스 인이 좋은 대안입니다.
  • PHP 5.4는 믹스 인과 다중 상속 세계에서 좋은 특성 을 소개 합니다

+1, Ruby에서 "여러 객체 나 클래스 계층에서 유용한 것"을 가장 좋아하는 예는 열거 가능한 모듈입니다. ruby-doc.org/core-1.9.3/Enumerable.html
David

1
다중 상속은 mixin의 대안이 될 수 있습니다.
Simon Bergot

@Simon 믹스 인은 다중 상속에 대한 (그렇지 않은) 대안이 될 수 있다고 말할 것입니다.)
Raynos

내 말 감각도 나에게 이것을 말했다. :)
theringostarrs

9

"Is-a"테스트를 사용하십시오.

상속은 "Subclass IS A Superclass"라고 말할 수있는 경우로 제한됩니다. 그것들은 같은 종류입니다. "치즈는 유제품입니다."

믹스 인은 다른 모든 것을 위한 입니다. "치즈는 샌드위치에 사용할 수 있습니다". 치즈는 샌드위치가 아니지만 샌드위치에 참여합니다.

추신. 이것은 동적 언어와 관련이 없습니다. 정적 컴파일 (예 : C ++)을 사용하는 다중 상속 언어는 동일한 결정 지점을 갖습니다.


+1 정적 언어에는 믹스 인도 있습니다.
DeadMG

맞습니다. 믹스 인은 여러 언어로 수행 될 수 있습니다. 이것은 내 질문이 아닙니다. 다이나믹 랭귀지 (Dynamic Language)는 그러한 언어에서 믹스 인을 다르게 만들거나 흥미롭게 만들 수있는 특정 속성을 가지고 있습니다. 또한 믹스 인 개념보다 IS A 개념을 사용해야하는 특정 이유를 지적하지 않습니다.
Magnus Wolffelt

@ MagnusWolffelt : 그들은 같은 종류입니다. "치즈는 유제품입니다." 이것이 IS-A의 규칙입니다. 더 무엇을 말해야합니까?
S.Lott

제 질문은 디자인 결정에 관한 것입니다. 어떤 상황에서 상속을 원하고 어떤 이유로 하시겠습니까? 동적 언어에서는 Raynos가 설명한 것 외에도 믹스 인보 다 상속을 선택 해야하는 몇 가지 이유가 있습니다. 객체 생성 성능이 한 가지 이유 일 수 있습니다.
Magnus Wolffelt

@MagnusWolffelt : "어떤 상황에서 상속을 원하십니까?"두 클래스가 IS-A 관계를 만족시킬 때. "객체 생성 성능"이 다른 것을 선택하는 이유는 아닙니다. 상속은 두 클래스의 객체에 대해 매우 강력하게 진술합니다. 믹스 인은 더 약하고 유연한 진술을합니다. 상속은 두 클래스가 "IS-A"관계를 만족할 때 사용됩니다. 내가 더 말할 수 있습니까? 귀하의 질문을 잘 이해할 수 없습니다. 더 알고 싶은 것을 명확히 할 수 있습니까?
S.Lott December

0

글쎄, 내가 당신에게 줄 수있는 가장 좋은 예는 기본 물건에 대한 상속을 가지고 있지만 공유 기능을 위해 mixins / plugins 를 사용 하는 게임액터입니다 . 공유 기능은 다음과 같습니다 (소스 코드에서 직접 사용 가능).

var plugins = {
    SingleVisualEntity : SingleVisualEntity,
    JumpBehaviour      : JumpBehaviour,
    WeaponBehaviour    : WeaponBehaviour,
    RadarBehaviour     : RadarBehaviour,
    EnergyGatherer     : EnergyGatherer,
    LifeBarPlugin      : LifeBarPlugin,
    SelectionPlugin    : SelectionPlugin,
    UpgradePlugin      : UpgradePlugin,
    BrainPlugin        : BrainPlugin,
    PlanetObjectPlugin : PlanetObjectPlugin,
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.