programing

클래스와 모듈의 차이

cafebook 2023. 6. 27. 23:38
반응형

클래스와 모듈의 차이

저는 자바에서 왔고, 지금은 루비와 더 많은 일을 하고 있습니다.

내가 잘 모르는 한 가지 언어 특징은module는 정히무엇궁금다니합이 정확히 .module그리고 당신은 언제 그것을 사용하고, 왜 그것을 사용합니까?module1파운드를 class?

╔═══════════════╦═══════════════════════════╦═════════════════════════════════╗
║               ║ 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)          ║
╚═══════════════╩═══════════════════════════╩═════════════════════════════════╝

첫 번째 답은 좋고 구조적인 답을 제공하지만, 또 다른 접근법은 여러분이 무엇을 하고 있는지 생각하는 것입니다.모듈은 여러 클래스에 걸쳐 사용할 수 있는 방법을 제공하는 것입니다. 모듈을 "라이브러리"라고 생각합니다(레일 앱에서 볼 수 있음).클래스는 객체에 관한 것이고 모듈은 함수에 관한 것입니다.

예를 들어, 인증 및 권한 부여 시스템은 모듈의 좋은 예입니다.인증 시스템은 여러 앱 레벨 클래스(사용자 인증, 세션 관리 인증, 다른 많은 클래스는 인증 상태에 따라 다르게 동작함)에서 작동하므로 인증 시스템은 공유 API 역할을 합니다.

여러 앱에서 메서드를 공유하는 경우에도 모듈을 사용할 수 있습니다(여기서는 라이브러리 모델이 좋습니다).

아직 아무도 이런 말을 하지 않았다니 놀랍군요.

질문자가 Java 출신이기 때문에(나도 마찬가지), 여기 도움이 되는 비유가 있습니다.

클래스는 단순히 Java 클래스와 같습니다.

모듈은 Java 정적 클래스와 같습니다.대해생다에 대해 생각해 .Math클래스를 Java로 지정합니다.인스턴스화하지 않고 정적 클래스에서 메서드를 재사용합니다(예: Math.random()).

기본적으로 모듈은 인스턴스화할 수 없습니다.클래스에 모듈이 포함되면 모든 모듈 메서드와 클래스 메서드에 대한 액세스를 제공하는 프록시 슈퍼클래스가 생성됩니다.

모듈은 여러 클래스에 의해 포함될 수 있습니다.모듈을 상속할 수는 없지만 이 "mixin" 모델은 유용한 유형의 "다중 상속"을 제공합니다.OOO 순수주의자들은 그 진술에 동의하지 않겠지만, 순수함이 일을 하는 데 방해가 되지 않도록 해야 합니다.


(이 (으)ㄹ 수 없는 것과 되어 있습니다.http://www.rubycentral.com/pickaxe/classes.html그러나 해당 링크와 해당 도메인은 더 이상 활성화되지 않습니다.)

네임스페이스: 모듈이 네임스페이스입니다...자바에는 존재하지 않는 ;)

저도 자바와 파이썬에서 루비로 바꿨습니다. 정확히 같은 질문이 있었던 것으로 기억합니다.

그래서 가장 간단한 답은 모듈이 자바에는 없는 네임스페이스라는 것입니다.자바에서 네임스페이스와 가장 가까운 마인드셋은 패키지입니다.

루비의 모듈은 자바의 모듈과 같습니다.
수업? 아니요
인터페이스?아니요.
추상 수업?아니요.
패키지?예(아마도)

Java의 클래스 내 정적 메서드: 루비의 모듈 내부 메서드와 동일

Java에서는 최소 단위가 클래스이므로 클래스 외부에 함수를 둘 수 없습니다.하지만 루비에서는 (파이썬처럼) 이것이 가능합니다.

그러면 모듈에는 무엇이 들어갈까요?
클래스, 메서드, 상수.모듈은 해당 네임스페이스 아래에서 해당 네임스페이스를 보호합니다.

인스턴스 없음: 모듈을 사용하여 인스턴스를 만들 수 없습니다.

혼합: 상속 모델이 클래스에 적합하지 않을 수도 있지만 기능 측면에서는 클래스/메소드/상수 집합을 함께 그룹화하려고 합니다.

루비의 모듈에 대한 규칙:
은 Upper 입니다.
모듈 내 상수는 ALL CAPS입니다(이 규칙은 모든 루비 상수에 대해 동일하며 모듈에 특정되지 않습니다).
방법use . : use . operator
상수:: " " " ": "

모듈의 간단한 예:

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

모듈에 대한 몇 가지 다른 규칙:
파일에 하나의 모듈 사용(루비 클래스, 루비 파일당 하나의 클래스)

Module루비에서, 어느 정도는, 자바 추상 클래스에 해당합니다 -- 인스턴스 메서드가 있고, 클래스는 그것으로부터 상속될 수 있습니다 (를 통해).include루비 남자들은 그것을 "믹스인"이라고 부르지만, 예는 없습니다.다른 사소한 차이도 있지만, 이 정도의 정보만 있으면 시작할 수 있습니다.

결론:모듈은 정적/유틸리티 클래스와 혼합 클래스 사이의 교차점입니다.

믹스인은 "부분" 구현의 재사용 가능한 부분으로, 믹스 앤 매치 방식으로 결합(또는 구성)하여 새로운 클래스를 작성하는 데 도움이 됩니다.물론 이러한 클래스는 자체 상태 및/또는 코드를 추가로 가질 수 있습니다.

학급

클래스를 정의할 때는 데이터 유형의 Blueprint를 정의합니다.클래스 홀드 데이터, 해당 데이터와 상호 작용하고 객체를 인스턴스화하는 데 사용되는 메서드가 있습니다.

모듈

  • 모듈은 메서드, 클래스 및 상수를 그룹화하는 방법입니다.

  • 모듈은 두 가지 주요 이점을 제공합니다.

    => 모듈은 네임스페이스를 제공하고 이름 충돌을 방지합니다.네임스페이스는 다른 사용자가 작성한 동일한 이름의 함수 및 클래스와의 충돌을 방지하는 데 도움이 됩니다.

    => 모듈은 mixin 설비를 구현합니다.

(클래즈의 Module을 포함하면 모듈 메소드에 대한 Clazz의 인스턴스 액세스를 제공합니다.)

(Clazz를 Mod와 함께 확장하여 클래스에 Mods 메서드에 대한 액세스 권한을 부여합니다.)

먼저, 아직 언급되지 않은 몇 가지 유사점입니다.루비는 개방형 수업을 지원하지만 모듈도 개방형입니다.결국 클래스는 클래스 상속 체인의 모듈에서 상속되므로 클래스와 모듈의 동작이 유사합니다.

하지만 프로그래밍 언어로 클래스와 모듈을 모두 사용하는 목적이 무엇인지 자문해 볼 필요가 있습니다.클래스는 인스턴스를 생성하기 위한 Blueprint이며, 각 인스턴스는 Blueprint의 실현된 변형입니다.인스턴스(instance)는 청사진(클래스)의 실현된 변형일 뿐입니다.그러면 당연히 클래스는 객체 생성 기능을 합니다.또한 하나의 Blueprint가 다른 Blueprint에서 파생되기를 원할 때가 있으므로 클래스는 상속을 지원하도록 설계되었습니다.

모듈은 인스턴스화할 수 없으며 개체를 만들지 않으며 상속을 지원하지 않습니다.따라서 한 모듈은 다른 모듈에서 상속되지 않습니다!

그렇다면 언어로 모듈을 사용하는 이유는 무엇입니까?모듈의 한 가지 분명한 사용법은 네임스페이스를 만드는 것이며, 다른 언어에서도 마찬가지입니다.다시 말하지만, 루비의 멋진 점은 모듈을 다시 열 수 있다는 것입니다(클래스와 마찬가지로).이는 서로 다른 Ruby 파일에서 네임스페이스를 재사용하려는 경우에 매우 유용합니다.

module Apple
  def a
    puts 'a'
  end
end

module Apple 
  def b
    puts 'b'
  end
end
 
class Fruit
  include Apple
end
 
 > f = Fruit.new
 => #<Fruit:0x007fe90c527c98> 
 > f.a
 => a
 > f.b
 => b

그러나 모듈 간에는 상속이 없습니다.

module Apple
  module Green
    def green
      puts 'green'
    end
  end
end
 
class Fruit
  include Apple
end

> f = Fruit.new
 => #<Fruit:0x007fe90c462420> 
> f.green
NoMethodError: undefined method `green' for #<Fruit:0x007fe90c462420>

Apple 모듈은 Green 모듈에서 메서드를 상속하지 않았으며, Apple을 Fruit 클래스에 포함시켰을 때 Apple 모듈의 메서드는 Apple 인스턴스의 상위 체인에 추가되지만, Green 모듈의 메서드는 Apple 모듈에 정의되지 않았습니다.

그렇다면 어떻게 하면 친환경적인 방법에 접근할 수 있을까요?클래스에 명시적으로 포함해야 합니다.

class Fruit
  include Apple::Green
end
 => Fruit 
 > f.green
=> green

그러나 Ruby는 Modules에 대한 또 다른 중요한 사용법을 가지고 있습니다.이것은 제가 SO에 대한 다른 답변에서 설명한 Mixin 시설입니다.그러나 요약하면 mixin을 사용하면 개체의 상속 체인에 메서드를 정의할 수 있습니다.mixin을 통해 객체 인스턴스의 상속 체인(포함) 또는 singleton_class of self(확장)에 메서드를 추가할 수 있습니다.

언급URL : https://stackoverflow.com/questions/151505/difference-between-a-class-and-a-module

반응형