2017-12-20 5 views
2

변수가 여러 메소드를 통과했지만 마지막 메소드 중 하나에서만 사용되는 경우; 이 변수를 클래스의 속성으로 선언하는 것이 더 좋습니까?메소드를 통해 전달 된 클래스 또는 로컬 변수의 특성이 더 낫습니다.

그래서,이 질문에 더 나은 예에 의해 요구되는 느낌 :

예 # 1

public class eg1 { 
    private int circleSize; 

    void a() { 
     circleSize = ... 
     b(); 
    } 

    void b() { 
     ... 
     c(); 
    } 

    void c() { 
     ... circleSize ... 
    } 
} 

예 2

public class eg2 { 
    void a() { 
     int circleSize = ... 
     b(circleSize); 
    } 

    void b(int circleSize) { 
     ... 
     c(circleSize); 
    } 

    void c(int circleSize) { 
     ... circleSize ... 
    } 
} 

사용해야 어떤 방법이 있나요? 왜?

편집 :이 질문은 상황에 따라 다르며 의견을 기반으로 한 것 같습니다. 어느 쪽이든 그것을하기를 위해 몇몇 좋은 지적이 만들어졌다.

+2

이것은 의견을 바탕으로 작성되었으므로 투표 마감했습니다. 그러나 제 의견은 클래스가 어떤 종류의 것을 표현하려고하는지에 따라 달라집니다. 클래스가 직관적으로 "원 크기"(또는 무엇이든)를 가지는 일종의 실세계를 나타내는 경우,'circleSize'를 필드로 유지하십시오. 그러나 "원형 크기"가 실제로 클래스에서 표현되는 실제 객체의 일부가 아닌 경우 메소드에서 메소드로 전달합니다. –

+0

필요한 결과에 따라 달라집니다. 첫 번째 경우에는 클래스의 인스턴스에 저장되며 클래스의 각 메소드에서 액세스 할 수 있습니다 (비공개). 두 번째 방법은 다른 클래스 또는 다른 값에서이 메소드를 재사용 할 수있는 기능을 제공합니다. package-private). 하지만 처음에는이 값을 사용할 위치를 결정할 필요가 있다고 생각합니다. – reconnect

+0

@DawoodibnKareem이 특별한 경우에는 javaFX의 장면 주위에서 튀는 원을위한 것입니다. 그래서 원은 클래스에 속하지만 circleSize는 원에 속하지 않습니다. 그래서 나는 그것이 지역적으로 창조 될 수 있어야한다고 생각했다. 변수를 메소드에 전달하여 다시 연결하면 재사용 할 수 있습니다. 그러나 일을하는 데 더 복잡한 방식으로 보이며 코드의 가독성을 높이는데 도움이되지 않을 수도 있습니다. –

답변

0

이 변수의 사용에 따라 다릅니다 circleSize.

당신은 자주 당신이 그것을 예 1

은 또한 때때로 다른 클래스가이 값에 도달 할 같이이 글로벌하게하는 것이 좋습니다 예에서 보여준 경우처럼 사용, 그래서 당신은 확인해야하는 경우 그것은 속성이며 setter와 getter를 추가합니다.

1

하나의 메소드에서만 해당 변수를 사용하려는 경우이를 다른 모든 메소드에 공개하는 비공개로 만들 필요가 없습니다. 변수를 전달하기 위해 선택하는 대신이 개인 만듦으로써 :

  1. 당신은 다른 방법에 노출되지 않도록
  2. 당신은 변수가 어디에 있는지 찾고되지 않기 때문에 코드는, 읽기 쉽게 변경
  3. 당신은 당신의 클래스에 대한 불필요한 속성을 피하기
1

대답은 매우 광범위하지만, 원칙적으로는 데메테르의 법칙을 따를 수 :

,369을
  • 각 유닛은 다른 유닛에 대한 지식이 제한되어 있어야합니다. 현재 유닛과 "밀접하게"관련된 유닛 만 존재해야합니다.
  • 각 단위는 친구와 만 이야기해야합니다. 낯선 사람에게 말하지 마라.
  • 친구와 만 대화하십시오. 그래서

    https://en.wikipedia.org/wiki/Law_of_Demeter

,이 특별한 경우에, 인수를 사용합니다. 결과로 나온 앱은 더 쉽게 테스트하고 이해하기 쉽습니다.

+0

나는 전에이 법에 대해 들어 보지 못했다. 또는 나는 그것이 존재한다는 것을 잊었다. :) 고마워. –

+0

그것은 객체 지향 소프트웨어입니다 :) – Andres

관련 문제