أين هو أفضل مكان لإضافة طرق للصف صحيح في القضبان؟

StackOverflow https://stackoverflow.com/questions/266819

سؤال

وأين هو أفضل مكان لإضافة وسيلة للصف صحيح في القضبان؟ أود أن أضيف to_meters وto_miles الأساليب.

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

المحلول

إذا كان لديك مجموعة قلبك على التلويث مع الرقمي (أو عدد صحيح، وما إلى ذلك) فئة للحصول على وحدة لتحويل، فعلى الأقل أن تفعل ذلك منطقيا ومع بعض القيمة الحقيقية.

أولا، إنشاء فئة وحدة الذي يخزن نوع الوحدة (متر والقدمين، ذراعا، الخ)، والقيمة على الخلق. ثم إضافة مجموعة من الأساليب لالرقمية التي تتوافق مع وحدة القيم الصالحة يمكن أن يكون لديك: فإن هذه الأساليب بإرجاع كائن وحدة مع انها نوع كما هو مسجل على اسم الأسلوب. ان الطبقة حدة دعم مجموعة من الأساليب to_ * التي من شأنها أن تتحول إلى نوع وحدة أخرى مع قيمة الوحدة المقابلة. بهذه الطريقة، يمكنك أن تفعل الأمر التالي:

>> x = 47.feet.to_meters
=> 14.3256
>> x.inspect
=> #<Unit 0xb795efb8 @value=14.3256, @type=:meter>

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

وأما بالنسبة إلى أين وضعها، إنشاء ليب / ملف units.rb، التي من شأنها أن تحتوي أيضا على monkey_patch إلى الرقمي، ثم تهيئة في التكوين / environment.rb بو تتطلب ليب / ملف units.rb.

نصائح أخرى

وخلق بنفسك وحدة / مكتبة التي تشمل في نطاقها عندما كنت في حاجة إليها لأداء هذه المهمة.

ومثل "" unitCoversions "requre من"

وهي احتمالات، شخص ما سبق ان فعلت هذا اذا نظرتم الصعب بما فيه الكفاية:)

ولكن DONT محاولة تعديل الفئة الأساسية الأم، التي من شأنها أن تنتهي إلا في البؤس.

و(أيضا، للدرجة التي ترغب في تمديد هو 'رقمية'، من شأنها أن تنطبق على كل من الأعداد الصحيحة والعربات :))

<اقتباس فقرة>   

وليس واضحا تماما لماذا يجب أن لا تفعل هذا ... القضبان يفعل هذا إلى فئة السلسلة نجاحا كبيرا.

ولأنه يمكن القيام به لا يعني أنه يجب ينبغي القيام به. "الترقيع القرد" كما هو معروف يمكن أن يكون كل أنواع الآثار الجانبية ونيف، وأنها يمكن أن يكون فشل ملحمة عندما يأتيه الباطل.

هل لأنها عندما لا يكون هناك بديل جيد.

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

وفقط على سبيل المثال، والوجه databasing رأسا على عقب.

5.getArtist(); 
10.getEvent(); 
100.getTrack(); 

والخ الخ وليس هناك حد لعدد طرق سيئة هناك للقيام بذلك.

"Bob".createUser(); 

والبؤس في فنجان.

إذا كنت تريد أن تفعل شيئا عمليا، لدى فئة تحويل أو وظيفة،

convert( 3 , { :from=>:miles, :to=>:meters }); 

وعلى الأقل كنت لا يلوث ظائف مساحة والأساسية العالمية بهذه الطريقة، وكان من المنطقي أكثر تماسكا.

لماذا لا فقط:

class Feet
  def self.in_miles(feet)
    feet/5280
  end
end

والاستعمال:

Feet.in_miles 2313

وأو ربما ننظر في الأمر بطريقة أخرى:

class Miles
  def self.from_feet(feet)
    feet/5280
  end
end

Miles.from_feet 2313

وأنا أتفق قرد الترقيع يجب أن تستخدم بحذر، ولكن في بعض الأحيان أنها مجرد معنى. أنا حقا مثل المساعدين التي تسمح لك لكتابة 5.days.ago التي هي جزء من المكتبة active_support

وحتى بعض الإجابات الأخرى قد يكون من الأفضل في هذه الحالة، ولكن إذا كنت توسيع الطبقات روبي نبقي كلنا ملحقات في ليب / ملحقات / class_name.rb

وبهذه الطريقة عند العمل على مشروع هو سريعة وسهلة لإيجاد ورؤية أي شيء قد يكون خارجا عن المألوف مع الطبقات القياسية.

وعادة (ومنطقيا)، الأعداد الصحيحة لا يمكن تحويلها إلى ميل أو إلى متر. هذا يبدو وكأنه قد ترغب في إنشاء فئة جديدة مثل "الأقدام" أو "بوصة" التي تتم تهيئة مع عدد صحيح، ثم يحتوي على طرق مثل size_in_miles أو size_in_meters. لراحة هذه الأساليب يمكن أن تعود عشري أو تعويم أنواع، ولكنك قد ترغب أيضا في كتابة فئة ميل أو فئة متر.

وأما أسلوب بديل، قد ترغب في إنشاء أسلوب ثابت في الطبقة الجديدة التي من شأنها أن يكون لها توقيع مثل هذا:

وFloat feetToMiles(integer I)

والتي يمكن أن أسميه

وmiles = Feet.feetToMiles(5280);

ووالحصول على miles = 1.0

وأدرك السؤال هو القديم، ولكن أعتقد أن أوضح الطريقة هو جعل فئة القطر مع سمتان @length و@unit.

وكنت بحاجة فقط تجزئة التحويل، وربما كان ذلك متغير فئة عن بعد:

class Distance

  @@conversion_rates = {
    meters: {
      feet: 3.28084,
      meters: 1.0
    }
  }

  def to(new_unit)
    new_length = @length * @@conversion_rates[@unit][new_unit]
    Distance.new( new_length, new_unit ) 
  end

end

وأنها تبدو كيندا مثل:

Distance.new(3, :meters).to(:feet)

والتي أعتقد بصراحة تبدو أفضل من

3.meters.to_feet

إذا كانوا في طريقهم للقيام بذلك، والتي يجب أن لا، ثم هل وضع الشفرة في:

config/initializers/add_methods_that_are_naughty_to_numeric.rb

والقضبان سيكون تلقائيا تشغيل هذه لك.

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