تجنب التكرار عند تحديد فئة في روبي؟
-
14-12-2019 - |
سؤال
أجد نفسي أكرر الأشياء كثيرًا عندما أقوم بإنشاء دروس في روبي، وغالبًا ما ينتهي بي الأمر بشيء مشابه لما يلي:
class Foo
attr_reader :bar_0,
:bar_1,
.
.
.
:bar_n
def initialize( bar_0 = something,
bar_1 = something,
.
.
.
bar_n = something)
@bar_0 = bar_0
@bar_1 = bar_1
.
.
.
@bar_n = bar_n
end
end
هل تستخدم روبي اختصارًا لتنفيذ شيء كهذا بشكل أكثر كفاءة؟
المحلول
انطلاقًا من طريقة صياغة السؤال، ربما ينبغي عليك إعادة التفكير في تصميم فصولك الدراسية.ومع ذلك، توفر روبي طريقة مثيرة للاهتمام لإنشاء الفصول الدراسية بسرعة attr_accessor
ق (ليس القراء).إليك مثال بسيط:
>> class Person < Struct.new(:name, :age) ; end
=> nil
>> p = Person.new
=> #<struct Person name=nil, age=nil>
>> p.age = 23
=> 23
>> p.class
=> Person
>> p.methods.grep(/age/)
=> [:age, :age=]
بالطبع هذه فئة عادية ويمكنك إضافة جميع الطرق التي تريدها (واستخدام الحروف والمحددات بدلاً من متغيرات الحالة، على سبيل المثال. var
للحصول على و self.var = foo
للواضع).
إذا كنت لا تريد الكتاب حقًا، فاجعلهم خاصين أو undef
هم.
>> attrs = [:name, :age]
=> [:name, :age]
>> class Person < Struct.new *attrs ; end
=> nil
>> Person.instance_eval { private *attrs.map{|attr| "#{attr}=" }}
=> Person
>> p = Person.new
=> #<struct Person name=nil, age=nil>
>> p.methods.grep(/age/)
=> [:age]
كل ما سبق لا يساعد في الكثير من المهام initialize
بالطبع، ولكن بعد ذلك يتساءل المرء عما إذا كنت تريد حقًا استخدام العديد من وسيطات المُنشئ أو إذا كان لديك وسيطة تجزئة واحدة فقط ودمجها في تجزئة افتراضية.
نصائح أخرى
Ruby ديناميكي ويقدم الكثير من حيث الاستبطان، حتى تتمكن من الاستفادة من التعريف (أو كتابة التعليمات البرمجية التي يكتبها أساسا).في مثالك، هناك العديد من الأشياء التي يمكنك القيام بها لتنظيف الألغام:
giveacodicetagpre.نظرا لأن مهمة الكتلة هي سلوك شائع وقابل لإعادة الاستخدام، فمن المنطقي استخراجها إلى وحدة منفصلة وجعلها mixin:
giveacodicetagpre.يمكنك استخدام
يمكنك استخدام إدخال كائن المعلمة طريقة إعادة تكوينها لتبسيط مكالمة منشئ.