답변:
procedural
또는 functional
패러다임으로 프로그래밍 중인지 여부에 따라 다릅니다. 전자의 경우 변경 가능 상태가 필요하며 나중에는 변경이 필요합니다. 이것은 사과와 오렌지입니다. 그들은 모두 bailiwicks에 정확합니다!
단일 할당 및 기타 기능 기술을 명령형 절차 언어에 적용 할 수 있으며, 불변 상태는 동시 프로그래밍을보다 결정 론적으로 만들 수 있지만, 메모리 모델이이 패러다임을 쉽게 지원하지 않기 때문에 Java 또는 C ++와 같은 언어에서 모든 객체를 불변으로 만드는 것은 거의 불가능합니다.
귀하의 질문을 올바르게 이해하면 매개 변수 또는 클래스 변수 / 멤버 / 필드 / 등을 사용할 수있는 조건에 대해 질문하고 있습니까? 함수가 아니라 메서드를 참조한다고 가정합니다. 이것이 C ++에 관한 것이라면 질문을 스택 오버플로로 옮기는 것이 좋습니다.
긴 매개 변수 목록은 메소드를보다 세분화 된 메소드로 리팩토링해야 할 수도 있습니다. 일반적으로 매개 변수를 사용하면 코드가 느슨하게 결합됩니다. 이것이 대부분의 현대 OO 언어에서 이것이 사실인지 확실하지 않지만, 특히 많은 클래스 변수가 관련된 경우 객체 생성이 비쌀 수 있습니다. 따라서 클래스 변수가 객체이고 프로그램에서 자주 참조 된 경우 클래스 변수 인 것으로 정당화 될 수 있습니다.
또한:
아닙니다. 상태 변수 자체 는 부작용을 일으키지 않습니다 .
(다른 표시되는 데이터 구조) 세터 메소드를 호출하는 단계 이다 부작용.
긴 매개 변수 목록을 숨기고 그에 따라 부작용을 피하는 데이터 구조를 가질 수 있습니다. 다음은 작은 예제입니다 (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의 생성자는 여전히 이런 식으로 긴 매개 변수 목록을 갖습니다. 그러나 그 숨겨진.