내부 멤버 사이에 클래스 멤버를 선호하거나 인수를 전달 하시겠습니까?


39

클래스의 개인 부분 내에 여러 개인 메소드가 사용하는 값이 있다고 가정하십시오. 사람들은 이것을 클래스의 멤버 변수로 정의하거나 각 메소드에 대한 인수로 전달하는 것을 선호합니까? 그 이유는 무엇입니까?

한편으로는 클래스의 상태 (즉, 멤버 변수)를 줄이는 것이 일반적으로 좋은 일이라는 주장을 알 수 있지만 클래스의 메소드에서 동일한 값이 반복적으로 사용되는 경우 이상적입니다. 클래스가 상태를 나타내는 후보로 코드가 다른 경우 코드를 눈에 띄게 깨끗하게 만듭니다.

편집하다:

제기 된 의견 / 질문 중 일부를 명확히하기 위해 상수에 대해 이야기하는 것이 아니며 특정 사례와 관련이 없으며 다른 사람들과 이야기 한 가설에 불과합니다.

잠시 OOP 각도를 무시하고, 내가 염두에 둔 특정 유스 케이스는 다음과 같습니다 (의사 코드를 더 깨끗하게하기 위해 참조로 전달한다고 가정)

int x
doSomething(x)
doAnotherThing(x)
doYetAnotherThing(x)
doSomethingElse(x)

그래서 의미하는 바는 여러 함수 사이에 공통적 인 변수가 있다는 것입니다. 필자의 경우 작은 함수 체인으로 인한 것입니다. OOP 시스템에서, 이것들이 클래스의 모든 메소드라면 (큰 메소드에서 메소드를 추출하여 리팩토링으로 인해), 그 변수가 그들 주위에 전달되거나 클래스 멤버가 될 수 있습니다.


1
이 값은 어떻게 사용됩니까? 일정합니까? 바뀌나요? 편집간에 변경이 적용됩니까?
Oded

모든 것이 자동으로 동일하다고 판단되면 문제가되지 않는다고 생각하기가 더 쉽습니다. x-1과 같은 조정 된 (x) 값이 필요한 기능이 있다면 어떨까요?
JeffO

답변:


15

값이 클래스의 속성이면 클래스에 유지하고, 그렇지 않으면 외부에 유지하십시오. 클래스 메서드를 먼저 디자인하지 말고 속성을 먼저 디자인하십시오. 먼저 그 속성을 수업에 넣지 않았다면 아마도 그 이유가있을 것입니다.

확장 성 측면에서 가장 나쁜 것은 편의를 위해 코드를 변경하는 것입니다. 조만간 코드가 부풀어 오르고 복제되는 것을 보게 될 것입니다. 그러나 나는 때때로이 규칙을 어기는 것을 인정해야한다 ... 편의성은 너무나도 매력적이다.


1
동의합니다-클래스의 원래 디자인 / 목적은 멤버 변수인지 아니면 인수인지를 알려줍니다. 의존성 주입 각도에 대해서도 생각할 가치가 있습니다.
Martijn Verburg

14

실제로 호출 사이의 상태를 유지할 필요가 없다면 (그리고 분명히 묻지 않거나 질문하지 않을 것입니다), 값은 멤버 변수가 아닌 인수가 좋습니다. 메소드의 서명에서 인수를 사용한다는 것을 알려주는 반면 메소드가 사용하는 멤버 변수를 즉시 알기가 조금 어렵습니다. 또한 개인용 멤버 변수가 무엇인지 항상 신속하게 결정하는 것은 아닙니다.

따라서 일반적으로 멤버 변수를 사용하는 코드가 눈에 띄게 깨끗하다는 데 동의하지 않지만 메서드 서명이 손에 닿지 않으면 예외가 발생할 수 있습니다. 가치있는 질문이지만 어떤 경우에도 프로젝트가 연결되는 것은 아닙니다.


10

질문을 해주셔서 감사합니다.이 질문도하고 싶었습니다.

내가 이것에 대해 생각할 때, 왜 그것을 논쟁으로 넘겨 주는지 몇 가지 장점이 있습니다.

  • 테스트가 더 쉬워지고 유지 관리가 쉬워집니다 (마지막 포인트와 관련됨)
  • 부작용이 없습니다
  • 이해하기 쉽다

예를 들어 요점을 분명히 알 수 있습니다. 하나는 Excel 문서를 구문 분석하고 (예 : POI 라이브러리 사용) 행 인스턴스를 해당 행과 함께 작동 해야하는 모든 메소드에 전달하는 대신 작성자 변수에 멤버 변수 currentRow를 가지고 작동합니다.

이 반 패턴의 이름이 있어야한다고 말하고 싶습니까? ( 여기에 나열되지 않음 )


안티 패턴이란 무엇을 의미합니까?
Vahid Ghadiri

즉, 두 개 이상의 함수 호출간에 매개 변수를 공유하기 위해 멤버 변수를 가지
려면

1

아마도 해당 값을 공유하는 모든 메소드를 포함하는 새 클래스를 추출해야합니다. 물론 최고 수준의 방법은 새로운 클래스에서 공개됩니다. 해당 테스트 방법을 공개하는 것이 도움이 될 수 있습니다.

항상 함께 전달되는 둘 이상의 임시가있는 경우 새 클래스를 거의 추출해야합니다.


1

사람들은 이것을 클래스의 멤버 변수로 정의하거나 각 메소드에 대한 인수로 전달하는 것을 선호합니까? 그 이유는 무엇입니까?

당신이 요구하는 것을 이해한다면 : 클래스의 메소드는 정의에 따라 구현 세부 사항에 특유하므로 모든 메소드에서 직접 멤버를 사용하는 것에 대한 자격이 없습니다.

한편으로 클래스의 상태를 줄이는 것이 일반적으로 좋은 일이라는 주장을 알 수 있습니다 ...

private static final상수를 정의 하기 위해 a 를 선언해도 아무런 문제가 없습니다 . 컴파일러는 일부 최적화를 고려할 때 값을 사용할 수 있으며 상수이므로 실제로 클래스에 상태를 추가하지는 않습니다.

클래스의 메소드에서 동일한 값이 반복적으로 사용된다면 ...

기호로 (예 :) 참조 할 수 BLRFL_DURATION있고 메소드에 추가 인수를 추가하지 않아도되면 코드를 더 읽기 쉽고 유지 보수하기가 쉬워집니다.


0

값이 변경되지 않으면 정의에 따라 상수 이며 클래스 내부에 캡슐화되어야합니다. 이 경우 객체의 상태에 영향을 미치는 것으로 간주되지 않습니다. 나는 당신의 경우를 모르지만 삼각법의 PI와 같은 것을 생각합니다. 그러한 상수의 인수를 전달하려고하면 클라이언트가 잘못된 값이나 메소드가 예상하는 것과 동일한 정확도를 갖지 않는 값을 전달하면 결과가 오류에 노출 될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.