모듈에 중첩된 클래스 및 클래스를 사용해야 하는 경우
하위 클래스와 모듈을 사용하는 방법에 대해 잘 알고 있지만 최근에는 다음과 같은 중첩 클래스가 있습니다.
class Foo
class Bar
# do some useful things
end
end
다음과 같은 모듈에 중첩된 클래스도 있습니다.
module Baz
class Quux
# more code
end
end
문서와 기사가 부족하거나 올바른 검색어를 찾을 수 있을 정도로 해당 주제에 대한 교육을 받지 못했지만, 해당 주제에 대한 정보를 많이 찾을 수 없는 것 같습니다.
누군가 그러한 기술이 사용되는 이유와 시기에 대한 게시물에 대한 예나 링크를 제공할 수 있습니까?
다른 OOP 언어에는 상위 수준 클래스에 바인딩되지 않고 인스턴스화할 수 없는 내부 클래스가 있습니다.예를 들어, 자바에서는
class Car {
class Wheel { }
}
의 Car클래스가 만들 수 있습니다.Wheels의
루비는 그런 행동을 하지 않습니다.
루비에서.
class Car
class Wheel
end
end
다르다
class Car
end
class Wheel
end
의 Wheel대 대Car::Wheel이 이름의 차이는 프로그래머들에게 명백하게 만들 수 있습니다.Car::Wheel클래스는 일반 휠과 달리 자동차 휠만 나타낼 수 있습니다.Ruby에서 클래스 정의를 중첩하는 것은 선호도의 문제이지만, 두 클래스 간의 계약을 보다 강력하게 적용하고 그렇게 함으로써 클래스와 클래스의 용도에 대한 더 많은 정보를 전달한다는 점에서 목적을 달성합니다.
하지만 루비 통역사에게는 이름만 다를 뿐입니다.
두 번째 관찰의 경우 모듈 내부에 중첩된 클래스는 일반적으로 클래스 이름을 지정하는 데 사용됩니다.예를 들어:
module ActiveRecord
class Base
end
end
다르다
module ActionMailer
class Base
end
end
모듈 내부에 중첩된 클래스만 사용하는 것은 아니지만, 일반적으로 가장 일반적입니다.
루비에서 중첩 클래스를 정의하는 것은 모듈에서 클래스를 정의하는 것과 비슷합니다.실제로 클래스 간의 연결을 강제하지 않고 상수에 대한 네임스페이스를 만들 뿐입니다. (클래스 및 모듈 이름과 클래스 및 모듈 이름은 상수입니다.
받아들여진 답은 아무것도 정확하지 않았습니다.아래 예제에서 나는 기존의 인클로저 클래스 인스턴스가 없는 사전적으로 폐쇄된 클래스의 인스턴스를 만듭니다.
class A; class B; end; end
A::B.new
모듈의 장점은 동일합니다. 캡슐화, 한 곳에서만 사용되는 코드 그룹화 및 코드를 사용하는 위치에 더 가깝게 배치하는 것입니다.대규모 프로젝트에는 각 소스 파일에서 반복적으로 발생하며 많은 클래스 정의를 포함하는 하나의 외부 모듈이 있을 수 있습니다.다양한 프레임워크와 라이브러리 코드가 모두 이를 수행할 때, 최상위 수준에 각각 하나의 이름만 기여하여 충돌의 가능성을 줄입니다.확실히 평범하지만, 그것이 그들이 사용되는 이유입니다.
모듈 대신 클래스를 사용하여 외부 네임스페이스를 정의하는 것은 단일 파일 프로그램이나 스크립트에서 의미가 있을 수 있습니다. 또는 이미 최상위 클래스를 무언가에 사용하고 있는 경우 또는 실제로 클래스를 함께 연결하는 코드를 추가하려는 경우에 유용합니다.루비는 내부 클래스가 없지만 코드에서 동일한 동작을 만드는 것을 막을 수 있는 것은 없습니다.내부 개체에서 외부 개체를 참조하는 경우에도 외부 개체의 인스턴스에서 점을 찍어야 하지만 클래스를 중첩하면 이러한 작업을 수행할 수 있음을 알 수 있습니다.신중하게 모듈화된 프로그램은 항상 먼저 둘러싸는 클래스를 만들 수 있으며, 중첩된 클래스 또는 내부 클래스로 적절하게 분해될 수 있습니다.전화할 수 없습니다.new모듈에
일반적인 패턴은 네임스페이스가 크게 필요하지 않은 스크립트에도 사용할 수 있습니다. 단지 재미와 연습을 위해...
#!/usr/bin/env ruby
class A
class Realwork_A
...
end
class Realwork_B
...
end
def run
...
end
self
end.new.run
클래스를 모듈로 그룹화하는 데 사용할 수 있습니다.일종의 네임스페이스 같은 것.
예를 들어 Twitter gem은 네임스페이스를 사용하여 다음을 수행합니다.
Twitter::Client.new
Twitter::Search.new
그래서 둘 다Client그리고.Search아래에 사는 수업들Twitter모듈.
소스를 확인하려면 두 클래스의 코드를 모두 여기와 여기에서 찾을 수 있습니다.
이것이 도움이 되길 바랍니다!
에는 다른 또2.5 Ruby 서 중 에 클 첩 된 스 와 이 답 는 다 이 변 못 지 또 다 루 있 생 한 다 니 합 각 언 고 기 다 여 야 서 해 급 이 데 는 점 차 른 이 한 첩 된 래 전 에 이 듈 중 른 모 사 다 ▁there ▁in조회 프로세스입니다.
이전의 에, 될. ( 간 히 말 서 : 2.5 이 서 전 루 상 최 일 루 잘 있 수 될 니 다 당 습 찾 게 단 클 를 스 중 래 된 첩 의 신 해 서 에 위 정 치 에 비 위 된 비 한 의 회 는 못 로 조 해 인Object중첩 클래스를 사용하는 경우에는 특히)를 선택합니다.
2.5 이전 :
중첩된 클래스 구조:수업이 있다고 가정합니다.X 클래스가 있는 Y또는X::Y그리고 당신은 또한 이름이 붙은 최상위 클래스가 있습니다.Y.한다면X::Y않은 에서 를 과 같이 . 전화를 걸면 다음과 같이 됩니다.X::Y:
수 없음YX루비는 그것을 조상들에게서 찾으려고 노력할 것입니다.X부터.부터X모듈이 아닌 클래스이며, 조상이 있으며, 그 중에는 다음이 있습니다.[Object, Kernel, BasicObject]그래서, 그것은 찾기 위해 노력합니다.YObject성공적으로 찾을 수 있습니다.
하지만 그것은 최고 수준입니다.Y그리고 아닌X::Y다음 경고가 표시됩니다.
warning: toplevel constant Y referenced by X::Y
중첩된 모듈 구조:앞의 예제에서X클래스가 아닌 모듈입니다.
있습니다: 모은자조상만가집로다니으신을듈.X.ancestors을 생산할 것입니다.[X].
이경, 루는자를 찾을 수 .Y▁of서의 조상 중 한 에서.X그리고 던질 것입니다.NameError로딩이 있는 다른 는 로드를 합니다.X::Y그 후에
자세한 내용은 다음 문서를 참조하십시오. https://blog.jetbrains.com/ruby/2017/03/why-you-should-not-use-a-class-as-a-namespace-in-rails-applications/
Ruby 2.5 버전:
최상위 수준의 상수 조회가 제거되었습니다.
이 버그가 발생할 우려 없이 중첩 클래스를 사용할 수 있습니다.
이전 답변에 추가하여: Ruby의 모듈은 클래스입니다.
$ irb
> module Some end
=> nil
> Some.class
=> Module
> Module.superclass
=> Object
언급URL : https://stackoverflow.com/questions/6195661/when-to-use-nested-classes-and-classes-nested-in-modules
'programing' 카테고리의 다른 글
| 이클립스의 SVN 비난 (0) | 2023.06.03 |
|---|---|
| 백그라운드에서 CSS 이미지 확장 및 축소 - CSS만 사용 (0) | 2023.06.03 |
| 호를 사용하여 세터 재정의 (0) | 2023.06.03 |
| 용기 크기를 기준으로 글꼴 크기 조정 (0) | 2023.06.03 |
| WPF(MVVM):보기 모델에서 보기를 닫으시겠습니까? (0) | 2023.05.29 |