هل روبي 'تتطلب بيانات تذهب داخل أو خارج الصف التعريف ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

عند استخدام ملفات فئة في روبي ، هل وضع 'يتطلب بيانات في الجزء العلوي من الملف أو داخل الطبقة التعريف ؟

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

المحلول

ومن الناحية الفنية، لا يهم حقا. require هو مجرد استدعاء الأسلوب العادية، ونطاق انه دعا في لا يؤثر كيف يعمل. والفرق الوحيد وضع يجعل هو أنه سيتم تنفيذها عند مهما كود انها وضعت في وتقييمها.

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

نصائح أخرى

في الجزء العلوي.

require 'rubygems'
require 'fastercsv'

class MyClass
  # Do stuff with FasterCSV
end

وأستطيع أن أرى سببا محتملا لعدم وضع require في الجزء العلوي من الملف: حيث انها مكلفة لتحميل ولم تنفذ دائما. حالة واحدة أن يحدث لي هو المكان، على سبيل المثال، رمز وتجاربها في نفس الملف، وهو ما أود القيام به من وقت لآخر لرمز مكتبة صغيرة على وجه الخصوص. ثم لا أستطيع تشغيل الملف من وجهة نظري محرر واختبارات تشغيل. في هذه الحالة عند required الملف في من مكان آخر، وأنا لا أريد test/unit يتم تحميل.

وشيء قليلا مثل هذا:

def some_useful_library_function()
  return 1
end

if __FILE__ == $0
  require 'test/unit'
  class TestUsefulThing < Test::Unit::TestCase
    def test_it_returns_1
      assert_equal 1, some_useful_library_function()
    end
  end
end

وولا يهم حقا حيث كنت وضعت لهم، ولكن إذا وضعت لهم <م> داخل وclass أو module التعبير، فإنه يبدو وكأنه كنت تقوم باستيراد كل ما هو في ملف required في مساحة اسم الفئة التي ، وهو غير صحيح: كل شيء ينتهي في مساحة الاسم العالمي (أو أيا كان بمساحات يتم تعريفها في المكتبة )

وهكذا، ووضعها بشكل أفضل في الجزء العلوي لتجنب أي التباس.

في الجزء العلوي من الملف، فإن الغالبية (وليس كل) اللغات التعامل مع الواردات بهذه الطريقة. أجد أنه من أنظف بكثير وأسهل في التعامل معها بهذه الطريقة.

وأعتقد أنه من المنطقي بهذه الطريقة حقا ... مثل تحصل منتصف الطريق في ملف ثم:

class Foo
  def initialize(init_value)
    @instance_var = init_value

# some 500 lines of code later....

  end
end

class Bar
# oh look i need an import now!
require 'breakpoint'

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

أشعر أن تتطلب بيان ينتمي داخل الصف.استخدام الطبقات يعني أننا قبول أحد الركائز الأساسية OOP وهي الكائنات يجب أن تكون المتباعدة ممكن.بالنسبة لي هذا يعني التقليل من الاعتماد على الخارج.إذا أنا في وقت لاحق نقل فئة إلى الملفات الخاصة بها, أنا لا أريد أن يكون ذلك كسر لأنني لم تعقب كل ما يلزم تتطلب البيانات التي يستهلكها.

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

ومعظم الإجابات أنصح وضع <م> تتطلب البيانات في الجزء العلوي من الملف. ولكن عندما تحتاج إلى الطبقات المتداخلة / وحدات قد ترغب في النظر في وضعها في الطبقة بدلا من ذلك (في الأعلى). إلقاء نظرة على هذا المثال:

# foo.rb
require './foo/bar'

class Foo < Struct.new(:name, :description)
  def bar
    Bar.new(self)
  end
end

# foo/bar.rb
class Foo
  class Bar < Struct.new(:foo)
  end
end

والاتحاد الدولي للرجبي:

require './foo'
# ...
# TypeError (superclass mismatch for class Foo)

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

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

وTypeError (عدم تطابق الفائقة لفئة فو)

ويمكن حل هذه المشكلة ببساطة عن طريق تحريك تتطلب بيان داخل <م> فو الصف.

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