루비가 '필요'진술은 클래스 정의 내부 또는 외부로 이동합니까?

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

  •  03-07-2019
  •  | 
  •  

문제

Ruby에서 클래스 파일을 사용할 때 파일 상단 또는 클래스 정의에 '요구 사항'문을 넣습니까?

도움이 되었습니까?

해결책

기술적으로는 중요하지 않습니다. 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 클래스의 네임 스페이스에 D 파일은 사실이 아닙니다. 도서관에서).

따라서 혼란을 피하기 위해 맨 위에 놓는 것이 좋습니다.

파일의 맨 위에서, 대다수 (전부는 아님) 언어 가이 방식으로 가져옵니다. 이런 식으로 더 깨끗하고 처리하기가 훨씬 쉽습니다.

나는 그것이 정말로 이런 식으로 만 의미가 있다고 생각합니다 ... 당신이 파일의 중간에있는 것처럼 :

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

IRB :

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

이런 일이 발생합니다 술집 내부에 중첩되어 있습니다 foo 그리고 둥지를 둥글게하여 정의해야합니다. 술집 내부의 클래스 foo 수업. 그러나 그 이후로 foo 아직 정의되지 않았습니다. 이제 중첩 구조에 의해 정의되고 있습니다. 후에 술집 성공적으로 필요합니다. 이제 우리는 정의하려고합니다 foo 다른 클래스에서 물려받는 클래스. 이것은 사실 때문에 실패합니다 foo 이미 중첩 구조로 정의되어 있으며 상속은 클래스의 초기 정의에서만 발생할 수 있습니다. 따라서 올리기 :

TypeError (클래스 FOO의 슈퍼 클래스 불일치)

이 문제는 단순히 요구 사항을 foo 수업.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top