2010-06-18 4 views
1

개인용 메서드를 만들 때 종종 클래스의 기존 변수를 수정 (보통 초기화)하는 것과 같은 생각을하고 있습니다. 내가 선호하는 다음 두 가지 방법 중 어느 것을 결정할 수 없습니다.private 함수가 필드 변수를 수정해야합니까? 아니면 반환 값을 사용해야합니까?

필드 변수가 xTest 클래스가 있다고 가정 해 보겠습니다. 인 정수으로 지정하십시오. x은 일반적으로 어떻게 수정합니까?

가) 반환 값

private int initX(){ 
    // Do something to determine x. Here its very simple. 
    return 60; 
} 


그리고 생성자에서 사용) 분야에 직접

private void initX(){ 
    // Do something to determine x. Here its very simple. 
    x = 60; 
} 


B 수정 :

public Test(){ 
    // a) 
    initX(); 
    // b) 
    x = initX(); 
} 


b) 우리가 다루는 변수는 분명합니다. 그러나 다른 한편으로는 a)으로 충분할 것 같습니다. 함수 이름은 우리가하는 일을 완벽하게 의미합니다!

어느 쪽을 선호합니까? 그 이유는 무엇입니까?

답변 해 주셔서 감사합니다. 나는 이것에 대한 정답이 없다는 것을 깨닫기 때문에 이것을 커뮤니티 위키로 만들 것이다.

+0

프로그래밍에 대한 기능적 접근 방식을 찾고 있다면 아마도 ** b **가 더 선호되는 선택 일 것입니다. –

답변

0

실제로 메소드 만 예상대로 작동합니다 (메소드 이름 분석). 방법 b)는 귀하의 예제에서 'return60'또는 좀 더 복잡한 항목에서 'getXValue'로 명명해야합니다.

두 가지 옵션 모두 내 생각에 정확합니다. 어떤 디자인이 선택되었을 때 당신의 의도는 무엇 이었습니까? 귀하의 방법을 초기화해야 할 경우에만 선호하는) beacuse 그것은 간단합니다. x 값이 b) 옵션을 사용하는 로직 어딘가 다른 곳에서도 사용되는 경우보다 일관된 코드로 이어질 수 있습니다.

또한 항상 메서드 이름을 명확하게 작성하고 실제 이름과 일치하는 이름을 만들어야합니다. (이 경우 방법 b) 혼동을 일으키는 이름이 있음).

1

나는 보통 b)을 선호합니다.이 경우 computeX()과 같이 다른 이름을 선택합니다. 이유를 몇 가지 이유 :

내가 어떻게 작동하는지 유입 서브 클래스에 대한 간단한 방법이 computeX() protected로 선언하는 경우
  • , 아직 x 자체가 private 필드 남아있을 수 있습니다;
  • 나는 필드가 final 인 경우이를 선언하고 싶습니다. 이 경우 )은 초기화가 컴파일러에서 발생해야하기 때문에 옵션이 아닙니다. (이것은 자바에 고유하지만 예제 모두 자바처럼 보입니다).

그렇긴하지만 나는 두 가지 방법 사이에 강한 선호도가 없습니다.예를 들어 여러 관련 필드를 한 번에 초기화해야하는 경우 보통 을 선택합니다.. 그래도, 나는 어떤 이유로 든 생성자에서 직접 초기화 할 수 없거나 원하지 않는 경우에만 그렇습니다.

1

초기화의 경우 가능한 경우 생성자 초기화 ( public Test():x(val){...})를 사용하거나 초기화 코드를 생성자 본문에 씁니다. 생성자는 모든 필드를 초기화하는 가장 좋은 장소입니다 (실제로는 생성자의 목적입니다). 나는 private initX() 접근법을 사용한다. X에 대한 초기화 코드가 너무 길면 (단지 가독성을 위해) 생성자에서이 함수를 호출하면된다. private int initX() 제 생각에는 초기화와 관련이 없습니다 (게으른 초기화를 구현하지 않는 한,이 경우에는 &int 또는 const &int을 반환해야합니다), 접근 자입니다. 당신이 그것을 지원 언어에서 const를 기능 할 수 있기 때문에

1

나는) 옵션 B를 선호 할 것입니다.

옵션 A와

)는 initX 방법에 약간의 추가 작업을 추가하는 대신 새로 만들기를 시작하기 위해, 새로운 게으른하거나 시간을 강조 개발자를위한 유혹이있다. 객체의 소비자 심지어 거기에 알 필요가 없습니다

B의 또한

), 당신은 클래스 정의에서 initX()를 제거 할 수 있습니다. 예를 들어, C++. 헤더에서

다음 CPP 파일에서

class Test { 
private: int X; 
public: Test(); 
... 
} 

: 헤더 파일에서 초기화 기능을 제거

static int initX() { return 60; } 

Test::Test() { 
    X = initX(); 
} 

그것을 사용해야하는 사람들을위한 클래스를 단순화합니다.

1

아니요?

많은 필드를 초기화해야하거나 인스턴스 수명 시간의 다른 시점에서 다시 초기화하는 기능이 필요한 경우에만 생성자에서 초기화하고 초기화 메서드를 추출하는 편이 더 좋습니다 파괴/구조).

더 중요한 것은 60은 무엇을 의미합니까?

의미있는 값인 경우 의미있는 이름 (NUMBER_OF_XXXXX, MINUTES_PER_HOUR, FIVE_DOZEN_APPLES, SPEED_LIMIT ...)으로 const로 지정하십시오. 이후에 사용하는 방법 및 위치 (생성자, 초기화 메소드 또는 getter 함수)에 관계 없습니다.

는 명명 된 상수 만드는 것은 그 자체의 값이 다시 유용한한다. 그리고 const를 사용하는 것은 특히 더 유비쿼터스 한 값 (1이나 -1과 같은)과 실제 값을 사용하는 것보다 훨씬 더 "찾기가 쉽다".

만 당신은 클래스 CONST 또는 var 또는를 만들기 위해 나에게 의미를 만들 수있는 특정 클래스에이 CONST 값을 묶어 할 때 - 게터 클래스 기능 - 그것은 언어가 사람들을 지원하지 않습니다.

하위 클래스가 다른 초기 값으로 시작하는 능력을 필요로하는 경우 그것은 (가상) getter 함수가 될 수 있도록하는 또 다른 이유. (주석에 응답)


편집 : 나는 또한 계산을 할 수있는 방법을 추출 할 복잡한 계산을 수반 초기화를 들어

.이 방법을 필드 값 (a)을 직접 수정하는 절차 또는 주어진 값 (b)을 반환하는 함수를 선택하는 것은 계산이 다른 시간에 필요할지 여부에 따라 결정됩니다 "단지 생성자".

생성자에서 초기화시에만 필요한 경우 메서드 (a)를 사용하는 것이 좋습니다.

다른 시간에도 계산을 수행해야하는 경우 결과를 다른 필드 또는 로컬 변수에 할당 할 수 있으므로 (b) 방법을 선택하므로 하위 항목 또는 하위 항목에서 사용할 수 있습니다. 인스턴스의 내부 상태에 영향을주지 않으면 서 클래스의 다른 사용자.

+0

저는 그가 단지 자리 표시 자 이름 만 사용하고 있다고 확신합니다. 실생활에서, 그의 방법은'return 60'보다는 훨씬 더 많이 할 것입니다; 아마도 프로그램의 상태에 따라 계산을 할 것입니다. –

+0

정확하게 @Justin. 예는 단지 ... 예제입니다. 또한, 나는 간단한 초기화가 생성자에서 이루어져야한다는 것에 동의한다. 하지만 내 질문은 간단하지 않은 초기화를 목표로하므로 생성자가 혼란 스럽다. –

0

@Frederik, 옵션 b)를 사용하고 많은 필드 변수가있는 경우 생성자는 매우 다루기 어려운 코드 블록이됩니다. 때로는 클래스에서 멤버 변수를 많이 도울 수는 없지만 (예 : 도메인 객체이고 데이터베이스의 매우 넓은 테이블에서 바로 데이터가옵니다.) 가장 실용적인 접근법은 필요에 따라 코드를 모듈화하는 것입니다.

관련 문제