गतिशील भाषाओं में बनाम बनाम मिश्रण?


19

आपको गतिशील भाषाओं में मिक्सिन्स पर वंशानुक्रम पैटर्न कब पसंद करना चाहिए?

मिश्रण के द्वारा, मेरा मतलब है कि उचित उचित मिश्रण में, जैसे कि रनटाइम में किसी ऑब्जेक्ट में फ़ंक्शन और डेटा सदस्यों को सम्मिलित करना।

आप कब उपयोग करेंगे, उदाहरण के लिए, मिश्रण के बजाय प्रोटोटाइप विरासत? अधिक स्पष्ट रूप से समझाने के लिए कि मुझे मिक्सिन से क्या मतलब है, कुछ छद्मकोड:

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

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

2
मिक्सिन्स सीधे-सीधे विरासत की तुलना में क्रॉस-कटिंग पहलुओं की तरह हैं। यह संभवतः आपके लिए कुछ उपयोग-मामलों को परिभाषित करेगा।
13

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

मेरे घोड़े की समझ मुझे यह बताती है:

  • अगर कुछ उपयोगी है भर में एक से अधिक ऑब्जेक्ट या वर्ग पदानुक्रम - यह एक mixin बनाने
  • यदि कोई चीज़ केवल एकल पदानुक्रम के साथ उपयोगी है - विरासत का उपयोग करें

संबंधित नोट:

  • "उपयोगी" शब्द को रूपक रूप से लिया जाना चाहिए
  • उन भाषाओं के लिए जिनमें एकाधिक वंशानुक्रम नहीं हैं, मिश्रण एक अच्छा विकल्प है
  • PHP 5.4 उन लक्षणों का परिचय देता है जिनमें मिश्रण और एकाधिक विरासत दुनिया दोनों से अच्छाई है

रूबी में +1, "कई वस्तुओं या वर्ग पदानुक्रमों में कुछ उपयोगी" का मेरा पसंदीदा उदाहरण अनगिनत
डेविड

1
मैं कहूंगा कि मिक्सिन्स के लिए मल्टीपल इनहेरिटेंस एक (इतना अच्छा नहीं) विकल्प हो सकता है।
साइमन बर्गोट

@ साइमन मैं कहूंगा कि मिक्सिन कई विरासत में एक (इतना अच्छा नहीं) विकल्प हो सकता है;)
रेयानोस

मेरे घोड़े के भाव ने मुझे यह भी बताया। :)
theringostarrs

9

"Is-a" परीक्षण का उपयोग करें।

वंशानुक्रम उस मामले तक सीमित है जब आप "सबक्लास आईएस ए सुपरक्लास" कह सकते हैं। वे एक ही तरह के होते हैं। "पनीर एक डेयरी उत्पाद है"।

मिश्रण सब कुछ के लिए हैं । "पनीर को सैंडविच में इस्तेमाल किया जा सकता है"। पनीर सैंडविच नहीं है, लेकिन यह सैंडविच में भाग लेता है।

पुनश्च। इसका डायनेमिक भाषाओं से कोई लेना-देना नहीं है। स्थैतिक संकलन (अर्थात, C ++) के साथ किसी भी एकाधिक विरासत भाषा में एक ही निर्णय बिंदु होता है।


निश्चित रूप से + 1- स्थिर भाषाओं में मिश्रण भी होते हैं।
डेडएमजी

सही, मिश्रण कई भाषाओं में किया जा सकता है - यह मेरा सवाल नहीं था। डायनेमिक भाषाओं में कुछ गुण होते हैं जो मिक्सिन्स को अलग-अलग और / या अधिक रोचक नहीं बना सकते हैं - ऐसी भाषाओं में रेयानोस ने एक पहलू बताया। इसके अलावा, आप किसी भी विशिष्ट कारणों को इंगित नहीं करते हैं कि किसी को मिक्स कांसेप्ट पर आईएस ए अवधारणा का उपयोग क्यों करना चाहिए।
मैग्नस वोल्फेल्ट

@MagnusWolffelt: वे एक ही तरह की चीज हैं। "पनीर एक डेयरी उत्पाद है"। आईएस-ए के लिए यही नियम है। मुझे और क्या कहना चाहिए?
एस.लॉट

मेरा प्रश्न डिजाइन निर्णयों के बारे में अधिक है - आप किन स्थितियों में विरासत चाहते हैं, और किन कारणों से? डायनेमिक भाषाओं में मुझे रेइनोस ने जो वर्णन किया है, उसके अलावा, मिक्सिन्स पर विरासत को चुनने के कुछ कारण दिखाई देते हैं। वस्तु निर्माण का प्रदर्शन एक कारण हो सकता है।
मैग्नस वोल्फेल्ट

@MagnusWolffelt: "आप किन स्थितियों में वंशानुक्रम चाहते हैं" जब दो वर्ग आईएस-ए संबंध को संतुष्ट करते हैं। "ऑब्जेक्ट निर्माण का प्रदर्शन" एक दूसरे पर एक चुनने का कारण नहीं है। इनहेरिटेंस वस्तुओं के दो वर्गों के बारे में बहुत मजबूत बयान देता है। मिक्सिन एक कमजोर और अधिक लचीला बयान करता है। वंशानुक्रम का उपयोग तब किया जाता है जब दो वर्ग "आईएस-ए" रिश्ते को संतुष्ट करते हैं। मैं और क्या कह सकता था? मैं आपके प्रश्न को बहुत अच्छी तरह से नहीं समझ सकता। क्या आप स्पष्ट कर सकते हैं कि आप और क्या जानना चाहते हैं?
एस.लॉट

0

खैर, सबसे अच्छा उदाहरण मैं आपको यह दे सकता हूं कि एक गेम के लिए एक अभिनेता है, जिसके पास कुछ बेस सामान के लिए विरासत है, लेकिन साझा कार्यक्षमता के लिए मिक्सिन्स / प्लगइन्स का उपयोग करता है । साझा कार्यक्षमता (स्रोत कोड से सीधे!) हो सकती है:

var plugins = {
    SingleVisualEntity : SingleVisualEntity,
    JumpBehaviour      : JumpBehaviour,
    WeaponBehaviour    : WeaponBehaviour,
    RadarBehaviour     : RadarBehaviour,
    EnergyGatherer     : EnergyGatherer,
    LifeBarPlugin      : LifeBarPlugin,
    SelectionPlugin    : SelectionPlugin,
    UpgradePlugin      : UpgradePlugin,
    BrainPlugin        : BrainPlugin,
    PlanetObjectPlugin : PlanetObjectPlugin,
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.