2013-08-14 2 views
0
나는 다음과 같은 모델이

: 나는 Conditioner으로 CountTime 클래스 네임 스페이스하는 경우는STI 모델의 네임 스페이스를 지정해야합니까?

module Core 
    class Conditioner 
    include Mongoid::Document 

    field :operator, type: String, default: '' # can be !=, ==, <, >, <=, >=, = 
    end 
end 

module Core 
    class Count < Conditioner 
    field :threshold, type: Integer, default: 0 # a simple threshold 
    end 
end 

module Core 
    class Time < Conditioner 
    UNITS = %w(seconds minutes hours days weeks months years) 

    # will be use like this: Time.value.send(Time.unit) Ex: 3.minutes 
    field :value, type: Integer, default: 0 # 3 
    field :unit, type: String, default: '' # minutes 

    validates :unit, presence: true, inclusion: { in: UNITS } 
    end 
end 

이 궁금하세요? 이처럼 :이 지금 ::Time.now 같은 Time.now 전화를 가지고 있기 때문에

module Core 
    class Conditioner::Time < Conditioner 
    end 
end 

. 답변에 대해서는

편집

은, 어쩌면이 더 나은 생각한다 :

Core::Time라는 클래스를 정의하는 것은 어쩌면 너무 일반적이며, 많은 이해가되지 않기 때문에
module Core 
    module Conditioner 
    class Base 
    end 
    end 
end 

module Core 
    module Conditioner 
    class Count < Conditioner::Base 
    end 
    end 
end 

module Core 
    module Conditioner 
    class Time < Conditioner::Base 
    end 
    end 
end 

.

당신은 어떻게 생각하십니까? 여기에 모범 사례에 대한 확신이 없습니다.

+0

당신은'Conditioner :: Time'을 사용했으나'Conditioner'는 모듈이 아니라 클래스입니다. 네임 스페이스를 위해 그것을 어떻게 사용할 수 있습니까? –

+0

그래, 그냥 'Count'클래스와 'Time' 클래스를 네임 스페이스로 사용해야한다고 생각한다. –

답변

1

원하는 경우에도 네임 스페이스를 지정할 필요가 없습니다.

모델링 할 대상에 따라 달라 지거나하지 말아야하는지 여부 (시간 지정 :: 시간 여부 ...이 아닌지 여부). 그것은 당신의 Core :: Time이 이미 Core :: Conditioner의 하위 클래스 인 것처럼 보이므로, 그 클래스의 내부 클래스로 만드는 것이별로 의미가 없습니다. 귀하의 경우 네임 스페이스를 사용하지 않는 것이 좋습니다.

ruby와 동일한 클래스 이름을 사용하는 것은 이미 코어에 이름을 지정했기 때문에 여기에서 문제가되지 않습니다.

+0

해답을 알려 주셔서 감사합니다. 편집 내용은 무엇입니까? –

+0

모델링하는 도메인을 모르기 때문에 말하기 어렵습니다. 한 문장으로 각각 무엇을 배우는 지, 그리고 그들이 어떻게 협력 하는지를 설명 할 수 있습니까? – jurglic

+0

물론입니다. 'Core' 네임 스페이스는 고립 된 Rails Engine에 있기 때문에 여기에만 존재합니다. 기본적으로 내 응용 프로그램에는 2 가지 유형의 조건이 필요합니다. "카운트"기본 조건 및 "시간"기본 조건. 그들은 공통의 방법과 속성을 공유 할 것이지만 그것들 만 가지고있을 것입니다. Count 조건은 주어진 X가'Count.threshold'보다 큰지 확인합니다. 시간 조건은 주어진 X 날짜가'Time.value.send (Time.unit)'보다 큰지 여부를 검사합니다. 예를 들어 '3.minutes'로 변환됩니다. 관련 세부 사항으로 내 질문을 편집했습니다. –

0

제 생각에는 Ruby 나 Rails가 사용한 클래스 이름을 사용하지 마십시오. 문제 일 수 있습니다. 당신이 그것을 사용할 때마다 조심해야합니다. 나는 그것이 불필요하다고 생각한다. 유지할 모델이 많지 않으면 네임 스페이스를 사용하지 마십시오. 간단하게 유지하고 유지 보수가 될 것입니다 쉽게 :

+0

'Count'와'Time'은'Conditioner'에서만 사용 된 컨텍스트를 가지고 있기 때문에 그것을 네임 스페이스로 만드는 것이 합리적이지 않습니까? –

+0

네임 스페이스의 제한은 없으며 네임 스페이스를 지정할 수도 있고 CondCount 및 CondTime과 같은 접두사가있는 고유 한 이름을 클래스에 부여 할 수도 있습니다. 클래스가 2 개 뿐이므로 아무데도 Time.now를 사용할 수 있습니다. 복잡성을 줄이고 이름을 혼란스럽게하지 마십시오. – Bigxiang

0

당신이 TimeConditioner 접두어로 변경 유일한 것은 최대 Time 볼 때 Core 모듈에 대한 상수 조회가 Conditioner::Time 클래스를 볼 것입니다. 다른 모든 클래스 (Count, Conditioner)는 여전히 Conditioner::Time이 대체음이 Time이라고 생각합니다.

module Core 
    def time 
    Time.now 
    end 
    class Conditioner 
    def time 
     Time.now 
    end 
    end 
end 

module Core 
    class Count < Conditioner 
    def time 
     Time.now 
    end 
    end 
end 

module Core 
    class Conditioner::Time < Conditioner 
    def time 
     Time.now 
    end 
    end 
end 

Core::Count.new.time 원하는 호출이 실패합니다,하지만

class A 
    include Core 
end 

A.new.time

는 동안이 경우, 현재 시간을 넣어 것입니다 :
module Core 
    def time 
    Time.now 
    end 
    class Conditioner 
    def time 
     Time.now 
    end 
    end 
end 

module Core 
    class Count < Conditioner 
    def time 
     Time.now 
    end 
    end 
end 

module Core 
    class Time < Conditioner 
    def time 
     Time.now 
    end 
    end 
end 

class A 
    include Core 
end 

A.new.time

도 실패합니다. 이제는 왜 쉬운가? 상수 조회는 항상 현재 네임 스페이스 ( Core)에서 사용할 수있는 상수를보고 Object의 네임 스페이스를 찾기 전에 현재 네임 스페이스의 조상 체인을 올라간다. ( Time 또한 다음과 같이 호출 할 수있다. Conditioner::Time에 클래스 Time 이름을 바꾸는 이유 Object::Time. 단지 Core 내에서 클래스의 Core 모듈에 대한 조회를 변경하지만 그래도 (당신이 Time 전에 Conditioner::을 넣어 만들 수있는) 자식 네임 스페이스에 검색하지 않습니다, 그것은이다.

이 경우 우수 사례를 묻는 질문 : 클래스 Time에 전화하고 Object::Time b를 참조 할 때 그냥 그대로 두십시오. y ::Time. 이것은 꽤 잘 알려진 방법이며 추가 네임 스페이스의 사용을 피하는 이점은 거의 없습니다.

관련 문제