프로그래밍에서의 위임은 프로그램의 한 부분에서 다른 부분으로 작업을 전달하는 것을 의미합니다. 이는 객체 지향 프로그래밍의 필수 기술로, 각 객체나 메소드가 특정 작업이나 동작을 담당하도록 하여 깔끔하고 유지 관리 가능한 코드를 강화합니다.
위임을 이해하고 사용하는 것은 Ruby와 기타 객체 지향 언어를 마스터하는 데 핵심입니다. 위임은 문제 분리를 촉진하여 코드를 더욱 모듈화하고 이해, 테스트 및 리팩토링하기 쉽게 만듭니다.
이 글에서는 Ruby에서 위임을 달성하는 세 가지 방법을 살펴보겠습니다. 명시적 위임을 사용하는 Forwardable 모듈 및 ActiveSupport::Delegate (레일용).
시작해 보세요!
Ruby에서의 위임
명시적 위임에 대해 논의하는 것부터 시작해 보겠습니다. 즉, 메서드 내에서 메서드를 호출하는 것입니다. 그런 다음 내장된 Forwardable를 살펴보겠습니다. 모듈과 위임을 간소화하는 방법. 마지막으로 ActiveSupport::Delegate를 다루겠습니다. , 유용한 기능을 갖춘 Rails 전용 위임 도구입니다.
명시적 위임
가장 간단한 형태의 위임은 다른 메서드 내에서 메서드를 명시적으로 호출하여 수행할 수 있습니다. 이 접근 방식은 위임된 메서드가 별도의 개체에 속하거나 위임이 더 고급 기술을 사용할 필요가 없을 만큼 단순할 때 자주 사용됩니다.
Ruby에서 명시적 위임을 구현하는 것은 간단합니다. Printer의 예를 들어보겠습니다. 텍스트를 인쇄하기 위해 HP 개체를 사용하는 클래스:
위의 예에서 Printer의 인쇄 방법은 클래스는 서식 지정 작업을 HP에 명시적으로 위임합니다. 클래스의 형식 메서드를 호출하여 클래스를 생성합니다. 이 위임은 간단하고 읽기 쉬운 방식으로 인쇄 책임을 다른 클래스에 아웃소싱합니다.
명시적 위임은 문제와 유지 관리 가능한 코드의 분리를 촉진하는 데 도움이 되므로 실제 애플리케이션에서 일반적입니다. 예를 들어, 한 서비스가 특정 작업을 수행하기 위해 다른 서비스를 호출하는 다양한 서비스 간의 통신이 필요한 애플리케이션에서 이 기술이 사용되는 것을 볼 수 있습니다.
또한 명시적 위임은 외부 코드와의 상호 작용을 격리할 수 있으므로 타사 라이브러리 주변에 어댑터나 래퍼를 구축할 때 유용할 수 있습니다.
요약하면, 명시적 위임은 Ruby에서 객체 간 작업을 위임하는 간단하고 효과적인 방법입니다. 다른 메서드 내에서 메서드를 호출하면 책임을 쉽게 위임할 수 있어 코드 유지 관리가 더 용이해지고 문제 분리가 촉진됩니다.
Ruby의 전달 가능 모듈
Forwardable 모듈은 명시적 위임에 비해 메서드를 위임하는 더 간편하고 유연한 접근 방식을 제공하는 내장 Ruby 라이브러리입니다. 클래스에 Forwardable 모듈을 포함하면 def_delegator와 같은 메서드에 액세스할 수 있습니다. 및 def_delegators , 위임이 간편해집니다.
Forwardable 모듈을 시작하려면 해당 모듈을 클래스에 포함시키고 def_delegator를 사용하세요. 및 def_delegators 하나 또는 여러 개의 메서드를 각각 위임하는 메서드입니다. 새로운 Formatter를 사용하여 프린터 예제를 다시 살펴보겠습니다. 클래스를 생성하고 Forwardable 모듈을 구현합니다:
위 예에서는 def_delegator를 사용했습니다. Formatter 클래스에서 형식 메서드를 위임합니다. 한 번에 여러 메서드를 위임해야 하는 경우 def_delegators를 사용할 수 있습니다. . 예를 들어, Formatter 클래스에는 capitalize와 같은 추가 메서드가 있습니다. , 다음과 같이 위임할 수 있습니다:
Forwardable 모듈을 사용할 때 고려해야 할 몇 가지 중요한 잠재적인 단점이 있습니다:
- 먼저 위임을 사용하기 전에 대상 개체가 초기화되었는지 확인하세요. 그렇지 않으면 오류가 발생할 수 있습니다.
- 둘째, 위임을 과도하게 사용하면 어떤 메소드가 클래스에 속하고 어떤 메소드가 위임되는지가 불분명해지기 때문에 코드 가독성에 혼란을 초래할 수 있습니다.
- 마지막으로 Forwardable을 사용하면 직접 메서드 호출에 비해 약간의 성능 오버헤드가 발생할 수 있습니다. 그러나 이 오버헤드는 일반적으로 대부분의 애플리케이션에서 무시할 수 있습니다.
Forwardable 모듈에 대한 자세한 내용은 Forwardable 문서를 참조하세요.
ActiveSupport::Delegate Rails 애플리케이션용
ActiveSupport::Delegate Rails에서 제공하는 위임 유틸리티로, 연관된 객체에 메서드를 위임하기 위한 간결한 구문을 제공합니다. Ruby의 내장 Forwardable 모듈과 유사점을 공유하지만 ActiveSupport::Delegate Rails 애플리케이션에 맞는 추가 옵션과 기능을 제공합니다.
ActiveSupport::Delegate을 사용하려면 , 클래스에서 대리자 메서드를 호출하고 대상 개체와 함께 위임할 메서드를 지정하기만 하면 됩니다. 프린터 및 포맷터 예제를 다시 살펴보고 ActiveSupport::Delegate를 사용하여 위임을 구현해 보겠습니다. :
ActiveSupport::Delegate 다양한 시나리오에서 유용할 수 있는 추가 옵션과 기능을 제공합니다. 예를 들어 :prefix을 사용할 수 있습니다. 위임된 메서드 앞에 접두사를 추가하는 옵션입니다. 여러 메소드를 한꺼번에 위임하려면 to: 앞에 나열하면 됩니다. 옵션:
이는 formatter_format와 같은 메소드를 생성합니다. , formatter_bold 및 formatter_italic Printer에서 클래스, Formatter의 각 메서드에 위임 수업.
ActiveSupport::Delegate 실제 Rails 프로젝트에서 관련 모델이나 객체 간에 메서드를 위임하는 데 일반적으로 사용됩니다. 예를 들어 User이 있는 경우 belongs_to 모델 조직의 경우 organization에서 이름 방법을 위임할 수 있습니다. 모델을 User로 다음과 같은 모델:
이를 통해 사용자 개체(user.organization_name)를 통해 조직 이름에 액세스할 수 있습니다. .
결론적으로 ActiveSupport::Delegate 간결하고 표현력이 풍부한 메소드 위임을 가능하게 하는 Rails 애플리케이션을 위한 강력한 도구입니다. 추가 옵션과 기능을 활용하면 Rails 프로젝트의 맥락에서 객체 지향 프로그래밍 원칙을 준수하는 유지 관리가 가능하고 잘 구성된 코드를 생성할 수 있습니다.
ActiveSupport::Delegate에 대한 자세한 내용을 보려면 사용 가능한 모든 옵션은 Rails ActiveSupport 문서를 참조하세요.
위임 기법 비교
명시적 위임은 위임에 대한 가장 간단한 접근 방식으로, 위임된 개체에서 원하는 메서드를 호출하는 수동으로 정의된 메서드가 필요합니다. 이 기술은 간단하고 외부 라이브러리가 필요하지 않지만 메서드 수가 늘어나면 위임할 때 너무 장황해질 수 있습니다.
Ruby에 내장된 Forwardable 모듈은 메서드를 위임하는 보다 효율적인 방법을 제공합니다. def_delegator를 사용하여 및 def_delegators 방법을 사용하면 하나 또는 여러 가지 방법을 간결하게 위임할 수 있습니다.
ActiveSupport::Delegate Rails의 ActiveSupport 라이브러리의 일부인 는 메서드 위임을 처리하는 선언적 방법을 제공합니다. 깔끔한 구문과 접두어 지정과 같은 추가 옵션을 사용하면 Rails 컨텍스트에서 표현이 풍부한 도구입니다. 명시적 위임과 비교하면 ActiveSupport::Delegate 특히 여러 메서드를 위임할 때 더욱 표현력이 뛰어나고 덜 장황합니다. 그러나 Rails가 필요하므로 Rails가 아닌 Ruby프로젝트에는 적합하지 않습니다.
위임 기술 선택은 특정 요구 사항과 응용 프로그램에 따라 다릅니다. 명시적 위임은 단순성과 명확성을 제공하는 반면 Forwardable 모듈은 보다 간소화된 접근 방식과 ActiveSupport::Delegate를 제공합니다. 강력한 Rails 관련 솔루션을 제공합니다. 이러한 옵션을 이해하면 프로젝트와 코딩 스타일에 가장 적합한 기술을 선택할 수 있습니다.
마무리
명시적 위임부터 내장 Forwardable 모듈 또는 Rails 전용ActiveSupport::Delegate 사용까지 , 각 기술은 고유한 이점과 잠재적인 단점을 제공합니다. 선택해야 하는 기술은 특정 상황, 프로젝트 성격 및 개인 코딩 스타일에 따라 다릅니다.
이러한 기술을 이해하면 Ruby 프로그래밍 기술이 확장될 뿐만 아니라 더 모듈화되고 읽기 쉽고 유지 관리 가능한 코드를 작성할 수 있게 됩니다. 이러한 지식을 바탕으로 설득력 있는 디자인으로 복잡한 문제를 해결할 준비를 더 잘 갖추게 됩니다.
위임해 주셔서 감사합니다!
추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!
제프 모후스
게스트 저자인 Jeff Morhous는 환자가 필요한 약을 얻을 수 있도록 코드를 작성하고 버그를 수정하는 소프트웨어 엔지니어입니다. 요즘은 Ruby on Rails를 사용하여 웹 애플리케이션을 만드는 데 주력하고 있지만 과거에는 iOS 및 Android 개발에 Swift, Java, Kotlin을 사용했습니다.
Jeff Morhous의 모든 기사