문제

로컬에서 무언가를 추적한 다음 호출하는 모든 메서드에 전달하는 것과 인스턴스 변수를 선언하고 메서드에서 사용하는 것 사이에서 어떻게 결정합니까?

나는 클래스 마지막 부분에 인스턴스 변수를 목록으로 보관하는 것을 선호하는 경향이 있습니다.하지만 내 프로그램이 점점 더 복잡해지면서 이 목록도 점점 길어지고 있습니다.나는 어떤 일이 충분히 자주 통과되면 그것을 필요로 하는 모든 소년 소녀들에게만 보여야 한다고 생각하지만, 그러면 나는 "그냥 모든 것을 공개하면 어떨까?"라고 궁금해하기 시작합니다.그러면 더 이상 아무것도 전달할 필요가 없을 것입니다!"

도움이 되었습니까?

해결책

인스턴스 변수를 언급하기 때문에 객체 지향 언어로 작업한다고 가정합니다. 어느 정도, 인스턴스 변수를 사용하는시기, 범위를 정의하는 방법 및 로컬 변수를 사용하는시기는 주관적이지만 수업을 만들 때마다 따라갈 수있는 몇 가지 엄지 규칙이 있습니다.

  • 인스턴스 변수는 일반적으로 클래스의 속성으로 간주됩니다. 이것을 수업에서 만들어 질 대상의 형용사로 생각하십시오. 인스턴스 데이터를 사용하여 객체를 설명하는 데 도움이 될 수 있다면 예를 들어 데이터와 관련하여 좋은 선택이라고 확신하는 것이 안전 할 것입니다.

  • 로컬 변수는 방법의 범위 내에서 작업을 완료하는 데 도움이됩니다. 일반적으로 방법은 일부 데이터를 가져 오거나 일부 데이터를 반환하거나 일부 데이터에서 알고리즘을 처리/실행할 목적이 있어야합니다. 때로는 로컬 변수를 방법이 처음부터 끝까지 얻는 데 도움이되는 방법으로 생각하는 데 도움이됩니다.

  • 인스턴스 변수 범위는 보안뿐만 아니라 캡슐화를위한 것입니다. "목표는 모든 변수를 비공개로 유지하는 것"이라고 가정하지 마십시오. 상속의 경우 변수를 보호하는 것으로 만드는 것이 일반적으로 좋은 대안입니다. 모든 인스턴스 데이터를 공개하지 않고 외부 세계에 액세스 해야하는 사람들을위한 게터/세터를 만듭니다. 그것들을 모두 사용할 수있게하지 마십시오. 필요한 것만하십시오. 이것은 개발 수명주기 전체에서 올 것입니다.

수업에 대한 데이터를 전달할 때, 코드를 보지 않고도 당신이하고있는 일이 좋은 연습이라고 말하기가 어렵습니다. 때로는 인스턴스 데이터에서 직접 작동하는 것이 좋습니다. 다른 경우에는 그렇지 않습니다. 제 생각에, 이것은 경험과 함께 제공되는 것입니다. 대상 지향적 사고 기술이 향상됨에 따라 직관을 개발할 것입니다.

다른 팁

주로 이것은 변수에 저장하는 데이터의 수명에 따라 다릅니다. 데이터가 계산 중에 만 사용되는 경우 매개 변수로 전달하십시오. 데이터가 객체의 수명에 바인딩되면 인스턴스 변수를 사용하십시오.

변수 목록이 너무 길어지면 클래스의 일부를 새로운 클래스로 리팩토링하는 것에 대해 생각하는 것이 좋습니다.

제 생각에는 인스턴스 변수는 호출 전반에 걸쳐 데이터가 사용될 때만 필요합니다.

예는 다음과 같습니다.

myCircle = myDrawing.drawCircle(center, radius);

이제 my드로잉 클래스를 이미징하는 데 15개의 도우미 함수를 사용하여 myCircle 객체를 생성하고 각 함수에는 중심과 반경이 필요합니다.여전히 my드로잉 클래스의 인스턴스 변수로 설정하면 안 됩니다.다시는 필요하지 않을 것이기 때문입니다.

반면에 myCircle 클래스는 중심과 반경을 모두 인스턴스 변수로 저장해야 합니다.

myCircle.move(newCenter);
myCircle.resize(newRadius);

myCircle 객체가 새로운 호출이 이루어질 때 반경과 중심이 무엇인지 알기 위해서는 이를 필요로 하는 함수에 전달하는 것이 아니라 인스턴스 변수로 저장해야 합니다.

따라서 기본적으로 인스턴스 변수는 객체의 "상태"를 저장하는 방법입니다.객체의 상태를 아는 데 변수가 필요하지 않으면 인스턴스 변수가 아니어야 합니다.

그리고 모든 것을 공개하는 것에 관해서.그 순간 당신의 삶이 더 편해질 수도 있습니다.그러나 그것은 다시 당신을 괴롭힐 것입니다.그러지 마세요.

IMHO :

변수가 인스턴스 상태의 일부를 형성하는 경우 인스턴스 변수 -ClassInstance has -a instancevariable이어야합니다.

내가 인스턴스의 방법에 반복적으로 무언가를 전달하거나, 많은 인스턴스 변수가 있다는 것을 알게된다면, 아마도 무언가를 놓치거나 어딘가에서 나쁜 추상화를 만들었을 때 내 디자인을 보려고 시도 할 것입니다.

도움이되기를 바랍니다

물론 클래스에서 하나의 큰 공개 변수 목록을 쉽게 유지하는 것이 쉽습니다. 그러나 직관적으로조차도 이것이 갈 길이 아니라고 말할 수 있습니다.

사용하기 직전에 각 변수를 정의하십시오. 변수가 특정 메소드의 기능을 지원하는 경우 방법의 범위에서만 사용하십시오.

또한 보안에 대해 생각해보십시오. 공개 클래스 변수는 "외부"코드에서 원치 않는 변경에 취약합니다. 주요 목표는 모든 변수를 비공개로 유지하는 것입니다. 그렇지 않은 변수는 그럴만 한 이유가 있어야합니다.

매개 변수를 전달하는 것에 대해 스택 위로 올라가는 모든 것이 매우 빠르게 될 수 있습니다. 경험의 규칙은 방법 서명을 깨끗하고 우아하게 유지하는 것입니다. 동일한 데이터를 사용하는 많은 방법이 보이면 클래스 멤버가되기에 충분히 중요한지 결정하고 그렇지 않은 경우 코드를 리팩터링하여 더 이해하도록하십시오.

그것은 상식으로 귀결됩니다. 각각의 새로운 변수를 어디에서 그리고 왜, 그 기능이 무엇인지, 어떤 범위에 살아야하는지에 대한 결정을 내립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top