가독성 보조 도구로 명명 된 인수 (매개 변수)


11

오래 전에 ADA에서 많은 프로그램을 작성했으며 함수를 호출 할 때 인수 이름을 지정하는 것이 일반적이었습니다.-SomeObject.DoSomething (SomeParameterName => someValue);

C #에서 명명 된 인수를 지원하므로 인수의 의미가 명확하지 않은 상황에서이 습관으로 되돌릴 생각입니다.

인수가 의미하는 바가 항상 명백해야한다고 주장 할 수도 있지만 부울 인수가 있고 호출자가 "true"또는 "false"를 전달하는 경우 이름으로 값을 한정하면 호출 사이트를 더 읽기 쉽게 만듭니다.

contentFetcher.DownloadNote (note, manual : true);

true 또는 false (이 경우 수동, 자동)를 사용하는 대신 Enum을 만들 수 있다고 생각합니다.

코드를 쉽게 읽을 수 있도록 때때로 명명 된 인수를 사용하는 것에 대해 어떻게 생각하십니까?


메소드 상단의 매개 변수 주석도 도움이됩니다.
Amir Rezaei

1
@ amir-rezaei : 메소드 위에 매개 변수 주석은 주석을 신뢰할 수있는 경우에만 도움이됩니다. 좋은 개발자 코드 검토 프로세스가 없으면 주석을 신뢰하지 않습니다.
btilly

일회성 Ada 사용자 로서, 귀하가 설명하는대로 가끔 사용하고 있습니다. 이것이 내가 Ada, BTW에서 사용되는 것을 기억하는 방법입니다. "비정상"이라고 부르지는 않지만 "정상"이라는 단어는 대부분의 호출이 매개 변수 이름을 지정한다는 것을 암시하는 것 같습니다. 물론 관습은 다양하지만 불필요한 혼란은 모든 언어 IMO에서 나쁜 관례입니다.
Steve314

나는 Ada에서의 당신의 사용에 다시 동의합니다-그것은 우리가 항상 한 것이 아니라 그것이 도움이되는 곳이었습니다.
데미안

답변:


7

이것은 C ++의 개발에서 제안되었으며 Stroustrup은 "C ++의 디자인과 진화", 153 페이지 및 다음 페이지에서 이에 대해 설명합니다. 제안은 잘 정립되었으며 Ada와의 사전 경험을 바탕으로 작성되었습니다. 채택되지 않았습니다.

가장 큰 이유는 아무도 매개 변수가 많은 기능을 장려하기를 원하지 않았기 때문입니다. 언어의 각 추가 기능에는 비용이 들며, 나쁜 프로그램을보다 쉽게 ​​작성할 수 있도록 기능을 추가 할 필요가 없었습니다.

또한 표준 헤더 이름, 특히 일반적인 헤더 및 코드 파일 규칙에 대한 질문도 제기되었습니다. 일부 조직은 .h 파일에 더 길고 더 설명적인 매개 변수 이름을 가지고 있으며 .cpp 파일에 이름을 더 짧고 쉽게 입력 할 수 있습니다 (원하는대로 파일 접미사 대체). 이것들을 동일하게 요구하면 컴파일에 추가 비용이 들게되며 소스 파일 사이에 이름을 섞으면 미묘한 버그가 발생할 수 있습니다.

함수 호출이 아닌 객체를 사용하여 처리 할 수도 있습니다. 12 개의 매개 변수를 사용하는 GetWindow 호출 대신 12 개의 개인 변수를 사용하여 Window 클래스를 만들고 필요에 따라 setter를 추가하십시오. setter를 연결하면 다음과 같은 내용을 작성할 수 my_window.SetColor(green).SetBorder(true).SetBorderSize(3);있습니다. 실제로 작업을 수행하는 함수를 호출하는 다른 기본값을 가진 다른 함수를 가질 수도 있습니다.

의 문서 효과에 대해 걱정이되는 경우 contentFetcher.DownloadNote(note, manual : true);언제든지와 같은 내용을 작성할 수 contentFetcher.DownloadNote(note, /* manual */ true);있으므로 문서에서 그다지 도움이되지 않습니다.


내가 Ada에서 C로 옮길 때 재미있게도, 나는 당신이 설명하는 규칙을 사용하기 시작했다. 많은 수의 매개 변수에 사용하지 마십시오.
데미안

7

이것이 "모범 사례"보다는 잘못된 코드를 더 읽기 쉽게 만드는 문제라고 생각합니다.

20 개의 매개 변수를 취하는 방법 (또는 계약자)을 갖는 것은“나쁜 냄새”이며 설계상의 문제로 인한 것일 수 있습니다. 그러나 메소드가 많은 매개 변수를 취할 때 코드 작업을 강요 받으면 명명 된 매개 변수는 코드를 이해하기 어렵게 만듭니다.

메소드에 1 또는 2 개의 매개 변수 만 있고 매개 변수가 무엇인지 메소드 이름에서 분명한 경우 이름 지정된 매개 변수는 아무 것도 추가하지 않습니다. 이것은 이상적인 경우입니다.

당신이 작업하는 모든 코드가“ 깨끗한 코드 ”책으로 작성된다면, 명명 된 매개 변수는 거의 쓸모가 없지만 우리는 현실 세계에 살고 있습니다.


1
두 매개 변수가 동일한 유형이고 어떤 것이 어떤 단서가없는 경우 두 매개 변수가있는 함수는 혼동 될 수 있습니다. 물론 단서를 제공하는 방식으로 함수의 이름을 지정할 수는 있지만, 매개 변수 이름이하는 일을 실제로 수행하는 것입니다. 문맥 상에도 해당 상세 정보 (예 : 매개 변수) 어떤 매개 변수가 어떤 것인지 분명히하십시오.
Steve314

1
@ Steve314 예 :void TrackDataChange(Data oldData, Data newData)
Alexander

3

매개 변수 이름을 추가하면 더 읽기 쉽습니다. 그러나 내가 읽은 대부분의 책은 부울 스위치를 나쁜 습관으로 생각합니다. 나는 때때로 이것을한다 :

public Content DownloadNote(Note note)
{
    return downloadNote(note, manual: false);
}

public Content DownloadNoteManually(Note note)
{
    return downloadNote(note, manual: true);
}

API를 구현할 때 더 많은 유연성을 제공합니다. 또한 여러 부울 스위치가있는 경우를 제어 할 수 있지만 모든 스위치가 동시에 활성화 될 수는 없습니다.


3
x를 선택했다면 2 ^ x 프런트 엔드를 만드시겠습니까?
apoorv020

@ apoorv020-2 ^ x가 중요 해졌다는 메소드 호출에 충분한 매개 변수가있는 경우 매개 변수 값을 보유 할 새 클래스를 만들고 하나의 매개 변수를 전달합니다.
Scott Whitlock

@ scott-whitlock : 옵션 1-객체를 생성하고, x 속성을 설정하고, 객체로 메소드를 한 번 호출하십시오. 옵션 2-x라는 이름의 매개 변수를 가진 메소드를 호출하십시오. 어느 것이 더 좋을지는 당신의 언어에 달려 있습니다. 동적으로 유형이 지정된 언어에서 옵션 1은 게인없이 훨씬 더 많은 보일러 플레이트를 필요로하므로 더 나쁩니다. 정적으로 유형이 지정된 언어에서는 여전히 상용구를 추가하지만 잘못 명명 된 키에 대한 테스트는 런타임이 아닌 컴파일 타임에 수행됩니다. 따라서 옵션 1은 C #에서 더 좋지만 옵션 2는 Python에서 확실한 승리입니다.
btilly

@btilly-Ian이 지적했듯이 Clean Code 는 2 개 또는 3 개 이상의 매개 변수가있는 기능 이 없다는 것을 분명히 알려줍니다 . 공평하게, 그것은 정적으로 유형이 지정된 Java를 다루고있었습니다. 또한 OP는 정적으로 입력 된 C #에 대해 묻습니다. 나는 여전히 긴 매개 변수 목록과는 달리 함수 과부하 및 / 또는 정확하게 다른 이름의 함수 이름을 사용하는 것을 선호합니다.
Scott Whitlock

@ scott-whitlock : 우리는 실제로 동의하지 않습니까? 우리는 C #에서 가장 좋은 것에 동의합니다. 우리는 Clean Code가 말하는 것을 알고 있습니다. 내 요점은 왜 그것이 좋은지 이해하는 것이 중요하므로 조언이 언제 다른 환경에 맞지 않는지 알 수 있다는 것입니다.
btilly

3

유형과 의미가 메소드 이름에서 명확하지 않은 상황에서 명명 된 매개 변수를 크게 믿는 사람입니다. 내 경험은 문서를 읽는 사람은 거의 없다는 것입니다.

즉, 명명 된 매개 변수는 의미있는 인수 목록을 만들고, 도우미 개체를 사용하여 (의미 적으로 관련된 인수를 "연결"), 관련이있는 열거를 사용하는 대안이되어서는 안됩니다.


0

나는 이것이 OO가 아닌 언어에서 더 유용하다고 생각합니다. 여기서 약간 다른 방식으로 무언가를 수행 해야하는 하나의 기능이있을 수 있으며 수행 방법을 결정하는 방법은 매개 변수 값을 기반으로합니다. OOP 세계에서는 함수에 과부하가 걸리지 만, 가능하지 않은 경우 여러 플래그 (또는 여러 값, 전달 여부)가 전달됩니다.

좀 더 읽기 쉽다고 생각합니다. 그러나 다른 사람들이 언급했듯이 많은 매개 변수를 갖는 것은 코드 냄새이므로 C #과 같은 객체 지향 언어에서는 이것을 많이 사용하지 않습니다.

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