سؤال

كنت أقرأ عن روبي، وتعرفت على نمط المزج الخاص بها، لكن لم أستطع التفكير في العديد من وظائف المزج المفيدة (لأنني لست معتادًا على التفكير بهذه الطريقة على الأرجح).لذلك كنت أتساءل ما هي الأمثلة الجيدة لوظائف Mixin المفيدة؟

شكرًا

يحرر:قليلا من الخلفية.أنا قادم من لغة C++ ولغات الكائنات الأخرى، لكن أشك هنا هو أن روبي تقول إنها لا ترث المزيج، لكنني ما زلت أرى المزيج على أنه وراثة متعددة، لذلك أخشى أنني أحاول تصنيفها قريبًا جدًا في منطقة الراحة الخاصة بي ، وليس حقًا ما هو المزيج.

هل كانت مفيدة؟

المحلول

وحسنا المثال المعتاد أعتقد أن استمرار

module Persistence
    def load sFileName
            puts "load code to read #{sFileName} contents into my_data"
    end
        def save sFileName
        puts "Uber code to persist #{@my_data} to #{sFileName}"
    end

end

class BrandNewClass
    include Persistence
    attr :my_data

        def data=(someData)
        @my_data = someData
    end
end

b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"

وتخيل هو مكتوب وحدة من النينجا روبي، والتي استمرت حالة صفك إلى ملف.
لنفترض الآن أنا أكتب فئة العلامة التجارية الجديدة، ويمكن إعادة استخدام وظائف استمرار عن طريق خلط في بالقول include ModuleILike. يمكنك حتى تشمل وحدات في وقت التشغيل. أحصل تحميل وحفظ الطرق مجانا فقط عن طريق خلطه فيها هذه الأساليب هي تماما مثل تلك التي كتبت نفسك لصفك. الرمز / السلوك / وظائف-إعادة استخدامها دون الميراث!

وهكذا ما تفعلونه هو بما في ذلك الطرق الى طاولة طريقة لصفك (غير صحيحة حرفيا ولكن وثيقة).

نصائح أخرى

يتم استخدامها عادةً لإضافة شكل من أشكال الوظائف القياسية إلى الفصل الدراسي، دون الحاجة إلى إعادة تعريفها كلها.ربما يمكنك التفكير فيها إلى حد ما مثل الواجهات في Java، ولكن بدلاً من مجرد تحديد قائمة من الأساليب التي يجب تنفيذها، فإن العديد منها في الواقع سوف يكون يتم تنفيذها من خلال تضمين الوحدة النمطية.

هناك بعض الأمثلة في المكتبة القياسية:

Singleton - وحدة يمكن دمجها في أي فئة لجعلها فردية.أصبحت طريقة التهيئة خاصة، وتمت إضافة طريقة المثيل، مما يضمن وجود مثيل واحد فقط من تلك الفئة في التطبيق الخاص بك.

قابلة للمقارنة - إذا قمت بتضمين هذه الوحدة في فئة ما، فإن تحديد الأسلوب <=>، الذي يقارن المثيل الحالي بكائن آخر ويحدد أيهما أكبر، يكفي لتوفير <، <=، ==، >=، >، و بين؟طُرق.

لا يحصى - عن طريق المزج في هذه الوحدة، وتحديد كل الطريقة، يمكنك الحصول على دعم لجميع الطرق الأخرى ذات الصلة مثل الجمع والحقن والتحديد والرفض.إذا كان يحتوي أيضًا على الطريقة <=>، فسوف يدعم أيضًا الفرز، والحد الأدنى، والحد الأقصى.

يعد DataMapper أيضًا مثالًا مثيرًا للاهتمام لما يمكن فعله باستخدام عبارة تضمين بسيطة، وأخذ فئة قياسية، وإضافة القدرة على استمرارها في مخزن البيانات.

في روبي، والسبب أن Mixins ليست متعددة الميراث هو أن الجمع بين أساليب mixin شيء مرة واحدة. وهذا لن يكون مثل قضية كبيرة، إلا أن وحدات روبي والطبقات مفتوحة للتعديل. وهذا يعني أنه إذا كنت mixin وحدة لصفك، ثم إضافة أسلوب إلى وحدة، وطريقة <م> سوف لا تكون متاحة لصفك. حيث إذا فعلت ذلك بالترتيب العكسي، انه سيكون.

وانها مثل يأمر مخروط الآيس كريم. إذا كنت تحصل على الرشات الشوكولاته وقطع الحلوى كما mixins الخاص بك، وسيرا على الاقدام مع مخروط الخاص بك، أي نوع من مخروط الآيس كريم لديك لن تتغير اذا كان هناك من يضيف يرش متعدد الألوان لبن الرشات الشوكولاته مرة أخرى في متجر الآيس كريم. صفك، مخروط الآيس كريم، لا يتم تعديل عند وحدة mixin، وبن ليرش هو. الشخص التالي الذي سيستخدم حدة mixin ستشهد تغييرات.

عند include وحدة نمطية في روبي، فإنه يدعو Module#append_features على أن وحدة، والتي تضيف نسخة من الأساليب التي الوحدة إلى includer وقت واحد.

والميراث متعددة، كما أفهمها، هو أشبه الوفد. إذا لم صفك يعرف كيفية القيام بشيء ما، فإنه يطلب من والديه. في بيئة الفئة المفتوحة، قد تم تعديل الآباء فئة بعد تم إنشاء الفئة.

وانها مثل علاقة RL بين الوالدين والطفل. أمك قد تعلمت كيف توفق بعد كنت قد ولدت، ولكن إذا طلب منك شخص أن توفق وكنت أسألها إما: تبين لكم كيف (نسخه عندما كنت في حاجة إليها) أو قيام بذلك نيابة عنك (وفد النقي)، ثم قالت 'ليرة لبنانية تكون قادرة في تلك المرحلة، حتى ولو كنت تم إنشاؤها من قبل وكانت قدرتها على التعامل.

ومن الممكن أن تستطيع تعديل وحدة روبي "تشمل على التصرف أكثر مثل وراثة متعددة عن طريق تعديل Module#append_features للحفاظ على قائمة includers، ومن ثم تحديثها باستخدام رد method_added، ولكن هذا سيكون تحولا كبيرا من معيار روبي، ويمكن أن يسبب مشاكل كبيرة عند العمل مع رمز الآخرين. هل يمكن أن يكون خلق أفضل طريقة Module#inherit التي دعت include والتعامل معها الوفد كذلك.

وأما بالنسبة للمثال العالم الحقيقي، Enumerable رائع. إذا قمت بتعريف #each وتشمل Enumerable في صفك، فإن ذلك يتيح لك الوصول إلى مجموعة كاملة من المكررات، دون الحاجة إلى رمز كل واحد.

وتستخدم إلى حد كبير على أنه يمكن للمرء أن استخدام وراثة متعددة في C ++ أو واجهات تطبيق في جاوة / C #. أنا لست متأكدا من أين تكمن تجربتك، ولكن إذا كنت قد فعلت تلك الأشياء من قبل، mixins هي كيف سيكون القيام بها في روبي. انها طريقة ممنهج عن طريق الحقن وظائف إلى طبقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top