문제

나는 루비를 읽고 믹스 인 패턴에 대해 배웠지 만 많은 유용한 믹스 인 기능을 생각할 수 없었습니다 (그렇게 생각하는 데 익숙하지 않기 때문에). 그래서 유용한 Mixin 기능의 좋은 예가 무엇인지 궁금했습니다.

감사

편집 : 약간의 배경. 나는 C ++와 다른 객체 언어에서 왔지만 여기서 루비는 믹스 인을 물려받지 않는다고 말하지만 믹스 인스가 여러 상속을 계속보고 있다고 말하면서 너무 빨리 안락 지대로 분류하려고 할까봐 두려워합니다. , 그리고 실제로 믹스 인이 무엇인지 실제로 집어 넣지 마십시오.

도움이 되었습니까?

해결책

글쎄, 내가 생각하는 일반적인 예는 끈기라고 생각합니다

module Persistence
    def load sFileName
            puts "load code to read #{sFileName} contents into my_data"
    end
        def save sFileName
        puts "Uber code to persist #{@my_data} to #{sFileName}"
    end

end

class BrandNewClass
    include Persistence
    attr :my_data

        def data=(someData)
        @my_data = someData
    end
end

b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"

모듈이 루비 닌자 (Ruby Ninja)에 의해 작성되었다고 상상해보십시오.
이제 새로운 클래스를 작성한다고 가정 해보면 말을 통해 섞어 지속성의 기능을 재사용 할 수 있습니다. include ModuleILike. 런타임에 모듈을 포함시킬 수도 있습니다. 나는 단지 그것을 혼합하여 무료로로드하고 저장 방법을 얻습니다.이 방법은 수업을 위해 자신을 쓴 방법과 같습니다. 상속없이 코드/행동/기능 반복!

따라서 당신이하는 일은 수업을위한 메소드 테이블에 방법을 포함하는 것입니다 (말 그대로 정확하지는 않지만 가깝습니다).

다른 팁

일반적으로 모든 형태의 표준 기능을 클래스에 추가하는 데 사용됩니다. 아마도 Java의 인터페이스와 비슷하게 생각할 수 있지만 구현 해야하는 메소드 목록을 정의하는 대신 많은 것들이 실제로 ~이다 모듈을 포함하여 구현.

표준 라이브러리에는 몇 가지 예가 있습니다.

싱글 톤 - 싱글 톤으로 만들기 위해 모든 클래스에 혼합 할 수있는 모듈. 초기화 메소드는 비공개로 만들어지고 인스턴스 메소드가 추가되어 응용 프로그램에 해당 클래스의 인스턴스가 하나만 있음을 보장합니다.

비교 가능 -이 모듈을 클래스에 포함 시키면, 현재 인스턴스를 다른 객체와 비교하고 더 큰 말을하는 <=> 메소드를 정의하면 <, <=, ==,> =,>, 그리고 사이? 행동 양식.

열거 가능 -이 모듈을 혼합하고 정의하여 방법, 수집, 주입, 선택 및 거부와 같은 다른 모든 관련 방법에 대한 지원을받습니다. <=> 메소드도 얻으면 Sort, Min 및 Max도 지원합니다.

DataMapper는 또한 간단한 포함 명세서로 수행 할 수있는 일에 대한 흥미로운 예입니다.

루비에서 믹스 인이 다중 상속이 아닌 이유는 믹스 인 방법을 결합하는 것이 한 번이기 때문입니다. 루비의 모듈과 클래스가 수정에 열려 있다는 점을 제외하고는 큰 문제는 아닙니다. 이것은 모듈을 클래스에 혼합 한 다음 메소드에 메소드를 추가한다는 것을 의미합니다. ~하지 않을 것이다 수업에 사용할 수 있습니다. 당신이 반대 순서대로 그것을했다면 그것은 그럴 것입니다.

아이스크림 콘을 주문하는 것과 같습니다. 믹스 인으로 초콜릿 뿌리와 토피 비트를 얻고 원뿔로 걸어 가면 아이스크림 가게에서 누군가가 초콜릿 스프링클 빈에 여러 가지 색상을 뿌리는 경우 어떤 종류의 아이스크림 콘이 바뀌지 않을 것입니다. 당신의 클래스, 아이스크림 콘은 믹스 린 모듈, 스프링클이있는 경우 수정되지 않습니다. 다음 믹스 인 모듈을 사용하는 사람은 변경 사항을 볼 수 있습니다.

때를 include 루비의 모듈은 호출됩니다 Module#append_features 해당 모듈에서 해당 모듈의 메소드의 사본을 Includer에 한 번 추가합니다.

내가 이해 한 바와 같이 다중 상속은 대표단과 비슷합니다. 수업이 무언가를하는 방법을 모른다면 부모에게 묻습니다. 오픈급 환경에서 수업이 만들어진 후 수업의 부모가 수정되었을 수 있습니다.

그것은 RL 부모-자식 관계와 같습니다. 당신의 어머니는 당신이 태어난 후 저글링하는 법을 배웠을 수도 있지만, 누군가가 저글링을 요청하고 그녀에게 그녀에게 물어 보라고한다면 : 당신에게 어떻게 (필요할 때 그것을 복사하거나) 당신을 위해 그것을하는 방법을 보여 주거나 (순수한 대표단), 그녀는 그녀에게 그녀의 저글링 능력 전에 창조되었지만 그 시점에서 할 수 있습니다.

Ruby 모듈 '포함'을 수정하여 수정하여 다중 상속 재산과 같은 행동을 수정할 수 있습니다. Module#append_features Includer 목록을 유지 한 다음 사용하여 업데이트하려면 method_added 콜백이지만 이것은 표준 루비에서 큰 변화가 될 것이며 다른 코드와 함께 작업 할 때 큰 문제가 발생할 수 있습니다. 당신은 더 잘 만들 수 있습니다 Module#inherit 호출되는 방법 include 대표단도 처리했습니다.

실제 예제에 관해서는 Enumerable 굉장합니다. 당신이 정의하는 경우 #each 그리고 포함 Enumerable 수업 시간에, 그것은 당신이 각각과 모든 것을 코딩하지 않고도 많은 반복자에 액세스 할 수있게 해줍니다.

C ++에서 여러 상속을 사용하거나 Java/C#에서 인터페이스를 구현할 수 있으므로 주로 사용됩니다. 나는 당신의 경험이 어디에 있는지 잘 모르겠지만, 전에 그 일을 한 적이 있다면 Mixins는 당신이 루비에서 어떻게 할 것인가입니다. 기능을 클래스에 주입하는 체계적인 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top