Martin의 Clean Code에서 언급 된 출력 인수는 무엇입니까?


14

Robert C. Martin의 Clean Code : Agile Software Craftsmanship 핸드북 45 페이지에서 Martin은 출력 인수를 피해야한다고 썼습니다. "출력 인수"의 의미를 이해하는 데 어려움을 겪고 있으며 왜 피해야합니까?

출력 인수에 대한 Martin의 예제 appendFooter(s);는 함수를 호출합니다 public void appendFooter(StringBuffer report). 코드의 그의 개선은report.appendFooter();

어쩌면 코드 컨텍스트가 부족하기 때문일 수 있지만 출력 인수를 사용하는 것이 어떻게 코딩이 좋지 않은지 알 수 없습니다. 누군가 개념을 설명하거나 이것을 이해하기 위해 코드의 예를 추가 할 수 있습니까?

위의 원칙에 따라 다음 함수가 부정한 코드의 예로 간주됩니까?

int[] numberArray = {3, 5, 7, 1};
sortArray(numberArray);

위의 출력 인수를 사용하지 않는 Martin의 원칙을 위반하는 경우 배열을 필드로 사용하는 개체와 배열을 정렬하기 위해 호출 할 수있는 함수를 갖는 것이 더 낫습니까?

ObjectWithArrayField numberArray = new ObjectWithArrayField(3, 5, 7, 1);
numberArray.sort();

답변:


11

밥 마틴은 단순히 가독성 에 대해 이야기하고 있습니다.

의 문제 appendFooter예를 들어 당신이 코드 라인 찾을 경우입니다 appendFooter(s)프로그램에서 어딘가를, 그 전화가 걸리는 경우 즉시 명확하지 않다 s입력 하고 어딘가를 추가, 또는 경우에 s그냥 데리고 전달되는 출력 하는 기능입니다. 확실하게 기능 설명서를 확인해야합니다. report.appendFooter()그러나 와 같은 호출 은 이러한 문제를 피합니다. 이제는 현재 상황이 훨씬 더 명확합니다.

그러나 Bob Martin은 "출력 인수를 절대 사용하지 마십시오"라고 말하지 않으며 "일반적으로 코드를 좀 더 깔끔하게 유지하는 데 도움이되므로 피해야합니다."라고 말합니다. 따라서 이것은 맹목적으로 따라야하는 두뇌를 잃은화물 컬트 규칙이 아닙니다.

Sort표준 배열과 컬렉션에 대한 메소드는 약간 다릅니다. 데 sort같은 방법을 가지고, 예를 들어,보기의 언어 디자이너의 관점에서 몇 가지 단점이있을 것입니다 방법을 각각의 표준 배열 데이터 타입의 멤버 함수를 Array.sort자바 런타임의 외부 표준 라이브러리에서이 문제를 유지할 수 있습니다. 그러나 때때로 정렬해야하는 개별 컬렉션 유형을 만들려면 sort멤버 함수로 추가 하는 것이 실제로 별도의 클래스에 넣는 것보다 더 좋습니다.


2
sortArray(numberArray)물론 numberArray제자리에 정렬 됩니다. 아니면의 사본을 만들고, 사본을 numberArray정렬하고, 정렬 된 사본을 전혀 변경하지 않고 반환 numberArray합니까?
8bittree

@ 8bittree : 그것은 사실이지만, 여기서 논란의 여지가 없습니다 sort(). "출력 인수"를 사용하지 않고도 컨테이너 의 메소드가 제자리에서 작동 할 수 있습니다. 따라서 sortArray(numberArray)적절한 방법 이기 때문에 "출력 인수 형식"을 정당화 이유 가 전혀 없습니다 .
Doc Brown

1
내 요점은 무엇 sortArray(numberArray)을하고 있는지 완전히 명확하지 않다는 것 입니다. 그것이 받아들이는 것과 같은 타입을 반환 하지 않으면 분명 할 수 있습니다 . 그러나 반환 유형을 보지 않거나 반환 유형이 입력 유형과 일치하면 정의를 보지 않고 명확하지 않습니다.
8bittree

1
@ 8bittree : 좋아, 당신은 저를 얻었습니다. 내 대답에서 스테이크의 진술을 제거했습니다. 그러나 멤버 함수를 사용하여 설명하는 문제가 사라지지 않습니다. "정렬"멤버 함수조차도 그렇게 작동 할 수 있습니다.
Doc Brown

11

함수에서 값을 반환하기 위해 예기치 않은 메커니즘을 사용하는 것이 문제입니다. 이는 일반적으로 함수에서 너무 많은 작업을 수행하거나 책임이 잘못 정렬 된 결과입니다. 지금까지 함수 결과를 전달하는 가장 좋은 방법은 반환 값을 사용하는 것입니다. 나는 그것이 자명하기를 바랍니다. 객체 지향 언어에서 두 번째로 좋은 방법은 객체를 변경하는 것입니다.

이 두 옵션 사이에 함수의 결과를 전달할 수있는 깨끗하고 명백한 방법이 너무 많습니다. 인수를 유일한 수단으로 변경하려는 경우 아키텍처에서 무언가 잘못되었습니다. 변경 작업을 수행하는 사람이 먼저 데이터를 소유하도록 수업 책임을 다시 정렬해야합니다.

한 가지 예외는 매우 일반적인 알고리즘입니다. 예를 들어, 정렬 인터페이스가 공용 인터페이스를 사용하여 모든 유형의 컨테이너에 일반적으로 적용될 수 있다면 정렬 알고리즘은 정렬하는 컨테이너와 정당하게 분리 될 수 있습니다. 원샷 appendFooter기능에는 그러한 변명이 없습니다.

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