2014-09-06 2 views
0

루비 클래스 파일은 일반적으로 매우 작아야한다는 것을 알고 있지만 때로는 (a) 자신의 파일을 정말로 보증하지는 않지만 (b) 어떻게 든 그룹화 할 수 있다면 더 읽기 쉽습니다.루비 : 큰 클래스/파일 정리

예를 들어, 특정 클래스에서 나는 경로를 결정하는 10 가지 방법을 가질 수 있습니다. 지금은 그룹의 나머지 부분과 구별하기 위해 여러 줄의 장식적인 "### PATHS ###"주석을 달아 놓는 경향이 있습니다.

가독성을 높이기 위해 클래스 내의 하위 클래스/모듈을 구현하는 것이 약간 과도한가, 아니면 다른 사람들이이 작업을 수행하는지 생각해보십시오. 다른 모든 생각은 감사하게 생각합니다.

답변

2

어쩌면 그들 do은 자신의 파일을 보증합니다 - 단일 책임 원칙을 생각하십시오. 당신이 우리에게 코드를 표시하지 않았으므로, 여기에 개체에 대한 경로를 처리하는 별도의 클래스에 대한 생각 :

class FooPaths 
    def initialize(foo) 
    @foo = foo 
    end 

    def path_one 
    # code to calculate path using @foo 
    end 

    def path_two 
    #code to calculate another path using @foo 
    end 
end 

아이디어는 클래스 Foo 아마 너무 많은 일을하고 있다는 것입니다. 이니셜 라이저에서 @foo를 허용하는 작은 클래스를 만든 다음 작은 클래스가 Foo와 관련된 작업의 더 작은 하위 집합을 처리 할 수 ​​있습니다. 또한 테스트하기가 훨씬 쉽습니다.

0

비슷한 도우미 메서드가 여러 개있는 경우 두 가지 중 하나를 의미합니다. 나는 비슷한 방식으로 행동 비즈니스 개념의 무리가

  • 정의 할 필요가있다 :

    1. 나는 비즈니스 개념 (객체를 읽기)이있다.

      class User << ActiveRecord::Base 
          # active record attributes :first_name, :last_name 
          def full_name 
          FullName.from_parts(first_name, last_name) 
          end 
      
          def full_name=(val) 
          if val 
           self.first_name, self_last_name = val.partsfirst_name, val.last_name 
          else 
           self.first_name = self.last_name = nil 
          end 
          end 
      end 
      
      class FullName 
          attr_accessor :first_name, :last_name 
          def to_s 
          parts.join(" ") 
          end 
      
          def parts 
          [first_name, last_name].compact 
          end 
      
          def eq(other) 
          to_s.eq(other) 
          end 
      
          def self.from_parts(first_name, last_name) 
          # [...] 
          end 
          def self.from_full_name(full_name) 
          # [...] 
          end 
      end 
      
      : 첫 번째 경우를 들어

  • 은 매우 자주, 메소드에 전달 된 첫 번째 인수는

    class User < ActiveRecord::Base 
        # active record attributes :first_name, :last_name 
    
        def self.full_name(first_name, last_name) 
        [first_name, last_name].compact.join(" ") 
        end 
    
        def self.extract_first_name(full_name) 
        full_name.split.first 
        end 
    end 
    

    그래서 내가 full_name에 대한 개념을 만들 것입니다 비즈니스 개념의 이름입니다

    예제가 고안된 것을 알고 있지만이 개념을 둘러싼 많은 뷰 논리 및 도우미 그룹을 발견했습니다. 따라서 여러분이 더 많은 개념을 발견하게 될 경우, 또는 여러분이 자주 이러한 것들을 그룹으로 전달한다는 것을 알게되면 훌륭한 후보가됩니다. 또한 사용자의 전체 이름과 관련된 비즈니스 사용자와 여러 번 대화를 나누었 으면 실제로 여기에 비즈니스 개념을 원한다고 말하고 있습니다.

    두 번째 경우에는 "동일한"속성을 여러 비즈니스 객체에 추가하려는 경우가 있습니다. 그들은 단지 다른 방식으로 계산됩니다. 장부 책과 사전의 경로가 다릅니다. 챕터 북과 사전의 개념을 소개하며 둘 다 경로 매개 변수를가집니다. 위에서 언급했듯이 이러한 비즈니스 개념을 사용자와 함께 자주 사용하지 않는다고 생각하는 경우 여기가 올바른 방법이 아닙니다.