[ruby] 클래스와 모듈의 차이점
Java에서 왔으며 이제 Ruby와 더 많은 작업을하고 있습니다.
내가 익숙하지 않은 언어 기능은 module
입니다. 나는 정확히 무엇 module
이고 언제 사용 하는지 궁금 하며 왜 module
over를 사용 class
합니까?
답변
첫 번째 대답은 좋으며 구조적 대답을 제공하지만 다른 접근 방식은 수행중인 작업에 대해 생각하는 것입니다. 모듈은 여러 클래스에서 사용할 수있는 메소드를 제공하는 것에 관한 것입니다. Rails 앱에서 볼 수 있듯이이를 “라이브러리”로 생각하십시오. 클래스는 객체에 관한 것입니다. 모듈은 기능에 관한 것입니다.
예를 들어 인증 및 권한 부여 시스템이 모듈의 좋은 예입니다. 인증 시스템은 여러 앱 수준 클래스에서 작동하며 (사용자는 인증되고, 세션은 인증을 관리하고, 다른 많은 클래스는 인증 상태에 따라 다르게 작동합니다.) 인증 시스템은 공유 API로 작동합니다.
여러 앱에서 메소드를 공유 할 때 모듈을 사용할 수도 있습니다 (다시 말해서 라이브러리 모델이 좋습니다).
답변
╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║ ║ class ║ module ║
╠═══════════════╬═══════════════════════════╬═════════════════════════════════╣
║ instantiation ║ can be instantiated ║ can *not* be instantiated ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ usage ║ object creation ║ mixin facility. provide ║
║ ║ ║ a namespace. ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ superclass ║ module ║ object ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ methods ║ class methods and ║ module methods and ║
║ ║ instance methods ║ instance methods ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inheritance ║ inherits behaviour and can║ No inheritance ║
║ ║ be base for inheritance ║ ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ inclusion ║ cannot be included ║ can be included in classes and ║
║ ║ ║ modules by using the include ║
║ ║ ║ command (includes all ║
║ ║ ║ instance methods as instance ║
║ ║ ║ methods in a class/module) ║
╟───────────────╫───────────────────────────╫─────────────────────────────────╢
║ extension ║ can not extend with ║ module can extend instance by ║
║ ║ extend command ║ using extend command (extends ║
║ ║ (only with inheritance) ║ given instance with singleton ║
║ ║ ║ methods from module) ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝
답변
아직 아무도이 말을하지 않은 것에 놀랐습니다.
asker는 Java 배경에서 나왔으므로 (그리고 나도 마찬가지), 여기에 도움이되는 비유가 있습니다.
클래스는 단순히 Java 클래스와 같습니다.
모듈은 Java 정적 클래스와 같습니다. Math
자바 클래스를 생각하십시오 . 인스턴스화하지 않고 정적 클래스 (예 :)의 메소드를 재사용합니다 Math.random()
.
답변
기본적으로 모듈을 인스턴스화 할 수 없습니다. 클래스에 모듈이 포함되면 모든 모듈 메소드와 클래스 메소드에 대한 액세스를 제공하는 프록시 수퍼 클래스가 생성됩니다.
모듈은 여러 클래스로 포함될 수 있습니다. 모듈은 상속 될 수 없지만이 “mixin”모델은 유용한 유형의 “다중 상속”을 제공합니다. OO 순수 주의자들은 그 진술에 동의하지 않지만, 순결이 일을 끝내는 것을 방해하지는 않을 것이다.
(이 답변은 원래에 연결 http://www.rubycentral.com/pickaxe/classes.html
되었지만 해당 링크 및 해당 도메인은 더 이상 활성화되어 있지 않습니다.)
답변
Module
루비에서 어느 정도는 Java 추상 클래스에 해당합니다. 인스턴스 메소드가 있으며 클래스는 클래스 메소드를 상속 할 수 있지만 ( include
루비 녀석은이를 “믹싱”이라고 함) 인스턴스는 없습니다. 다른 사소한 차이가 있지만이 많은 정보는 시작하기에 충분합니다.
답변
네임 스페이스 : 모듈은 네임 스페이스입니다 … Java에는 존재하지 않습니다.)
또한 Java와 Python에서 Ruby로 전환했는데 정확히 같은 질문이 있었음을 기억합니다 …
따라서 가장 간단한 대답은 모듈이 네임 스페이스이며 Java에는 존재하지 않는다는 것입니다. 자바에서 네임 스페이스에 가장 가까운 사고 방식은 패키지 입니다.
그래서 루비의 모듈은 java의
클래스 와 같습니다 : class? 어떤
인터페이스를하지? 어떤
추상 클래스하지? 어떤
패키지 없다? 예 (아마도)
자바 클래스 내부의 정적 메소드 : 루비의 모듈 내부 메소드와 동일
자바에서 최소 단위는 클래스이므로 클래스 외부에서는 함수를 가질 수 없습니다. 그러나 루비에서는 (파이썬과 같이) 가능합니다.
그렇다면 모듈은 무엇입니까?
클래스, 메소드, 상수. 모듈은 해당 네임 스페이스 아래에서이를 보호합니다.
인스턴스 없음 : 모듈을 사용하여 인스턴스를 만들 수 없음
혼합 기능 : 때로는 상속 모델이 클래스에는 좋지 않지만 기능면에서 클래스 / 메소드 / 상수 세트를 그룹화하려고합니다.
루비의 모듈에 대한 규칙 :
-모듈 이름은 UpperCamelCase입니다
-모듈 내의 상수는 모두 CAPS입니다 (이 규칙은 모듈에 한정되지 않은 모든 루비 상수에 대해 동일합니다)
-액세스 방법 : use. 연산자
-상수 액세스 : use :: symbol
모듈의 간단한 예 :
module MySampleModule
CONST1 = "some constant"
def self.method_one(arg1)
arg1 + 2
end
end
모듈 내에서 메소드를 사용하는 방법 :
puts MySampleModule.method_one(1) # prints: 3
모듈 상수를 사용하는 방법 :
puts MySampleModule::CONST1 # prints: some constant
모듈에 대한 몇 가지 다른 규칙 :
파일에서 하나의 모듈 사용 (예 : 루비 클래스, 루비 파일 당 하나의 클래스)
답변
결론 : 모듈은 정적 / 유틸리티 클래스와 믹스 인 간의 교차입니다.
믹스 인은 재사용이 가능한 “부분”구현으로, 믹스 앤 매치 방식으로 결합 (또는 구성)되어 새로운 클래스를 작성하는 데 도움이됩니다. 이러한 클래스는 물론 자체 상태 및 / 또는 코드를 가질 수 있습니다.