2014-10-29 3 views
0

Java 클래스 소개에서 변수에 대한 연구를하고있었습니다. 지식이 풍부한 프로그래머들은 대중의 시야에 변수를 정의하는 것은 나쁜 습관이라고 말합니다. 나는 그들이 나쁜 습관이라고 말하지만 나는 운율이나 그들의 주장에 대한 이유를 발견 할 수 없다고 말한다. 이것이 내 코스의 어플리케이션에서 변수를 정의한 방법입니다.왜 변수를 공개적으로 공개하는 것이 좋지 않은가?

public class DykhoffWk3Calculator 
    { 
     /* 
     * This class is used to define the variables in a static form so all 
     * classes can access them. 
     */ 
     public static double commissionRate = .03, startSalary = 45000, 
       accelerationFactor = 1.25; 
     public static double annualSales, commissionTotal, totalCompensation, 
       total, count, count2; 
     private static Object input; Object keyboard; 

public static class UserInput 
    { //Then continue with my other classes 

나는 이것을 정의하는 논리적 방법이라고 생각했는데, 메인뿐만 아니라 모든 클래스가 이들을 액세스 할 수있었습니다. 왜 이것이 나쁜 습관이고 왜 변수를 정의해야하는지 설명 할 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다.

+0

"공용 클래스"가 아닌 공용 공개. –

+0

변수는 메모리를 사용하므로 필요한 것보다 많은 메모리를 사용하기 때문에 보 조 범위에서만 초기화/생성해야합니다. – jbutler483

+0

Theire는 '공용 클래스의 변수'와 '클래스의 공용 변수'의 차이입니다. – jhamon

답변

4

간단히 말해서 클래스의 공개 된 "표면적"이 API를 효과적으로 정의하기 때문입니다.

메소드를 통해 내용을 노출 한 경우 나중에 작동하는 방법에 대한 세부 사항을 변경할 수 있습니다. 그러나 필드를 노출하고 컨트롤 밖에있는 다른 클래스가 해당 필드를 참조하기 시작하면 나머지 시간 동안 해당 필드를 표시하는 데 어려움을 겪습니다. 또는 이전 버전과의 호환성을 깨기 전까지

나는 이것을 정의하는 논리적 인 방법이라고 생각했는데, 메인뿐만 아니라 모든 클래스가이 클래스에 액세스 할 수있었습니다.

일반적으로 "모든 클래스"가 해당 클래스에 액세스하는 것을 원하지 않습니다. 소프트웨어 작업의 대부분은 코드를 작성하는 것이지 처음 쓰는 것이 아닙니다. 경험이 많은 개발자는 코드에 대한 모범 사례가 일반적으로 가장 유지하기 쉬운 코드라고 생각합니다. 처음에는 코드를 작성하는 것이 가장 편리합니다.

그리고 언제 어디서나 액세스 할 수있는 변수가 있고 수정 방법에 대해 약간의 조정을하고 싶다면 어떻게 이것이 안전하다는 것을 확신 할 수 있습니까? 이것이 참조되는 모든 방식을 추적하고 변경 효과가 어떤 영향을 미치는지 판단하는 데 얼마나 걸릴 것입니까? (공개 필드에만 한정하여 여러 스레드에서 동시에 실행하거나 다시 실행하는 것과 관련하여 재사용 성을 키스 할 수 있습니다.)

대체로 말해서 클래스의 "표면적"을 줄이는 것이 좋습니다. 해야 할 일. 다른 클래스가이 클래스와 상호 작용할 수있는 방법을 제한하면 관계를 제어하고 이해하는 것이 훨씬 쉬워지고 다른 클래스에도 "보이지 않게"하는 내부 변경을보다 쉽게 ​​할 수 있습니다. 이 클래스 이 수행하는 작업에 대해, 다른 클래스에 제공 할 인터페이스 (실제로는 interface이든 아니든)를 정의하는 것으로 생각하십시오. 그리고 이러한 요구 사항을 충족시키는 데 필요한 최소한의 것만 다른 클래스에 공개하십시오.

그리고 변수에 임의로 액세스하도록 허용하지 않습니다.

+0

공개 필드가 없으므로 해결책은 getters와 setter를 제공하는 것입니다. – dkatzel

+0

답변 해 주셔서 감사합니다! 당신은 왜 이것이 이것이 좋은 일이 아닌지 이해할 수 있도록 도와주었습니다. 외부 단체가 의도하지 않은 경우에도 이러한 변수를 변경할 수 있다는 것을 알았습니다. 다시 감사합니다! –

+1

@dkatzel 나는 규범 적이 지 않을 것이다. 끝까지 언급했듯이이 수업에서 제공하기를 원하는 개념적 작업/기능에 대해 생각해 봐야합니다. 그런 다음 제공하는 데 필요한 모든 작업을 수행해야합니다. 따라서 getter를 통해 일부 속성을 노출하는 것이 합리적이라면 getter를 정의해야합니다. 그러나 실제로 필요하지 않다면 나는 이것을 할 수 있다고 생각하지 않는다. –

0

일반적으로 클래스의 공용 변수는 좋지 않습니다. 이것은 다른 클래스/프로그램을 의미하기 때문에 인스턴스의 상태를 수정할 수 있습니다.

상태를 보호하고 상태가 "일관성"을 유지하는 것은 클래스의 책임이므로 공용 설정자를 정의하여이를 시행 할 수 있습니다 (코드를 실행하여 상태를 검사/복구 할 수 있기 때문에).

변수를 public으로 설정하면 상태가 보호되지 않습니다. 나중에 모든 표현 가능한 상태가 유효한 상태가 아닌 경우 문제가 발생합니다.

:

는 당신이 ArrayList<T>을 구현하고 싶은 말은, 그것은 (완전히 구현되지 않음)과 같이 표시됩니다

public class ArrayList<T> { 

    public int size = 0; 
    public Object[] data = new Object[5]; 

} 

지금 하나가 ArrayList에의 size을 수정할 수 있습니다. 없이 요소를 추가하십시오. 이제 ArrayList<T> 인스턴스에/add/copy/...를 제거하도록 요청하면 작동하는 데이터가 잘못 될 수 있습니다.

아마도 프로그래머가 좋다는 주장을 할 수 있습니다. "규칙"에 따라 필요하지 않는 한 그는 객체를 수정하지 않습니다. 그러나 그러한 일들은 결국 항상 잘못되고, ArrayList의 정의를 수정하려는 경우 (예 : size에 두 개의 int을 사용). 이 경우 해당 필드를 설정하는 모든 코드를 다시 작성해야합니다.

는 결론을하려면 private/protected이/손상 무효/일관성 인스턴스를 설정하는 다른 인스턴스에서 클래스 인스턴스를 보호 에 발명되어/...

+0

감사합니다. 정말 도움이되었습니다. –

1

그래서 일반 지점이 당신 사실 DON이다 누구나 그 가치에 접근 할 수 있기를 바랍니다. 이러한 변수를 볼 수있을뿐만 아니라 원하는대로 변경할 수도 있습니다. 이것은 더 크고 복잡한 프로그램에서 문제를 일으킬 수 있습니다.

나중에 클래스가이 값을 사용/저장하는 방법을 변경하려면 해당 공용 변수에 직접 액세스하는 다른 모든 클래스를 직접 변경하지 않아도됩니다. 대신에 원하는 액세스 권한 만 제공하는 메소드를 제공해야합니다.

표준 유추는 자동차 운전의 비유입니다. 당신은 바퀴를 돌리는 방법, 브레이크를 치는 방법 등을 알고 있습니다. 그러나 자동차가 실제로 이런 것들을 어떻게하는지는 알지 못합니다. 따라서 엔진을 극적으로 바꿔야하거나 새 차를 가지고 있다면 운전 방법을 여전히 알고있을 것입니다. 배후에서 일어나는 일에 대해 걱정할 필요가 없습니다.

+0

감사합니다. 정말 도움이되었습니다. –

0

먼저 잘못 표시했습니다.

가변적 인 공개 설정이 잘못되었습니다. 즉 : public String name = null; 이것은 나쁨입니다.

  • 등록 정보 : 당신은 항상 당신이 죄송합니다 OPPS 이념의 이데올로기에 조금 파고해야하는 클래스의 각 개체는 2 일이있을 것이다한다고 이유를 이해하기 private String name = null;

    로 수행해야합니다 변수 또는 상태라고도하는 것입니다.

  • 동작 : 우리가 메서드 또는 함수라고 부르는 것.

속성은 일정 기간 동안 개체를 식별합니다. 비헤이비어를 사용하면 객체의 속성을 관리 할 수 ​​있으므로 시간이 지남에 따라 동일한 객체가 다른 상태로 나타날 수 있습니다. 다음 기간 동안의 Product 객체는 '사용 가능한 광고 항목'또는 '장바구니에 추가됨'또는 ' 상태에 따라 '판매 됨'또는 '재고 없음'으로 표시됩니다. 상태는 객체에 대해 매우 중요하므로 객체는 해당 상태에서 직접 말도 안되는 돌연변이 연산을 허용하지 않아야합니다.객체는 변수를 비공개로 유지하고 외부 세계가 객체와 상호 작용하고 동작에서 실행 된 작업을 기반으로 상태를 변경하는 데 사용할 수있는 비헤이비어를 노출해야합니다. 예 : '사용 가능한 광고 항목'상태에 있던 Product 객체에서 'addToCart()'비헤이비어를 호출하면 상태가 '상태가'장바구니에 추가됨 '이 아니라 다른 사용자가이 제품 수를 인식하게 될 가능성이 있습니다 현재 사용 가능합니다.

짧은 이야기 : 필요한 경우를 제외하고는 돌연변이를 위해 속성을 외부 작업에 직접 노출하지 마십시오. 이것은 공개하지 않으며, 필요하지 않다면 setter 메소드를 제공하지 않습니다.

+0

고마워요! 정말 도움이되었습니다. –

0

규칙에 따라 공용 클래스 내에서 public (가장 제한적인) public으로 선언 된 메서드 및 생성자는 Java 프로그램의 모든 클래스에서 볼 수 있습니다. 이러한 클래스가 동일한 패키지 또는 다른 패키지에 있는지 여부를 나타냅니다. 필드의 값은 해당 필드에 액세스하는 다른 클래스에 영향을 미치므로 캡슐화의 전체적인 의미를 깨뜨릴 수 있습니다.

관련 문제