Dinamik dillerde miras mı yoksa mixin mi?


19

Dinamik dillerde karışımlara göre kalıtım kalıplarını ne zaman tercih etmelisiniz?

Mixins ile, çalışma zamanında bir nesneye işlevler ve veri üyeleri eklerken olduğu gibi gerçek uygun karıştırma anlamına gelir.

Örneğin, mixins yerine prototippal mirasını ne zaman kullanırsınız? Mixin ile ne demek istediğimi daha açık bir şekilde göstermek için, bazı sözde kod:

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

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

2
Mixins, düz kalıtımdan daha çok kesişen yönlere benzer. Bu muhtemelen sizin için bazı kullanım durumları tanımlayacaktır.
ashes999

1
Composition,
everyone

Yanıtlar:


14

Prototip miras basittir. Karışımlara göre tek bir avantajı vardır.

Bu canlı bir bağlantı. prototipi değiştirirseniz, miras alan her şey değiştirilir.

PD kullanan örnek

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;
}

Temel olarak, "arabirim" Çemberinde yapılan değişikliklerin çalışma zamanında "işlevini" kullanan tüm nesnelere yansıtmasını istiyorsanız, ondan devralın.

Değişikliklerin yansıtılmasını istemiyorsanız, karıştırın.

Karışımların da bundan daha fazla amacı olduğunu unutmayın. Mixins çoklu "kalıtım" için mekanizmanızdır.

Bir nesnenin birden fazla "arabirimi" uygulamasını istiyorsanız , o zaman bazılarını karıştırmanız gerekir. Prototipik miras için kullandığınız, değişikliklerin çalışma zamanında yansıtılmasını istediğiniz, diğerleri karıştırılacaktır.


12

At duygum bana şunu söylüyor:

  • Şey yararlıdır ise karşısında nesneler veya sınıf hiyerarşileri birden - bir mixin yapmak
  • Bir şey yalnızca tek bir hiyerarşi boyunca faydalıysa - kalıtım kullanın

İlgili Notlar:

  • "Yararlı" kelimesi mecazi olarak ele alınmalıdır
  • Birden fazla mirasa sahip olmayan diller için, mixinler iyi bir alternatiftir
  • PHP 5.4 , hem mixins hem de çoklu kalıtım dünyalarından iyiliği olan özellikler sunar

+1, Ruby'deki "birden fazla nesne veya sınıf hiyerarşisinde faydalı bir şey" olarak benim en sevdiğim örnek Enumerable modülü: ruby-doc.org/core-1.9.3/Enumerable.html
David

1
Çoklu kalıtımın mikslere (o kadar iyi değil) bir alternatif olabileceğini söyleyebilirim.
Simon Bergot

@Simon Ben mixins çoklu miras (o kadar iyi değil) bir alternatif olabilir söyleyebilirim;)
Raynos

At duygum da bana bunu söyledi. :)
theringostarrs

9

"Is-a" testini kullanın.

Devralma, "Alt Sınıf Bir Üst Sınıf IS" diyebileceğiniz durumla sınırlıdır. Aynı tür şeyler. "Peynir bir Süt Ürünüdür".

Mixins diğer her şey içindir. "Peynir bir sandviçte kullanılabilir". Peynir bir sandviç değil, sandviçlemeye katılıyor.

PS. Bunun dinamik dillerle ilgisi yoktur. Statik derlemeye sahip herhangi bir çoklu kalıtım dili (yani C ++) aynı karar noktasına sahiptir.


Kesinlikle + 1- statik dillerin de karışımları vardır.
DeadMG

Doğru, mixins birçok dilde yapılabilir - bu benim sorum değildi. Dinamik diller, karışımları bu dillerde farklı ve / veya daha ilginç hale getirebilecek veya getirmeyebilecek belirli özelliklere sahiptir - Raynos bir yönü işaret etti. Ayrıca, IS A konseptini neden mixin konsepti üzerinde kullanması gerektiğine dair belirli bir neden belirtmiyorsanız
Magnus Wolffelt

@MagnusWolffelt: Aynı tür şeyler. "Peynir bir Süt Ürünüdür". IS-A'nın kuralı budur. Daha ne diyeyim?
S.Lott

Sorum daha çok tasarım kararları hakkında - hangi durumlarda veraset ve hangi nedenlerle? Dinamik dillerde Raynos'un tarif ettiği gibi, mikslere göre kalıtım seçmek için birkaç neden görüyorum. Nesne oluşturma performansı bunun bir nedeni olabilir.
Magnus Wolffelt

@MagnusWolffelt: "hangi durumlarda miras istiyorsunuz?" İki sınıf IS-A ilişkisini tatmin ettiğinde. "Nesne yaratma performansı" birini seçmenin bir nedeni değildir. Kalıtım, iki nesne sınıfı hakkında çok güçlü bir açıklama yapar. Mixins daha zayıf ve daha esnek bir açıklama yapar. Kalıtım, iki sınıf "IS-A" ilişkisini karşıladığında kullanılır. Daha ne diyebilirim ki? Sorunu çok iyi anlayamıyorum. Daha ne bilmek istediğinizi açıklayabilir misiniz?
S.Lott

0

Size verebileceğim en iyi örnek , bazı temel şeyler için mirasa sahip olan ancak paylaşılan işlevsellik için mixins / eklentileri kullanan bir oyun için bir Aktör . Paylaşılan işlevsellik (doğrudan kaynak kodundan!) Olabilir:

var plugins = {
    SingleVisualEntity : SingleVisualEntity,
    JumpBehaviour      : JumpBehaviour,
    WeaponBehaviour    : WeaponBehaviour,
    RadarBehaviour     : RadarBehaviour,
    EnergyGatherer     : EnergyGatherer,
    LifeBarPlugin      : LifeBarPlugin,
    SelectionPlugin    : SelectionPlugin,
    UpgradePlugin      : UpgradePlugin,
    BrainPlugin        : BrainPlugin,
    PlanetObjectPlugin : PlanetObjectPlugin,
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.