클래스 변수로 저장
5059 단어 ruby
인스턴스 변수는 설정된 인스턴스에만 사용할 수 있습니다.
로컬 변수는 생성된 로컬 환경에서만 액세스할 수 있습니다(예: 메서드에서).
클래스와 실례 변수를 지나치게 사용하지 마라
단지 모든 것을 실례나 변수로 간주하는 것은 범하기 쉬운 잘못이다.누군가가 생각할 수도 있다. "나는 이 방법 이외의 정보는 필요 없지만, 무슨 해가 있습니까?"
응, 많아.한 가지 방법에 필요한 데이터는 다른 방법에 의해 바뀔 수 있다.그래서 당신은 변수가 비어 있다고 생각하지만, 다른 곳에서 값을 얻는다.너는 변수의 명칭을 특히 조심해야 한다.그것은 일부 불필요한 정보 저장만 강제할 뿐이다.일단 이 방법이 끝나면 이 변수를 잊는 것이 가장 좋다.당신의 코드를 다른 일에 집중하게 하세요.
실례 변수 (또는 더 나쁜 것은 국부 변수) 를 사용하려고 할 때, 클래스 변수를 사용하는 것은 지수급의 엉망이다.지금, 당신이 단지 한 곳에서 일을 하기만 하면, 모든 실례가 당신의 변수에 영향을 줄 것이다.
양호한 사용 클래스 변수
그래서 루비로 코드를 작성하는 것을 더 배우면서 나는 클래스 변수만 사용하여 대상의 모든 실례를 저장하는 습관을 길렀다.알잖아, 이렇게.
@@all = []
def initialize
@@all << self
end
이렇게 하면 나중에 나는 다른 대상을 통해 이 목록에 접근할 수 있다.그래도 이 리스트가 필요합니까?비데이터베이스 프로그램에서 답은 아마도.일단 내가 코드 종류의 변수를 조금 썼다면, 나는 잊어버렸다.
휴스턴, 우리에게 문제가 생겼어
나는 주어진 날에 지구를 날아갈 소행성의 목록을 제공하기 위해 무료 NASA API와 인터페이스를 제공하는 CLI 프로그램을 개발하고 있었다.
그리고 소행성이 언제 지구로 돌아올지 목록에서 선택할 수 있다.아마도 아이가 태어난 날 어떤 소행성이 날아갔는지 검사한 후에 가장 큰 소행성(또는 지구에서 가장 가까운 소행성)이 언제 돌아올지 보고 싶을 것이다.이것은 기본적으로 매우 특별한 날의 천문 기념일이다.
사용자가 같은 날짜를 두 번 검색하는 것을 제외하고는 모든 것이 순조롭다.나의 프로그램은 지구를 지나가는 모든 소행성에게 새로운 물체를 만들고 그 다음에 그 자체를 지나가는 물체를 만든다. (소행성은 궤도를 돌고 있기 때문에 한 번 또 한 번 지나갈 수 있다.)내가 날짜를 두 번 검색할 때, 나는 모든 과정과 소행성을 두 개만 만들 것이다.
처음에 나는 매우 우아하게 이 문제를 해결했다.나는 단지 나의 @all 변수를 검사해서 그날 통과되었는지 확인했을 뿐이다.만약 내가 그날의 통행증을 저장했다면, 나는 NASA의 API에서 그날의 모든 데이터를 얻었다고 가정한다.
이런 가설은 통상적으로 잘못된 것이다.만약 사용자가 소행성을 찾고 다음 방문을 발견한다면, 그들은 미래의 날짜에 단일한 통행증을 만들 것이다.만약 사용자가 같은 날에 다른 소행성이 지나가는 것을 보기로 결정한다면 어떻게 될까요?
예를 들어 나는 허구의 친구인 찬은이 태어난 날부터 모든 소행성의 명단을 얻었다.나는 소행성 2011 QF3가 이날 하늘에서 가장 큰 것을 보았다.확인해 봤는데 2030년 3월 29일에 돌아올 거예요.재미있다이제 그날 또 어떤 소행성이 지나갔는지 봅시다.내 코드가 API를 내보내서 그날 6개의 소행성을 발견했다.나는 이 여섯 개의 소행성과 그것들의 여섯 개의 궤적을 만들었다.하지만 나는 이미 소행성(2011 QF3)을 만들었다.나는 심지어 그 날짜의 통행증까지 만들었다.현재 나의 데이터는 중복 데이터에 의해 파괴되었다.
나는 패스와 Asteroid의 @all 변수를 검사해서 이런 상황을 방지하려고 여러 가지 방법을 시도했지만, 내가 찾을 수 있는 유일한 해결 방안은 내가 API를 클릭한 후에 다른 실례를 대조해서 데이터를 검사하는 것이다.필요 없을 수도 있는 상황에서 API에 대한 낭비로 보인다.
벨에게 구해졌어요.
나는 나의 코치 안나벨과 이 문제를 토론했다. 나는 내가 API를 검사한 후에 복식을 검사할 필요가 없기를 바란다.그녀는 나의 코드를 잠시 보았는데, 이 문제를 발견했고, 나의 클래스all 변수가 작동할 수 없기 때문에, 나는 만들어야 한다고 지적했다.
그녀가 그 말을 다 하기 전에 나는 내가 무엇을 해야 하는지 깨달았다.두 번째 클래스 변수를 만듭니다.클래스와 실례 변수를 과도하게 사용할까 봐 해결 방안조차 고려하지 않았다.
Annabel과 이야기를 나누면 이런 변수의 용도가 바로 이것이라는 것을 일깨워 준다!API를 사용한 날짜만 추적하는 새 클래스variables를 만들었습니다.내 API를 클릭하기 전에 @@all search 를 선택하면 그날의 모든 채널과 소행성을 만들었는지 확인할 수 있습니다.있는 경우 API 단계를 건너뛰고 클래스 변수 "@@all"에서만 객체를 검색할 수 있습니다.
같은 해결 방안은 내가 두 번의 소행성 수색 두 번째 방문에서 두 번째 통과를 만드는 문제를 해결했다."@@next\u Visition"을 만들었기 때문에 소행성의 다음 방문을 위해 NASA의 API를 호출했는지 알고 있습니다.사용자가 다음 소행성 방문을 물었을 때, 나는 아직 날짜를 몰랐다.나는 소행성밖에 없다.나는 다음 과정이 미래라는 것을 알고 있지만, 우리의 '@@@all' 변수에 일부 과정이 저장될 수 있다. 이런 과정은 사실상 이 소행성이 다음에 지구에 대한 세 번째, 네 번째, 또는 그 어떠한 횟수의 방문이기 때문에, 나는 내가 이 과정을 가지고 있다는 것을 명확하게 알고 나서야 '@@@all' 변수의 데이터를 신뢰할 수 있다.
@@all = []
@@all_searches = []
@@next_visitation = []
def initialize (search_type, pass_hash)
#code here stores the data for the Pass - not relevant to this post.
@@all << self
@@all_searches << self.pass_date if search_type == "date_search"
@@next_visitation << self.asteroid if search_type == "next_visit"
end
결론
클래스 변수와 실례 변수를 언제 사용하는지 아는 것은 그것들을 피하는 것만은 아니다.만약 고유의 오용으로 인해 옵션을 닫았다면, 문제를 해결하는 방법을 닫았을 수도 있다.
Reference
이 문제에 관하여(클래스 변수로 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kevhines/saved-by-a-class-variable-47ah텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)