Ruby 클래스에서 인스턴스 변수 활용

힌트 - 인스턴스 변수보다 메소드 선호



나는 이전에 2015년에 다른 사이트에 이것을 게시했지만 Ruby 여정을 시작하는 사람들에게 여전히 도움이 된다고 생각합니다.

2015년에 The Firehose Project에 대한 멘토링을 시작했습니다. 온라인 Rails 부트캠프.

다음은 제가 이전에 2015년에 썼던 서론으로 항상 변함없이 남아 있습니다. Ruby에서 인스턴스 변수를 활용하는 방법을 소개합니다.

그 과정에서 인스턴스 변수 설정과 setter 메서드 호출과 관련하여 내가 선호하는 클래스 방법론에 대해 이야기하겠습니다.

# Example 1
class Book
  def initialize(a_title)
    @title = a_title
  end

  def title
    @title
  end
end



이는 다음과 같이 요약될 수 있습니다.

# Example 2
class Book
  def initialize(a_title)
    @title = a_title
  end

  attr_reader :title
end



점점 더 초기화의 일부로 인스턴스 변수를 설정하지 않고 대신 setter 메서드를 호출하는 것을 선호합니다(자세한 내용은 나중에 설명).

# Example 3
class Book
  def initialize(a_title)
    # Make sure to remember to use `self.title = a_title` instead of
    # `title = a_title`. If you use `title = a_title`, you will be setting the
    # local variable `title` instead of calling the instance method `#title=`
    # (and thus setting the instance variable `@title`)
    self.title = a_title
  end

  attr_reader :title

  def title=(a_title)
    @title = a_title
  end
end



이는 다음과 같이 요약될 수 있습니다.

# Example 4
class Book
  def initialize(a_title)
    self.title = a_title
  end

  attr_reader :title
  attr_writer :title
end



그리고 더 자세히:

# Example 5
class Book
  def initialize(a_title)
    self.title = a_title
  end

  attr_accessor :title
end



초기화 시 attr_accessor 및 인스턴스 메서드 setter를 사용하는 것이 내가 선호하는 방법론입니다(예제 #5 참조). 이전에는 사실상의 방법론으로 예제 #2를 사용했습니다. 그러나 요즘은 사용하지 않으려고 합니다.

setter 메서드를 사용하는 이유는 다음과 같습니다.
  • 인스턴스 변수가 궁극적으로 설정되는 방식을 캡슐화하고 있습니다.
  • Book 클래스를 확장하기 위해 수행해야 할 수 있는 모든 작업을 완화하고 있습니다.

  • 다음을 고려하세요:

    # Example 6
    class FrenchBook < Book
      def title=(a_title)
        @title = translate_to_french(a_title)
      end
    end
    
    


    setter 방식을 사용할 때 setter 방식은 코드에서 변곡점(확장하고 수정하는 곳)입니다.

    초기화 메소드에서 인스턴스 변수를 설정했다면 제 변곡점은 초기화 메소드일 것입니다. 다음 예는 그 변경을 보여줍니다.

    # Example 7
    class Book
      def initialize(a_title)
        @title = a_title
      end
      attr_reader :title
    end
    
    class FrenchBook < Book
      def initialize(a_title)
        @title = translate_to_french(a_title)
      end
    end
    
    


    두 예제의 전체 코드 행은 동일합니다. 그러나 Book 클래스를 변경해야 할 때 어떤 일이 발생하는지 생각해 보십시오.

    # Example 8
    class Book
      def initialize(a_title, an_author)
        # do stuff here
      end
    end
    
    


    예 7의 FrenchBook 클래스를 변경해야 합니다.

    결론



    인스턴스 변수를 설정하는 대신 attr_writer를 사용하면 방법의 문제를 빠르게 분리할 수 있습니다. 클래스에 single responsibility(즉, 변경 이유)가 있어야 하는 것처럼 메서드도 마찬가지입니다.

    인스턴스 변수를 설정하는 방법을 사용하면 확장, 수정 및 전반적인 유지 관리가 더 쉬워집니다.

    다음은 요즘 제가 선호하는 수업 구조입니다.

    # Example 9
    class Book
      def initialize(a_title)
        self.title = a_title
      end
    
      attr_accessor :title
      private :title=
    end
    
    


    개체 인스턴스화 외에는 제목을 업데이트하는 수단을 노출하고 싶지 않습니다. 객체 상태의 변경 가능성을 외부 세력으로부터 보호하고 싶습니다.

    좋은 웹페이지 즐겨찾기