Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 상속 설명 – 오늘 OOP를 배우십시오!

클래스 상속은 모든 클래스의 보다 구체적이고 전문화된 버전을 만드는 데 도움이 되는 기본적인 OOP(객체 지향 프로그래밍) 기능입니다.

예시 :

Food -> Fruit -> Orange

이 클래스들 사이에는 관계가 있습니다!

오렌지는 과일이지만 과일도 음식이라고 할 수 있습니다.

상위 클래스(수퍼 클래스라고도 함) 또는 기본 클래스 )는 항상 하위 클래스보다 더 일반적입니다.

Fruit (더 일반적인) Orange의 상위 클래스입니다. (보다 구체적으로).

Ruby에서는 다음과 같이 표시됩니다. :

class Food
end

class Fruit < Food
end

class Orange < Fruit
end

상속의 의미 중 하나 Ruby에서는 Food에 정의된 모든 메서드와 모든 상수가 Fruit에서 사용할 수 있습니다. 및 Orange에서도 .

메서드는 기본 클래스에서 전달되지만 그 반대는 아닙니다.

상속의 목적은 무엇입니까?

개체 계층 구조를 생성하면 코드에 대해 일종의 "기분 좋은" 구성을 제공할 수 있다고 생각할 수 있지만 여기에는 훨씬 더 많은 것이 있습니다.

상속은 특정 목적에 맞는 다른 버전의 부모 클래스를 만드는 데 사용됩니다. 부모 클래스에서는 이해되지 않는 추가 기능이나 메서드가 필요할 수도 있습니다.

예시 :

모든 과일에는 색깔, 무게, 이름이 있습니다.

일부 과일에는 다른 과일과 공유되지 않는 특별한 특성이 있을 수 있으므로 모든 과일의 특성(색상, 무게 등)을 상속하는 새 클래스를 만든 다음 해당 특성을 추가합니다.

이것이 제가 말하는 전문화입니다.

또 다른 예 :

데이터베이스에 쓰는 클래스가 있지만 모든 데이터베이스 작업을 기록하는 다른 버전의 클래스(디버깅용)가 필요합니다.

이 경우 데코레이터 패턴이 필요합니다.

이 기사에 대한 자세한 설명을 읽을 수 있지만 기본 아이디어는 상속을 사용하여 다른 클래스를 래핑한 다음 여기에 새로운 것을 추가하는 것입니다.

원본을 변경할 필요 없이!

실제 세계에서의 상속

알겠습니다.

상속에 대해 배웠지만 Ruby 개발자로서 매일 사용하고 있다는 사실, 알고 계셨나요?

Ruby 자체는 상속을 사용합니다. 다음과 같은 방법을 활성화하려면:

  • puts
  • class
  • super

이는 모든 Ruby 객체가 Object 기본적으로 클래스입니다.

따라서 이와 같은 클래스를 만들면 :

class Apple
end

상위 클래스는 Object입니다. :

Apple.superclass
# Object

그렇기 때문에 위에서 언급한 것과 같은 방법을 사용할 수 있습니다.

예를 들어 puts를 호출할 때 Ruby는 클래스에서 이 메서드를 찾습니다.

그럼 :

  • 상위 클래스 중 하나에서 메소드를 찾습니다.
  • 발견되지 않으면 개체에서 다시 시작하고 method_missing을 찾으려고 시도합니다.
  • 발견되지 않으면 NoMethodError가 발생합니다. 또는 NameError 명시적 개체 없이 메서드가 호출된 경우(a.sizesize , 여기서 a 명시적 개체임)

Rails에서 상속의 더 많은 예를 찾을 수 있습니다.

바로 여기 :

class ApplicationController < ActionController::Base
end

컨트롤러 :

class SessionsController < ApplicationController
end

모델 :

class Comment < ApplicationRecord
  belongs_to :article
end

상속은 Ruby의 모든 곳에 있지만 때로는 올바른 솔루션이 아닙니다.

구성:상속에 대한 대안

상속에는 특정 제한 사항이 있습니다.

예를 들어 :

부품으로 컴퓨터를 만들고 싶습니다.

우리는 컴퓨터에 부품이 있지만 개별 부품이 그 자체로 컴퓨터가 아니라고 말합니다.

분해하면 제 기능을 할 수 없습니다.

다른 것이 필요합니다...

구성이 필요합니다!

구성은 기능을 수행하기 위해 서로 다른 부분이 함께 모이는 클래스를 만듭니다.

마치 컴퓨터처럼.

작성 작업의 예 :

class Computer
  def initialize(memory, disk, cpu)
    @memory = memory
    @disk   = disk
    @cpu    = cpu
  end
end

컴퓨터에는 작동에 필요한 부품이 제공됩니다.

구성입니다.

리스코프 치환 원리

상속은 올바른 상황에서 사용될 때 강력합니다.

그러나 모든 도구와 마찬가지로 남용될 수 있습니다!

사실, 원래 Design Patterns 책에 다음과 같은 인기 있는 인용문이 있습니다.

<블록 인용>

"상속보다 구성을 선호합니다."
디자인 패턴:재사용 가능한 객체 지향 소프트웨어의 요소

상속을 올바르게 사용하고 있는지 확인하려면 당신이 따를 수 있는 한 가지 원칙이 있습니다. L SOLID에서.

"리스코프 치환 원리"의 약자입니다.

즉, 기본 클래스 대신 하위 클래스를 사용할 수 있어야 합니다.

:

Fruit에서 상속하는 경우 &color 가 문자열이면 color를 변경하고 싶지 않습니다. 하위 클래스에서 기호를 반환합니다.

:

Fruit 사용자 color에 의존 문자열을 반환합니다.

class Fruit
  def color
    "orange"
  end
end

이것은 LSP를 깨뜨립니다. :

class Orange < Fruit
  def color
    :orange
  end
end

color을 변경하면 기호를 반환하려면 Fruit를 바꿀 수 없습니다. Orange이 있는 개체 .

왜?

split와 같은 메소드를 호출하면 기호에 오류가 발생합니다.

심볼에는 없는 방법입니다.

하지만 문자열은 그렇습니다.

또 다른 위험 신호는 하위 클래스가 상위 클래스의 진정한 전문화가 아니고 상위 클래스를 사용하여 유틸리티 메서드를 공유하는 경우입니다.

요약

Ruby의 상속 및 구성에 대해 배웠습니다!

상속을 사용할 수 있습니다. 상위 클래스의 특수 버전 생성 및 구성 구성 요소를 전체로 결합합니다. LSP를 따라야 합니다. 엉망이 되고 싶지 않다면 원칙입니다.

이제 더 나은 객체 지향 코드를 작성할 수 있습니다 🙂

읽어주셔서 감사합니다.