게터와 세터를 정의하는 순서는 무엇입니까? [닫은]


14

게터와 세터를 정의하는 순서에 대한 모범 사례가 있습니까? 두 가지 관행이있는 것 같습니다.

  • 게터 / 세터 쌍
  • 첫 번째 게터, 세터 (또는 다른 방법)

차이점을 밝히기 위해 getter / setter 쌍의 Java 예제가 있습니다.

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public int getVar2() {
    return var2;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

다음은 첫 번째 getter와 setter의 Java 예제입니다.

public class Foo {
    private int var1,
    var2,
    var3;

    public int getVar1() {
    return var1;
    }

    public int getVar2() {
    return var2;
    }

    public int getVar3() {
    return var3;
    }

    public void setVar1(int var1) {
    this.var1 = var1;
    }

    public void setVar2(int var2) {
    this.var2 = var2;
    }

    public void setVar3(int var3) {
    this.var3 = var3;
    }
}

코드와 클래스 다이어그램에서 후자의 유형이 더 명확하다고 생각하지만 다른 유형의 순서를 배제하기에 충분한 지 모르겠습니다.

답변:


8

첫 번째 방법. 가능하면 항상 같은 그룹에서 작동하는 관련 기능으로 그룹화하거나 가까이 유지하십시오.

이러한 방식으로 코드를 정렬하면 한 클래스가 너무 많은 다른 클래스에서 인수 분해 될 수있는 경우 인수 분해 가능한 부분은 일반적으로 특정 멤버 변수를 중심으로 진행되므로 리팩토링하는 것이 더 쉽고 명확 해집니다.

일반적으로 동일한 페이지에서 객체 / 변수의 전체 수명주기를 모두 볼 수있을 때 코드를 디버그, 이해 및 조작하는 것이 더 쉽습니다. 스코프 및 알파벳 순서와 같은 피상적 특성을 기반으로 한 코드 레이아웃은 실제로 볼 수 없기 때문에 리팩토링 할 기회를 놓친다는 것을 의미합니다.


동일한 멤버에서 작동하는 함수를 함께 유지해야하는 이유에 대한 추가 인수를 포함 하시겠습니까?
NN

몇 가지 이유가 추가되었습니다.
베네딕트

25

당신이 팀에 있다면, 평소에하는 일을하십시오. 그렇지 않으면 더 좋아하는 것을 선택하십시오. 중요한 디자인 선택의 규모에서 이것은 아마도 "스페이스 바를 치기 위해 어떤 엄지 손가락을 사용해야합니까?"


7
완전히 동의하십시오. 이것은 모든 사람의 코딩 표준 규칙해야한다 "작은 물건을 걱정하지 않는다"의 제목하에 제공 # 0 (그것은 이다 허브 셔터와 안드레 Alexandrescu에 의한 "표준 코딩 ++ C"의 규칙 # 0.)
데이비드 Hammen

나는 사람들이 스페이스 바를 칠 때 어떤 엄지 손가락을 사용해야하는지 많은 논쟁을했다고 확신한다))))
superM

@Michael 나도 오른쪽에 있습니다. 나는 왼쪽을 독점적으로 사용하려고 시도했지만 매우 어려워서 입력 속도가 느려졌습니다.
axblount

@axblount 나는 오른손이지만 항상 내 왼손 엄지 손가락을 사용하십시오. 내 권리를 시험해 보았고 당신이 묘사 한 것과 같은 경험을했습니다. 또한 어떤 이유로 든 왼손으로 "y"를 입력합니다.
KChaloux

6

언어에 따라 달라질 수도 있습니다. Java에서는 어느 쪽이든 순서에 따른 이점이 없지만 C #에서는 "속성"이라는 개념이 있는데,이 속성은 게터와 세터를 함께 그룹화하므로 해당 순서를 강제합니다. getter와 setter (예 : private setter, public getter)에 대해 다른 가시성을 원할 수있는 C ++과 같은 언어에서는 가시성 수정자가 각각 개별적으로가 아니라 여러 방법에 대해 한 번만 제공되므로 반대의 경우가 있습니다 .


5

내가 아는 한, 단일 규칙은 없습니다. 파일 구성Oracle Java Code Conventions 섹션 에는 게터 및 세터의 배치가 명시 적으로 언급되어 있지 않지만 다음과 같이 명시되어 있습니다.

이러한 방법은 범위 나 접근성보다는 기능별로 그룹화해야합니다.

이것은 어떤 지침도 제공하지 않습니다. 어느 게재 위치가이 기준을 충족한다고 주장 할 수 있습니다.

고려해야 할 사항은 최신 IDE를 사용하면 텍스트 코드 구성 요소보다 파일 구조에 대한 더 추상적 인 뷰를 가질 수 있다는 것입니다. 강력한 검색 도구와 함께 사용하면 파일을 쉽게 탐색하고 큰 파일 내에서 적절한 방법을 찾을 수 있습니다.

예를 들어, Eclipse는 메소드 및 필드를 다른 방식으로 정렬 및 필터링하고 파일의 위치로 바로 이동할 수있는 개요보기를 제공합니다. NetBeans는 비슷한 기능을 가지고 있었고 다른 IDE도 마찬가지라고 생각합니다.

IDE 외부에서 코드를 읽는 경우에만 문제가 될 수 있습니다. 예를 들어 외부 코드 검토 도구를 사용하거나 버전 제어 시스템에서 델타를 볼 수 있습니다.

가장 좋은 솔루션은 프로젝트의 파일간에 일관성을 유지하는 것입니다. 표준을 찾아 문서화 한 다음이를 준수하십시오.


1

단일 필드에 대한 게터와 세터를 쌍으로 그룹화하십시오.

모든 게터와 모든 세터를 함께 그룹화하면 어떤 필드에 게터 또는 세터가 있는지 알기가 어렵습니다.

코드를 읽거나 특정 기능을 찾을 때 클래스마다 필드가 있고 각 필드에는 게터와 세터가 있습니다. 클래스에 getters 그룹과 setters 그룹이 있고 각 필드에 필드가있는 것은 이해가되지 않습니다.


따라서 클래스의 특정 필드를 처리하는 방법을 쉽게 이해할 수 있기 때문에 필드의 getter가 해당 필드의 getter와 쌍을 이루어야한다고 주장합니다.
NN

그것은 클래스의 개념 모델입니다. 수업은 주로 기능별로 구성해야합니다. 클래스를 만들 때 공개적으로 볼 수 있고 변경 가능한 필드가 필요하다고 결정할 수 있습니다. 그것이 게터와 세터 메소드를 통한 구문 표현이 아니라 개념적인 "기능"입니다.
M. Dudley

0

이제까지 Java IDE는 getter 및 setter를 생성 할 수 있습니다. 해당 기능을 사용하고 IDE에서 생성 한 것과 같은 메소드의 순서를 그대로 두십시오. 이것은 생성 된 코드이므로 불필요하게 만지지 마십시오.


나는 이것을 알고있다. 그러나 예를 들어 Eclipse 에서는 다른 순서 중에서 선택할있습니다 .
NN

권리. 기본 옵션 인 "getter / setter 쌍의 필드"가 더 유용합니다. 나중에 어떤 메소드가 어디로 갈지 걱정할 필요없이 더 많은 필드를 추가하고 접근자를 더 생성 할 수 있기 때문입니다.
user281377
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.