Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby on Rails의 다형성 마스터하기:실용 가이드

객체 지향 프로그램(OOP)을 구축하는 데 시간을 보낸 적이 있다면 애플리케이션에서 다형성을 사용했거나 최소한 그 용어를 들어봤을 것입니다.

과학이나 컴퓨터 과학 교과서에서 볼 수 있는 종류의 단어입니다. 다형성을 연구하고 개념을 명확하게 이해하지 못한 채 애플리케이션에 구현하는 데 시간을 소비했을 수도 있습니다.

이 기사에서는 특히 Ruby on Rails의 다형성에 대해 더 잘 이해할 수 있습니다. 이를 달성하기 위해 우리는 다음 사항에 대해 알아볼 것입니다:

  • 실제 세계에서의 다형성 사용
  • OOP를 통한 프로그래밍의 다형성
  • 고품질 코드를 유지하기 위해 이를 Rails 애플리케이션에 통합하는 방법

가자!

현실 세계의 다형성

다양한 상황에서 다형성을 정의하는 방법에는 여러 가지가 있습니다. 문맥에 관계없이 유용한 정의는 '하나 이상의 형태를 표시하는 개체의 능력'입니다. . 실제로 단어 자체를 분해하면 폴리는 '다수'를 의미하고 모르프는 '형태'를 의미합니다.

현실 세계에서 이 정의의 기본적인 예는 경찰관, 자매, 누군가의 자녀, 누군가의 어머니 등이기도 한 여성이 될 수 있습니다. 각 역할은 그녀의 행동을 결정하고 그녀가 누구인지에 기여합니다.

다형성과 유전학

컴퓨터 프로그래밍 외부에서 다형성은 일반적으로 생물학 및 유전학과 관련된 용어입니다. 이러한 맥락에서 다형성은 한 종 내에서 개체의 여러 가지 뚜렷한 형태나 유형을 초래하는 유전적 변이로 더욱 구체적으로 정의됩니다.

재규어를 생각해 보세요. 재규어는 다양한 유전자 변이를 가질 수 있으며 이는 모피 색상에 영향을 줄 수 있습니다. 대부분의 재규어는 검은색 원이 있는 황갈색 색상을 가지고 있습니다. 그러나 유전자 변형으로 인해 더 밝거나 어두운 원이 나타날 수 있으며, 일부는 검은 털 색깔을 가질 수도 있습니다.

같은 종의 새 내에서 다른 색소 침착은 다형성의 또 다른 예입니다. 개체별로 색상이 확연히 구분되는 굴디안 핀치를 생각해 보세요.

단형성 대 다형성

단형성에 관심을 돌리면 다형성을 더 잘 이해할 수 있습니다. 생물학을 고수하면서 단형성은 '단지 한 가지 형태만을 지닌 종'으로 정의할 수 있습니다. , 개발의 다양한 단계에서 동일한 형태를 유지합니다.

펭귄은 단일형이다. 전문가라도 성별을 구별하는 것은 어렵습니다. 펭귄의 유전자 차이는 미미합니다. 따라서 펭귄의 신체적 특성은 특히 크기와 흑백 색상 측면에서 거의 구별할 수 없습니다.

행동 단서는 단일형 종의 성별을 식별하는 가장 쉬운 방법인 경우가 많습니다.

특히 프로그래밍의 다형성에 주목해 보겠습니다.

OOP의 다형성

다형성의 초기 정의, 즉 객체가 두 개 이상의 형태를 표시하는 능력을 고려한다면 — 이를 OOP와 원활하게 연관시킬 수 있습니다.

OOP에서는 동일한 방법을 사용하여 별도의 개체를 전달하여 다른 결과를 생성할 수 있습니다. 이를 달성하기 위해 조건문을 사용할 수 있습니다. 그러나 이로 인해 덩어리진 코드가 생성될 수 있으며 DRY 원칙에서 멀어질 수 있습니다. 다형성은 깨끗하고 논리적인 OOP 애플리케이션을 만드는 데 필수적입니다.

Ruby와 같은 OOP 언어에서 상속과 오리 타이핑을 통해 다형성을 구현하는 방법에 대한 두 가지 예를 살펴보겠습니다.

루비의 다형성과 상속

상속은 하위 클래스가 상위 클래스의 속성을 상속받는 것입니다.

다음은 상속을 통해 다형성을 구현하는 방법의 예입니다.

 

위 코드에는 두 개의 하위 클래스(Stringed)가 있습니다. 그리고 Percussion — 상위 클래스 Instrument에서 상속됨 . 이 예는 메소드를 호출하므로 다형성입니다:instrument_example — 그리고 여러 형식을 출력합니다:Saxophone , GuitarDrums .

상속을 통해 다형성을 달성하는 이 예는 본질적으로 메서드를 재정의하지만 OOP 언어의 다형성을 더 명확하게 이해하는 데 도움이 됩니다.

Ruby의 오리 유형 지정 및 다형성

OOP의 다형성에 대한 보다 실용적인 예는 아래에서 참조하는 것처럼 덕 타이핑을 통한 것입니다.

 

각 클래스 메소드의 이름은 brand이지만 , 우리는 (다형성 상속과 달리) 메서드를 재정의하지 않습니다. 부모 클래스에서 상속받는 대신 여기에는 각각 고유한 메서드를 가진 4개의 독립적인 클래스가 있습니다. Duck-typing은 클래스를 반복하여 각 메서드의 출력을 얻을 수 있기 때문에 유용합니다(각 메서드를 개별적으로 호출하는 것과 반대).

다시 말하지만, 덕 타이핑은 메소드를 호출할 때 다형성입니다 — brand — 그리고 여러 형식의 출력을 생성합니다:Gibson , Pearl , FenderCasio . 물론 이러한 결과를 생성하는 데 오리 유형 지정과 다형성이 필수적인 것은 아닙니다. 하지만 깔끔하고 논리적인 코드를 구현하는 것은 매우 유용합니다.

Ruby on Rails의 다형성

다형성은 Ruby on Rails에서 Active Record 연결로 잘 작동합니다. 모델이 본질적으로 동일한 작업을 수행하는 경우 이를 하나의 단일 모델로 전환하여 다형성 관계를 만들 수 있습니다.

악기 테마를 고수하면서 사용자가 악기를 게시하고 댓글을 달고 검토할 수 있는 애플리케이션을 고려해 보겠습니다. 아래의 ERD(엔티티 관계 다이어그램)를 살펴보세요.

Ruby on Rails의 다형성 마스터하기:실용 가이드

이 예에는 사용자가 세부 정보와 함께 계측기를 게시할 수 있는 애플리케이션에 대한 ERD가 있습니다. 사용자는 게시된 상품에 대한 의견을 제공할 수도 있습니다.

그런 다음 다른 사용자는 도구에 대한 평가를 제공하고 의견을 평가하여 유용성이나 타당성을 판단할 수 있습니다. 이러한 Active Record 연결은 잘 작동하며 우리 애플리케이션의 목적에 부합합니다.

애플리케이션에 다른 연결을 추가하고 싶다면 어떻게 해야 할까요? 중복 연결을 추가하고 반복해야 합니다.

예를 들어 user_rating을 추가하려는 경우 사용자의 신뢰성을 평가하기 위해 모델을 사용하려면 자체 연결이 있는 별도의 테이블을 만들어야 합니다. 이는 user 사이에 새로운 관계를 추가하는 것을 의미합니다. 및 user_rating 모델. 그러면 ERD는 다음과 같이 보일 것입니다:

Ruby on Rails의 다형성 마스터하기:실용 가이드

이제 본질적으로 동일한 작업을 수행하는 세 가지 모델이 있습니다. 즉, 개체를 평가하지만 다른 맥락에서 평가합니다. 이러한 연관성은 다형성 연관성에 적합합니다.

다형성 평가 모델을 사용하는 ERD를 살펴보겠습니다.

Ruby on Rails의 다형성 마스터하기:실용 가이드

rating이 있으므로 열에서 모델 이름을 reviews로 지정했습니다. ratings와 반대 혼란을 피하기 위해. 여기서 비리뷰 모델은 여전히 다른 모델과 연관되어 있지만 별도의 평가 모델이 단일 리뷰 모델로 병합되었습니다.

reviewable_typereviewable_id 이제 리뷰가 어떤 모델과 연결되어 있는지 표시하여 별도의 평가 모델과 동일한 역할을 맡습니다.

reviewable_type 열에는 모델 클래스 이름(user)이 저장됩니다. , instrument_post 또는 comment ) 및 reviewable_id 해당 모델의 해당 ID를 저장합니다.

이제 이 두 열을 사용하여 Active Record 쿼리 및/또는 조건문을 통해 등급 정수를 특정 사용자, 게시물 또는 댓글과 연결할 수 있습니다. 외래 키 user_id 리뷰 모델에 남아 있으며 이를 통해 어떤 사용자가 리뷰를 남겼는지 추적할 수 있습니다.

지금은 다형성 모델에서 '-able'이라는 용어가 이상하게 보일 수 있지만 Rails의 마법을 사용하면 그 목적이 곧 분명해질 것입니다.

사용자, 댓글, 기기 게시물 리뷰 등 다양한 형태를 표현하고 취할 수 있는 하나의 모델 또는 객체가 있기 때문에 리뷰 모델은 다형성으로 간주됩니다.

Ruby on Rails에서 다형성 구현

Rails 애플리케이션에서 다형성을 구현할 시간입니다! user을 이미 생성한 것처럼 행동한다면 , instrument_postcomment 모델을 사용하여 다형성 모델 통합을 시작할 수 있습니다:reviews .

먼저 다음과 같이 테이블을 생성하고 터미널에서 모델을 생성합니다:

 

그러면 마이그레이션 파일이 작성됩니다:

 

schema.rb 마이그레이션이 실행된 후 파일이 업데이트됩니다. 다형성 옵션은 reviewable를 변환합니다. 열을 reviewable_type에 추가하세요. 및 reviewable_id 열:

 
 

위에서 '-able'이라는 용어를 언급했던 것을 기억하시나요? 이는 다형성 연관을 지정하기 위한 Rails 명명 규칙으로, 사용자, 도구 게시물 및 댓글을 '검토 가능'하게 만드는 기능을 제공합니다.

이 Rails 마법이 작동하려면 다른 모델이 다형성 모델과 올바르게 연결되어 있는지 확인해야 합니다.

 
 
 

user , instrument_postcomment 이제 모델을 검토하고 평가할 수 있습니다.

이미 두 명 이상의 사용자, 댓글 및 도구 게시물을 생성한 경우 다음과 같이 활성 레코드 쿼리를 사용하여 다양한 방법을 통해 리뷰를 생성하고 액세스할 수 있습니다:

 
 
 
 

reviews과 상호작용하는 다른 방법도 많이 있습니다. 렌더링해야 하는 데이터에 따라 모델을 선택할 수 있습니다. 상위 모델이 리뷰를 작성하는 방법을 공유하는 것이 중요합니다. 리뷰가 사용자 및 리뷰 가능한 모델과 연결되어 있는 한 Active Record는 자동으로 reviewable_id를 연결합니다. 및 reviewable_type 관련 모델과 함께.

Rails 예제에서 다형성이 없으면 더 많은 테이블, 불필요한 중복 열, belongs_to이 있을 것입니다. 및 has_many 우리 모델의 연관성. 다형성을 통해 테이블 조인의 필요성이 줄어들어 보다 쉽고 빠른 Active Record 쿼리 및 연결이 가능해졌습니다.

마무리:깔끔하고 논리적인 Ruby 코드를 위한 다형성 사용

이 게시물에서 우리는 생물학과 Ruby 프로그래밍이라는 두 가지 서로 다른 환경에서 다형성을 탐구했습니다. 두 경우 모두 다형성은 객체가 둘 이상의 형태를 표시하는 능력입니다.

Ruby on Rails에서 다형성의 사용을 구체적으로 살펴보기 전에 상속 및 오리 타이핑을 통해 Ruby에서 다형성을 구현하는 방법을 살펴보았습니다.

다형성은 깔끔하고 논리적인 코드를 작성하는 데 도움이 됩니다. 제 목표는 현재, 미래는 물론 과거 애플리케이션을 위한 도구 벨트에 이 필수적인 OOP 개념을 추가하도록 돕는 것입니다.

즐거운 코딩 되세요!

추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!