При использовании файлов классов в Ruby вы помещаете операторы "require" в начало файла или внутри определения класса?
Нужны ли инструкции Ruby "require" внутри или вне определения класса?
Ответ 1
Технически, это не имеет большого значения. require
- это обычный вызов метода, и область действия, которую он вызывает, не влияет на работу. Единственное различие заключается в том, что он будет выполняться, когда какой-либо код, который он размещает, оценивается.
Практически говоря, вы должны поместить их сверху, чтобы люди могли видеть зависимости файлов с первого взгляда. Это традиционное место для него.
Ответ 2
вверху.
require 'rubygems'
require 'fastercsv'
class MyClass
# Do stuff with FasterCSV
end
Ответ 3
Я вижу возможную причину не помещать require
в начало файла: там, где это дорого загружать и не всегда выполняется. Один случай, который возникает для меня, это то, где, например, код и его тесты находятся в одном файле, что время от времени я делаю для небольшого библиотечного кода. Затем я могу запустить файл из моего редактора и запустить тесты. В этом случае, когда файл находится в require
d в другом месте, я не хочу загружать 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
Ответ 4
Неважно, где вы их помещаете, но если вы поместите их внутри выражения class
или module
, то похоже, что вы импортируете все, что находится в файле require
d, в пространство имен классов, что неверно: все заканчивается в глобальном пространстве имен (или какие-либо пространства имен определены в библиотеке).
Итак, лучше поместите их наверху, чтобы избежать путаницы.
Ответ 5
В верхней части файла большинство (но не все) языков обрабатывают импорт таким образом. Я нахожу его более чистым и более легким в обращении с ними таким образом.
Я думаю, что это имеет смысл только так... например, вы получаете середину в файле, а затем:
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'
как вы можете видеть, было бы очень сложно их отслеживать. Не говоря уже о том, что вы хотели использовать импортированные функции ранее в своем коде, вам, вероятно, придется отступить и включить его снова, потому что другой импорт будет специфичным для этого класса. Импортирование одних и тех же файлов создало бы много накладных расходов во время выполнения.
Ответ 6
Я чувствую, что оператор требует принадлежит внутри класса. Использование классов означает, что мы принимаем основной принцип ООП, а именно, объекты должны быть как можно более слабо связаны. Для меня это подразумевает минимизацию внешних зависимостей. Если позже я переведу класс в свой файл, я не хочу, чтобы он прерывался, потому что я не отслеживал все необходимые require утверждения, которые класс потребляет.
Это не вызывает проблем с дублированием require в файле, что упрощает рефакторинг, который неизбежно будет иметь следующий программист, который наследует ваш код.