공공 vs. 개인 vs. 보호

21389 단어 rubyooptutorial
대상방향 프로그래밍이나 루비 또는 둘을 배우는 모든 사람들에게 배워야 할 것이 많다는 것을 안다.나는 매일 새로운 것을 배우고 있다.그 중 하나가 나를 괴롭히고 있는데, 지금도 나를 괴롭히는 화제는 공공, 사유, 보호받는 실례 방법 간의 차이이다.
나는 그들을 더 잘 이해하기 위해 이 화제에 대해 연구를 하고 내가 배운 것을 썼다.이 글이 내 생각을 밝힐 뿐만 아니라 다른 곤혹스러운 사람들도 도울 수 있기를 바란다.
본문을 이해하려면 대상을 대상으로 프로그래밍하는 것에 대해 기본적인 이해가 필요하다.OOPI suggest reading up on it first에 익숙하지 않은 경우

첫번째 일


무엇이 공공, 사유, 보호받는 실례적인 방법입니까?우리는 왜 그것들을 사용해야 합니까?우리 언제 써요?
간단하게 말하면 공공, 사유, 보호받는 방법이 바로 이렇다.방법코드에 대해 일부 기능을 수행할 수 있습니다.삼자 간의 차이는 누구와/또는 무엇이 그것들을 접촉할 수 있는지에 있다.
우리는 왜 그것들을 사용해야 합니까?우리 클래스에 간단하고 사용하기 쉬운 인터페이스를 제공하다.그것들은 우리가 깨끗한 코드를 작성하고 코드 사용자에게 유쾌한 체험을 제공하며 어떠한 민감한 데이터도 보호할 수 있도록 한다.
우리가 언제 모든 것을 사용할 것인지에 대해, 이것은 우리가 더욱 깊이 있는 연구를 진행해야 할 것이다.

공개적이었어


공공 방법은 통상적으로 세 가지 방법 중 가장 이해하기 쉬운 것으로 여겨진다.

얘네는 뭐야?


공공 방법은 클래스의 범위 내와 범위 밖에서 모두 접근할 수 있는 방법이다.이 종류의 모든 실례는 공공 방법에 접근할 수 있고 그것들을 호출할 수 있다.

어떻게 그것들을 사용합니까?


루비에서 다른 방법을 사용하는 것처럼 사용할 수 있습니다.점 표시법을 사용하면 호출자에게 공공 방법을 호출할 수 있다.
실제 행동을 살펴보겠습니다.
class Person
  def initialize(name, age)
    @name = name
    @age = age
  end

  public

  def name
    @name
  end

  def age
    @age
  end
end

joe = Person.new('Joe', 30)
joe.name                    # => 'Joe'
joe.age                     # => 30
너는 위에서 볼 수 있다. 조는 반 사람들의 한 예이다.name과age는 공공 실례 방법이기 때문에 joe 대상은 클래스 Person의 범위 밖에서 접근할 수 있습니다.
첨부 설명: 위의 코드 세션에서처럼 공공 실례 방법으로 시작할 필요가 없습니다.기본적으로 모든 실례 방법은 공공적이다.내가 이렇게 한 것은 단지 일을 더욱 분명하게 하기 위해서이다.

언제 쓸 거예요?


모든 사람에게 정보를 표시할 때, 당신은 당연히 공공 방법을 사용하기를 원합니다.
인류 형식의 공공 방법.
만약 어떤 방법이 이 인터페이스의 일부분이라면, 그것을 공공으로 유지해야 한다.이것은 다른 종류가 이 방법을 통해 이 종류와 상호작용을 한다는 것을 의미한다.마지막 한마디가 무의미하기 때문에 다음은 하나의 예이다.
class Dog
  attr_reader :name

  def initialize(name)
    @name = name
  end

  def speak
    'Arf!'
  end
end

class Owner
  attr_reader :name, :pet

  def initialize(name, pet_name)
    @name = name
    @pet = Dog.new(pet_name)
  end

  def call_pet
    puts "#{name}: Hey #{pet.name}! Come here boy!"
    puts "#{pet.name}: #{pet.speak}"
  end
end

tom = Owner.new('Tom', 'Rufus')
tom.call_pet  

# => "Tom: Hey Rufus! Come here boy!"
# => "Rufus: Arf!"
위의 예는 좀 길지만 Dog 클래스의 speak 방법이 인터페이스의 일부라는 것을 알 수 있습니다.Owner류는 캐럴 pet 메서드에서 이 메서드를 사용하여 애완동물이 말을 할 수 있도록 합니다.또한 개 대상이 스스로 말을 하게 하려면 *speak* 방법을 단독으로 사용할 수 있습니다.따라서 우리는 그것을 일종의 공공 방법으로 삼아야 한다
프로그램/클라이언트가 대상의 상태를 바꾸기를 원할 때 방법을 공개하는 것도 중요하다.예를 들어, 만약 당신이 자동차 물체를 가지고 있다면, 당신은 그것을 다른 색깔로 분사하고 싶다.
class Car
  def initialize(color)
    @color = color
  end

  def spray_paint(new_color)
    @color = new_color
  end

  def color
    @color
  end
end

my_car = Car.new('pink')
my_car.color               # => 'pink'

my_car.spray_paint('black')
my_car.color               # => 'black'

개인적


사유 방법이 두 번째로 가장 이해하기 쉬운 방법일 수도 있다. 왜냐하면 보호받는 방법이 좀 미묘하기 때문이다.

얘네는 뭐야?


개인적인 방법은 어쨌든 유형의 범위 밖에서 방문할 수 없다.클래스 대상을 개인적인 방법으로 호출하려고 하면 오류가 발생합니다.
class TopSecret
  private


  def data
    "Top secret information"
  end
end 

secret_file = TopSecret.new
secret_file.data           
# => NoMethodError: private method `data' called for #<TopSecret:0x007f8051041ab8>

어떻게 그것들을 사용합니까?


또한, 하나의 방법을 사유화하기 위해서, 그 앞에 키워드private*를 붙여야 한다는 것을 알 수 있습니다.*private에서 만든 모든 방법은 개인 방법과 사용 금지 방법으로 간주됩니다.
(private 자체는 사실상 루비 방법이지만 키워드/절 구분자로 보기 쉽다)
이 밖에 사유 방법은 점 표시법을 사용하지 않고 은밀히 호출할 수 있다.이것은 당신이 영원히 개인적인 방법에서self나 다른 종류의 실례를 인용하지 않을 것을 의미한다.
적당한 범위 내에서 사적인 방법을 사용하려면 방법명에 따라 사용하기만 하면 된다.이렇게 간단해.
class Mathy
  def output_result(num1, num2)
    puts crazy_algorithm(num1, num2)
  end

  private

  def crazy_algorithm(num1, num2)
    value = num1 * num2
    value *= (num1 + num2)
    value /= num1
    value -= num2 / num1
    value**2
  end
end

equation = Mathy.new
equation.output_result(3, 5)    # => 1521

언제 쓸 거예요?


관리 클래스와 프로그램의 인터페이스를 관리할 때, 개인적인 방법은 매우 유용하다.다음 문제를 처리할 때는 이러한 문제를 사용해야 합니다.
  • 비밀번호, 개인정보 등 민감한 정보
  • 클래스 내부 작업의 방법으로 정보를 출력하거나 표시하지 않습니다.
  • 인터페이스에 추가되지 않고 다른 종류와 협업하지 않는 방법.
  • 만약 당신이 비디오 게임 응용 프로그램을 개발하는 개발자라면, 게이머들이 게임 설정, 컴퓨터 AI 또는 기타 내부 기능에 접근할 수 있기를 바라지 않을 것이다.
    사유 방법을 사용하지 않으면 무슨 일이 일어날까
    만약 당신이 누군가를 정보에 접근하게 하고 싶지만, 모두가 아니라면 어떻게 해야 합니까?이때 너는 공공적인 방법을 중간인으로 사용할 수 있다.이것은 일부 사람만 통과할 수 있는 필터를 만들 수 있도록 합니다.비밀번호가 좋은 예다.
    class TopSecret
      def access_data    
        puts "Please enter password:"
        password_attempt = gets.chomp
    
        if password_attempt == '12345'
          puts data
        else
          puts 'Nice try, bozo.'
        end
      end
    
      private
    
      def data
        "Top secret information"
      end
    end
    
    secret_file = TopSecret.new
    secret_file.access_data
    
    위의 예시에서 데이터 방법은 개인적인 것이기 때문에 클라이언트와 프로그램은 접근할 권리가 없다.하지만 비밀은 누군가가 접근할 수 있고 다른 사람의 얼굴로 밀어붙일 수 있을 때만 재미있기 때문에access data라는 접근기 방법을 만들었습니다.
    access data 메서드는 사용자가 암호를 입력해야 비밀을 누설할 수 있습니다.잘못된 비밀번호 시도는 그들을 바보라고 부른다.

    보호했어


    이제 보호받는 실례적인 방법, 이 그룹의 홀수에 대해 이야기해 봅시다.

    얘네는 뭐야?


    보호받는 방법은 공공 방법과 사유 방법 사이의 균형이다.그것들은 공공 범위 내에서 방문할 수 없기 때문에 개인적인 방법과 유사하다.클라이언트와 프로그램 모두 그것들을 호출할 수 없습니다.
    class Person
      def initialize
        @age = rand(50)
      end
    
      protected
    
      def age
        @age
      end
    end
    
    me = Person.new
    me.age          # => NoMethodError: protected method `age' called
    
    그러나 같은 유형의 대상은 서로의 보호받는 방법을 방문할 수 있다.
    class Person
      def initialize
        @age = rand(50)
      end
    
      def >(other_person)
        age > other_person.age
      end
    
    protected
    
    def age
        @age
      end
    end
    
    me = Person.new
    you = Person.new
    
    me > you         # => true
    
    나이는 무작위로 생성되기 때문에 상술한 코드의 결과가 항상'진짜'는 아니다그러나 그것은 영원히 실수를 하지 않는다. 이것이 가장 중요한 수확이다.
    너와 나는 같은 대상인 사람이기 때문에 그들은 서로의 보호받는 방법을 의심할 여지없이 방문할 수 있다.

    어떻게 그것들을 사용합니까?


    만약 방법을 보호하려면 먼저 보호된 방법을 성명해야 한다. 이것은 개인적인 방법과 유사하다.단, 보호된 방법을 사용하면 * 점 기호를 사용하고 * * self* 또는 다른 수신기를 호출할 수 있습니다.
    class Person
      def younger_than?(other_person)
        self.age < other_person.age
      end
    
      protected
    
      def age
        @age
      end
    end
    

    언제 쓸 거예요?


    보호된 제목 아래에 만드는 가장 좋은 시기는 같은 종류의 대상들 사이에서 데이터를 비교하거나 전송하고 싶지만 공개되기를 원하지 않는다는 것입니다.
    만약 내가 은행 게임을 구축하고 있다면, 나는 계좌 잔액 정보를 비밀로 하고 싶다.그러나 나는 내가 친구보다 돈이 있는지, 그리고 그들에게서 물건을 훔쳤는지 알 수 있는 기능을 포함하고 싶다.
    class BankAccount
      def initialize
        @balance = rand(100)
      end
    
      def richer_than(other_account)
        if balance > other_account.balance
          puts "You're rich!"
        else
          puts "Better luck next time."
        end
      end
    
      def steal_from(other_account, amount)
        if amount > other_account.balance
          puts "Hold it there, they aren't that rich."
          return
        else
          @balance = @balance + amount
          other_account.balance = other_account.balance - amount
          return
        end
      end
    
      protected
    
      def balance
        @balance
      end
    
      def balance=(num)
        @balance = num
      end
    end
    
    my_account = BankAccount.new
    friend_account = BankAccount.new
    
    my_account.richer_than(friend_account)
    # => "Better luck next time."
    
    my_account.steal_from(friend_account, 25)
    
    my_account.richer_than(friend_account)
    # => "You're rich!"
    
    my_account.balance    # => NoMethodError
    
    우리들은 위의 코드를 분해합시다.
    나는 balance Getter 방법을 보호받기 때문에 공공 범위에 적용되지 않고 계좌에 얼마가 있는지 실제적으로 알 수 없다.
    richer than 방법은 다른 BankAccount 객체를 매개 변수로 사용하여 자신의 계정이 자신의 계정보다 더 많은 돈을 가지고 있는지 여부를 알 수 있습니다.

    steal from 방법에는 BankAccount 객체 하나와 그 중에서 얼마를 받는지 두 가지 매개 변수가 있습니다.그러나 다른 은행 계좌에 얼마가 있는지 모르기 때문에 얼마를 찾아야 할지 추측해야 한다.이것이 바로 그것이 너로 하여금 네가 너무 많이 먹었는지 아닌지를 알게 하는 이유다.
    마지막으로, 내가 마지막으로 Getter balance 방법을 호출한 것은 보호된 방법을 다시 호출하면 오류가 발생할 수 있다는 것을 재확인하기 위해서이다.

    요약


    공통 인스턴스 메서드:
  • 전역에서 액세스할 수 있습니다.
  • 류 인터페이스의 일부분.
  • 기본적으로 모든 실례 방법은 공공적이다.
  • 정보를 표시하거나 다른 클래스 및/또는 클라이언트와 상호 작용할 때 사용합니다.
  • 개인 사례 방법:
  • 클래스 범위 내에서만 접근할 수 있습니다.
  • 류 내부 가공의 일부분.
  • 반드시 개인적인 방법으로 정렬해야 한다.
  • 민감한 정보나 관건적인 방법을 숨길 때 사용한다.
  • 보호된 인스턴스 방법:
  • 클래스 범위 내와 같은 클래스의 대상에서 접근할 수 있다.
  • 보호된 방법으로 시작해야 합니다.
  • 다른 클래스의 대상과 비교/상호작용을 원하지만 프로그램이나 클라이언트가 접근할 때 사용하지 않는다.
  • 여기요.공공, 사유, 보호받는 방법을 깊이 이해하다.나는 이것이 너와 나 모두에게 도움이 되기를 바란다.
    지금 가서 아주 좋은 대상 프로그램들을 만들어라!

    좋은 웹페이지 즐겨찾기