긴 매개 변수 목록 대 긴 상태 변수 목록


10

C ++ 책에서 저자는 대부분의 매개 변수를 클래스의 상태 변수로 리팩토링 할 수 있으므로 긴 매개 변수 목록이있는 함수가 더 이상 필요하지 않다고 말합니다. 한편, 함수형 프로그래밍 책은 상태 변수가 악의적 인 결과를 초래하여 버그가 발생하기 쉽고 코드를 병렬화하기 어렵 기 때문에 상태 변수가 악하다고 말합니다. 나는 당황하고있다. 코드가 상태 변수를 함수 매개 변수 목록으로 이동하여 가능한 한 상태 변수에 의존하지 않아야합니까?


C ++에 대해 언급 한 최초의 책이 기능적 언어입니까?
Martin York

답변:


7

procedural또는 functional패러다임으로 프로그래밍 중인지 여부에 따라 다릅니다. 전자의 경우 변경 가능 상태가 필요하며 나중에는 변경이 필요합니다. 이것은 사과와 오렌지입니다. 그들은 모두 bailiwicks에 정확합니다!

단일 할당 및 기타 기능 기술을 명령형 절차 언어에 적용 할 수 있으며, 불변 상태는 동시 프로그래밍을보다 결정 론적으로 만들 수 있지만, 메모리 모델이이 패러다임을 쉽게 지원하지 않기 때문에 Java 또는 C ++와 같은 언어에서 모든 객체를 불변으로 만드는 것은 거의 불가능합니다.


:감사! << 모든 프로그래머가 알아야 할 사항 >>이란 책은 부작용을 피하는 것과 같은 기능적 프로그래밍 원칙을 적용해야한다고 말합니다. 명령형 코드 컨텍스트에서 기능적 프로그래밍 원칙을 적용 할 수 없습니까?
TomCaps

절차 적 프로그래밍 에는 상태가 필요 하지 않습니다 . 일반적이지만 필수는 아닙니다. 흔한 것은 다른 무엇보다도 습관 때문입니다. 비록 (상태) 변수를 유지하는 것이 대안 (예 : 비동기 처리)보다 쉬운 상황이 확실히 있음을 인정할 것입니다.
Marjan Venema

@Marjan 불변의 변수를 가진 모든 것은 state

@Jarrod : 이제 혼란스러워했습니다. 답을 다시 읽고 "Mutable state is required"에서 "Mutable"을 놓친 것을 알 수 있습니다. 그러나 귀하의 의견은 불변의 변수를 갖는 것이 상태라고 말합니다. 이해하지 마십시오. 나는이 용어로 변하고 불변에 대해 던지고 생각하는 데 익숙하지 않기 때문일 수 있습니다. 읽을만한 참고 자료가 있습니까?
Marjan Venema

@MarjanVenema : 예, 불변 변수를 갖는 것은 상태입니다. 절차 적 프로그래밍과 기능적 프로그래밍의 처리 상태 차이는 proc.prog가 아닙니다. 상태가 있고 기능적인 것은 아닙니다. 차이는 proc입니다. 음식물. 이 변경 가능한 상태가 항상 (순수) 함수형 프로그래밍에서 불변 반면, 상태를. 예를 들어 en.wikipedia.org/wiki/Purely_functional를 참조하십시오 . 순전히 기능적인 언어는 업데이트를 피한다고 설명합니다.
썰매

1

귀하의 질문을 올바르게 이해하면 매개 변수 또는 클래스 변수 / 멤버 / 필드 / 등을 사용할 수있는 조건에 대해 질문하고 있습니까? 함수가 아니라 메서드를 참조한다고 가정합니다. 이것이 C ++에 관한 것이라면 질문을 스택 오버플로로 옮기는 것이 좋습니다.

긴 매개 변수 목록은 메소드를보다 세분화 된 메소드로 리팩토링해야 할 수도 있습니다. 일반적으로 매개 변수를 사용하면 코드가 느슨하게 결합됩니다. 이것이 대부분의 현대 OO 언어에서 이것이 사실인지 확실하지 않지만, 특히 많은 클래스 변수가 관련된 경우 객체 생성이 비쌀 수 있습니다. 따라서 클래스 변수가 객체이고 프로그램에서 자주 참조 된 경우 클래스 변수 인 것으로 정당화 될 수 있습니다.

또한:

  • 다른 메소드가 클래스 변수를 사용할 수 있습니까? 그렇다면 클래스 변수를 사용하는 것이 좋습니다.
  • 방법이 공개되어 있습니까? 공개 인 경우 매개 변수를 사용하십시오.
  • 매개 변수 목록을 해시 / 맵 / 배열 / 컬렉션 / 목록 / 등으로 적절하게 나타낼 수 있습니까? 그렇다면 옵션으로 고려하십시오.
  • 방법이 정적인가? 그렇다면 매개 변수를 사용하십시오.

0

아닙니다. 상태 변수 자체 부작용을 일으키지 않습니다 .

(다른 표시되는 데이터 구조) 세터 메소드를 호출하는 단계 이다 부작용.

긴 매개 변수 목록을 숨기고 그에 따라 부작용을 피하는 데이터 구조를 가질 수 있습니다. 다음은 작은 예제입니다 (Java에서는 테스트되지 않음).

class ManyParams {
    final String theName = null;
    final int    theAge = 0:
    ManyParams() {}
    ManyParams(String a, int b) { theName=a; theAge = b; }
    public withName(String n) {
        return new ManyParams(n, this.theAge);
    }
    public withAge(int i) {
         return new ManyParams(theName, i);
    }
}
/// to be used like this
foo(new ManyParams.withName("John").withAge(42));

물론 ManyParams의 생성자는 여전히 이런 식으로 긴 매개 변수 목록을 갖습니다. 그러나 그 숨겨진.

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