2012-01-29 5 views
1

Ruby를 시작하고 모듈 개념을 배우고 있습니다. 모듈을 한 번 사용하면 코드를 더 잘 구성하고 이름 충돌을 피할 수 있다는 것을 알고 있습니다. (즉, 중요하지으로 제가 구현을 포함하지 않은)의 난이 같은 모듈의 무리가 있다고 가정 해 봅시다 :Ruby 모듈 및 클래스

module Dropbox 

    class Base 

    def initialize(a_user) 
    end 

    end 

    class Event < Base 

    def newFile? 
    end 

    def newImage? 
    end 

    end 

    class Action < Base 

    def saveFile(params) 
    end 

    end 

end 

및 다른 모듈 :

module CustomURL 

    class Base 

    def initialize(a_user, a_url, a_method, some_args, a_regex) 
    end 

    end 

    class Event < Base 

    def initialize(a_user, a_url, a_method, some_args, a_regex) 
    end 

    def change? 
    end 

    end 

    class Action < Base 

    def send_request(params) 
    end 

    end 

end 

내가 한 무리를해야 할 것입니다을 이 모듈 (10+, Gmail, 핫메일 등). 내가 알아 내려고하는 것은 이것이 내 코드를 구성하는 올바른 방법인가?

기본적으로 모듈을 사용하여 "서비스"를 나타내고 모든 서비스는 공통 인터페이스 클래스 (초기화, 동작 목록 및 모니터링을위한 동작)를 갖습니다.

+1

codereview.stackexchange.com으로 이동하는 것이 좋습니다. 귀하의 코드가 작동, 그것은 단지 될 수있는만큼 단단하지 않습니다. –

답변

5

여기서 관련 또는 종속 클래스 패밀리를 정의합니다. 이 패밀리의 모듈 사용량은 namespaces입니다.

또한이 방법을 사용하면 호환 인터페이스가있는 경우 클래스에 abstract factory을 쉽게 빌드 할 수 있습니다. 그러나 내가 알기로는 현재 클래스 디자인의 경우는 그렇지 않습니다. 예를 들어 Dropbox::EventCustomURL::Event은 공개 메소드가 완전히 다릅니다.

당신은 당신의 클래스의 디자인을 재평가하고 모든 이벤트 및 작업이 기본 클래스에서 파생됩니다 있도록 polymorphism을 사용하고 BaseEventBaseAction처럼 뭔가를 추출 할 수 있도록 그들에게 동일한 인터페이스를 가지고하는 것이 가능한 경우 볼 수 있습니다.

업데이트 :은 지금까지 당신이 정의로 서비스, Service 같은 최상위 모듈을 정의하는 것이 유용 할이 모듈 내부의 모든 클래스를 넣을 수 있습니다. 시스템의 모듈성이 향상됩니다. 나중에 모듈 서비스에 대한 기본 클래스를 리팩터링하는 경우 최상위 네임 스페이스에 추가 할 수 있습니다. 그러면 객체는 다음과 같은 읽을 수있는 이름을 갖게됩니다.

Service::Dropbox::Event 
Service::Dropbox::Action 
Service::CustomURL::Event 
Service::CustomURL::Action 
Service::BaseEvent 
Service::BaseAction 
+0

입력 해 주셔서 감사합니다. "업데이트"에서 쓴 내용과 관련하여 모듈을 모듈 안에 넣는 것을 의미합니까? (미안, 초보자 질문이라면, 루비를 처음 사용하는 사람들은 ...) – 0xSina

+0

@PragmaOnce, 예, 모듈 안에 모듈을 넣을 수 있습니다. –

+0

모듈을 모듈 안에 넣을 수있는 쉬운 방법이 있나요? 같은 파일? – 0xSina

0

곧 알 수 있듯이 코드를 구성하는 '올바른 방법'은 없습니다.

대부분 주관적인 가독성의 차이가 있습니다. 클래스 구성 방법은 코드를 코드로 공개하는 것만으로도 좋습니다. 일반적으로 다른 사람 프로젝트에 포함되지 않는 코드에는 필요하지 않지만 어느 쪽도 아프지 않습니다.

"내 의도가 무엇인지 전혀 모르는 코드를 읽는 사람에게 이것이 의미가 있습니까?"

+3

"코드를 체계화하는 '올바른 방법'이 없지만 올바른 방법을 사용하고 있습니다. "DRY"("Do not Repeat Yourself")를 따르면 기본 클래스로 작업 한 다음 하위 클래스로 분류하는 것과 같은 특정 방향을 제시합니다. OP 코드가 그대로 작동합니까? 아마. 더 나아질 수 있을까요? 예. –

1

나는 직장에서 비슷한 코드를 가지고 있으며 네트워킹 장비를 모델링하고 있습니다.

필자는 제네릭 비교기를 비롯하여 일반적인 특성 및 메서드로 제네릭 클래스를 정의한 다음 다양한 하드웨어 모델에 대한 하위 클래스를 정의했습니다. 하위 클래스에는 해당 하드웨어의 고유 속성과 해당 장비의 인스턴스를 초기화 또는 비교하는 데 필요한 모든 지원 코드가 포함됩니다.

다른 메소드와 비슷한 메소드를 작성해야하는 즉시 필자는이 코드를 기본 클래스로 승격시켜 재사용 할 수 있다고 생각했다.종종 이것은 매개 변수를 전달하는 방법을 변경하는 것과 형식 매개 변수를 사용하는 대신 해시를 사용하여 끝내고 필요한 부분을 가져 와서 메서드 인터페이스를 제어하에 유지합니다.

하위 클래스가 많으므로 시간을 들여 해당 기본 클래스가 어떻게 작동해야하는지 생각하는 것이 중요합니다. 하위 클래스를 추가 할 때 다른 하위 클래스를 변경해야하기 때문에 기본 리팩터링 작업이 어려워집니다. 나는 항상 내가 맹목적인 골목길을 따라 가야한다는 것을 알게되고, 조금 뒤로 물러나야 만한다.

+0

입력 해 주셔서 감사합니다. 루비 코드에서 해시를 매개 변수로 사용하는 것은 일반적인 일입니까? 모자에 성능 문제가 있습니까? – 0xSina

+0

매우 일반적입니다. Ruby는 옵션으로 전달 된 이름/값 쌍을 통해 실제로 잘 작동하며 수신 측에서 해시로 변환됩니다. 괜찮은 Ruby 책은 방법에 관한 섹션에서 논의 할 것입니다. –