너무 많은 매개 변수가 있습니까? [닫은]


228

루틴은 매개 변수를 가질 수 있습니다. 그것은 뉴스가 아닙니다. 필요한만큼 많은 매개 변수를 정의 할 수 있지만 너무 많은 매개 변수는 일상의 이해 및 유지 보수를 어렵게합니다.

물론 구조화 된 변수를 해결 방법으로 사용할 수 있습니다. 모든 변수를 단일 구조체에 넣고 루틴에 전달하십시오. 실제로 매개 변수 목록을 단순화하기 위해 구조를 사용하는 것은 Steve Complete 에서 Code Complete 에 설명 된 기술 중 하나입니다 . 그러나 그가 말한대로 :

주의 깊은 프로그래머는 논리적으로 필요한 것 이상으로 데이터를 번들링하지 않습니다.

따라서 루틴에 매개 변수가 너무 많거나 큰 매개 변수 목록을 가장하기 위해 구조체를 사용하는 경우 뭔가 잘못되었을 수 있습니다. 즉, 커플 링을 느슨하게 유지하지 않습니다.

내 질문은 언제 매개 변수 목록을 너무 크게 고려할 수 있습니까? 나는 5 개 이상의 매개 변수가 너무 많다고 생각합니다. 어떻게 생각해?


1
매개 변수가 너무 많은 매개 변수 의 실제 예인이 질문을 참조하십시오 .
Gideon

5
JavaScript에서 65537 매개 변수가 너무 많습니다. jsfiddle.net/vhmgLkdm
Aadit M Shah

apache http 구성 요소 만 살펴보면 역동적 인 무언가를 만드는 것이 거의 불가능합니다.
Andrew Scott Evans

답변:


162

언론의 자유를 보장하기 위해 제 1 차 개정안에도 불구하고 규제 할 수있는 것이 외설적 인 것으로 간주되는 것은 언제입니까? 포터 스튜어트 법무 장관에 따르면 "보자 마자 알아요." 여기에서도 마찬가지입니다.

대답은 프로젝트의 크기와 범위에 따라 변경 될뿐만 아니라 모듈 수준까지도 변경된다고 생각하기 때문에 강력하고 빠른 규칙을 만드는 것을 싫어합니다. 메소드가 수행하는 작업 또는 클래스가 나타내는 것으로 가정하면 2 개의 인수가 너무 많고 너무 많은 커플 링의 증상 일 수 있습니다.

나는 처음에 질문을하고, 당신이했던 것처럼 당신의 질문을 한정함으로써, 당신이 정말로이 모든 것을 알고 있다고 제안합니다. 여기서 가장 좋은 솔루션은 단단하고 빠른 숫자에 의존하는 것이 아니라, 동료들 사이에서 설계 검토 및 코드 검토를 통해 응집력이 낮고 결합력이 낮은 영역을 식별하는 것입니다.

동료에게 자신의 작업을 보여줄 것을 두려워하지 마십시오. 두려워하는 경우 아마도 코드에 문제가 있고 이미 알고 있다는 더 큰 신호 일 것입니다 .


좋은 규칙 은 더 이상 CPU 레지스터의 수입니다. 더 이상 컴파일러는이를 스택에 할당해야하기 때문입니다.
Michaelangel007

1
@ Michaelangel007 당신이 언급하는 대답에 관해서는 규칙이 없다는 것을 나타 내기 때문에 그렇게 말해서는 안됩니다. 또한 매개 변수의 수는 성능이 아니라 가독성의 문제입니다.
clemp6r

1
@ clemp6r 잘못되었습니다 . 둘 다 입니다. 컴파일러들은 항상 "등록 유출"을 처리해야합니다. 유일한 권위있는 대답은 컴파일러가 생성하는 어떤 어셈블리를 검사하는 것입니다. 레지스터 수는 동일한 플랫폼 에서 마술처럼 바뀌지 않습니다 . en.wikipedia.org/wiki/Register_allocation
Michaelangel007

124

일부 매개 변수가 중복되는 경우 함수는 너무 많은 매개 변수를 가질 수 있습니다. 모든 매개 변수가 사용되는 경우 함수에는 올바른 수의 매개 변수가 있어야합니다. 이 자주 사용되는 기능을 수행하십시오.

HWND CreateWindowEx
(
  DWORD dwExStyle,
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName,
  DWORD dwStyle,
  int x,
  int y,
  int nWidth,
  int nHeight,
  HWND hWndParent,
  HMENU hMenu,
  HINSTANCE hInstance,
  LPVOID lpParam
);

그것은 12 개의 매개 변수 (x, y, w 및 h를 사각형으로 묶을 경우 9)이며 클래스 이름에서 파생 된 매개 변수도 있습니다. 이것을 어떻게 줄이겠습니까? 숫자를 더 줄이려고 하시겠습니까?

매개 변수의 수는 당신을 귀찮게하지 말고, 그냥 논리적이고 잘 문서화 확실하고 인텔리 수 있도록 * 당신을 도울.

* 다른 코딩 어시스턴트도 이용 가능합니다!


37
나는 이것을 투표하고있다. "3"과 "4"라는 다른 모든 대답에 놀랐습니다! 정답은 다음과 같습니다. 필요한 최소값이며 때로는 상당히 적을 수도 있습니다.
Tony Andrews

16
그 기능이 오늘날 설계 되었다면 약간 다르게 보일 것입니다. x, y, nWidth 및 nHeight는 Rectangle 객체에 묶을 수 있습니다. style 및 xStyle을 일련의 열거 형 또는 문자열로 결합 할 수 있습니다. 이제 8 개의 매개 변수 만 있습니다.
finnw

16
@finnw 그 기능이 오늘 설계된 경우? 이미 재 설계되었습니다. 양식 f = 새 양식 (); 매개 변수가 0입니다.
Nick

36
이것은 C winapi입니다. 나는 더 나쁜 예를 생각할 수 없다.
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

17
아니 아니. 이것은 절차 적 스타일입니다. Windows는 객체이므로 이제는 더 이상 사용되지 않습니다. 오늘날 이것은 많은 매개 변수가 아닌 집계 된 클래스로 해결됩니다. 좋은 디자인의 직관적 인 규칙은 간단한 문장으로 함수 (매개 변수 포함)를 설명 할 수 없다면 제대로 설계되지 않은 것입니다 . 나는 이것이 사실이라고 믿는다.
Jan Turoň 2016 년

106

에서 클린 코드 로버트 C. 마틴은 주제에 네 페이지를 할애. 요점은 다음과 같습니다.

함수에 대한 이상적인 인수 수는 0입니다 (나일론). 다음은 하나 (모나 딕)가오고 그 다음에 두 (다익)이옵니다. 가능한 경우 세 가지 주장 (삼국 법)을 피해야합니다. 3 개 이상 (다중)은 매우 특별한 타당성을 요구하므로 절대로 사용해서는 안됩니다.


2
그것이 "이것"을 포함하고있는 것은 의심의 여지가 있기 때문에 그것이 실행의 맥락이기 때문입니다. 함수형 프로그래밍에서 컨텍스트는 전역 적이며 죄송합니다. 컨텍스트는 메소드를 적용 할 오브젝트입니다. 또한 매개 변수 목록에 "this"를 포함하면 0 개의 매개 변수를 사용할 수 없습니다 (이상적).
Tom

1
아니요, "this"는 포함되어 있지 않습니다.
Patrick McElhaney

20
또한 Martin은 C ++ 표준위원회와 함께 한마디해야합니다. <알고리즘>의 절반은 하나의 반복자 범위 만 2이므로 이미 3 개 이상의 매개 변수를 사용합니다. 이터레이터를 사용한 프로그래밍 (STL 컬렉션을 사용한 일반 프로그래밍)의 특성 일뿐입니다.
Steve Jessop

3
@SteveJessop : <algorithm>의 결함은 항상 슬라이스에서 작동한다는 것입니다. 알고리즘과 컬렉션을 다시 디자인해야한다면 알고리즘이 항상 전체 컬렉션을 사용하게되므로 알고리즘이 부분에서 작동 할 수 있도록 컬렉션보기를 슬라이스 할 수 있습니다. 또는 일반적인 경우에 쉽게 작업 할 수 있도록 속기 재정의를 정의합니다.
Lie Ryan

3
@LieRyan : 다시 디자인 <algorithm>하고 있다면 범위 객체에 작용하게됩니다. 컬렉션은 범위가되지만 모든 범위가 컬렉션이되는 것은 아닙니다. 실제로 부스트는 이미 그렇게했습니다. 어쨌든, 나의 점은 대규모 널리 사용되는 라이브러리는이 조언을 무시 사용자들은 최악 있도록한다는 것입니다 보장 당신이 너무 할 경우에 발생하는 ;-) 사용자 인터페이스에 약간의 단순화와 수리를하는 사용자의 사용자의 수백만의 많은입니다
스티브 Jessop

79

과거에 작업 한 일부 코드는 너무 많은 매개 변수를 전달하지 않기 위해 전역 변수를 사용했습니다.

제발 하지마!

(보통.)


내가 사용했던 일부 코드는 같은 것을 달성하기 위해 클래스 멤버를 사용했습니다. 당시 나는 C 프로그래머 였고 왜 전역 변수가 그렇게 많은지, 왜 입력 / 출력이 명시 적으로 매개 변수가 될 수 없는지 물었습니다.
user3528438

38

서명의 매개 변수를 정신적으로 계산하고 호출과 일치시켜야하는 경우 리팩토링해야합니다.


아주 좋은 대답입니다. 매개 변수가 논리적으로 구성되면 (x, y, w, h) 올바른 순서로 모든 매개 변수를 기억하기 쉽습니다. 특히 fprintf가 반대이기 때문에 FILE 포인터를 putc (두 개의 매개 변수 만 있음)에 넣을 위치를 알아 차리기가 어렵습니다.
user877329

가장 좋은 답변입니다. 잘 말했다
Anwar

31

모든 답변에 감사드립니다.

  • 5와 같은 매개 변수가 코드의 완전성에 대한 좋은 제한이라고 생각하는 사람들을 찾는 것은 약간 놀라운 일이었습니다.

  • 일반적으로 사람들은 3에서 4 사이의 제한이 좋은 경험이라는 데 동의하는 경향이 있습니다. 사람들이 보통 4 가지 이상의 것을 세는 데 나쁜 시간을 보내기 때문에 이것은 합리적입니다.

  • 밀라노가 지적한 것처럼 , 평균적으로 사람들은 한 번에 7 개 정도의 머리를 유지할 수 있습니다. 그러나 루틴을 디자인 / 유지 관리 / 연구 할 때 매개 변수보다 더 많은 것을 명심해야한다는 것을 잊을 수 없다고 생각합니다.

  • 어떤 사람들은 루틴이 필요한만큼 많은 주장을 가져야한다고 생각합니다. 동의하지만, 몇 가지 특별한 경우 (OS API 호출, 최적화가 중요한 루틴 등)에 동의합니다. 가능할 때마다 이러한 호출 바로 위에 추상화 계층을 추가하여 이러한 루틴의 복잡성을 숨길 것을 제안합니다.

  • Nick 은 이것에 대해 몇 가지 흥미로운 생각 을 가지고 있습니다 . 당신이 자신의 의견을 읽고 싶지 않은 경우에, 나는 당신을 위해 요약 : 간단히 말해서, 그것은 의존한다 :

    대답은 프로젝트의 크기와 범위에 따라 변경 될뿐만 아니라 모듈 수준까지도 변경된다고 생각하기 때문에 강력하고 빠른 규칙을 만드는 것을 싫어합니다. 메소드가 수행하는 작업 또는 클래스가 나타내는 것으로 가정하면 2 개의 인수가 너무 많고 너무 많은 커플 링의 증상 일 수 있습니다.

    여기의 도덕은 동료들에게 코드를 보여주는 것을 두려워하지 말고, 그들과 토론하고, "응집력이 낮고 결합력이 낮은 영역을 식별하십시오" .

  • 마지막으로, 나는 wnoise 가 Nick과 동의하고 프로그래밍 기술에 대한 이 시적 비전 (아래 주석 참조)에 대한 풍자적 기여를 마무리 짓는다 .

    프로그래밍은 엔지니어링이 아닙니다. 코드의 구성은 인간의 요소에 의존하기 때문에 예술이며, 이는 어려운 규칙의 맥락에 너무 의존합니다.


16

이 답변은 OO 언어를 가정합니다. 당신이 하나를 사용하지 않는다면-이 대답을 건너 뛰십시오 (즉, 이것은 언어에 독립적 인 대답이 아닙니다.

3 개 이상의 매개 변수 (특히 내장 형식 / 개체)를 전달하는 경우 "너무 많은"것이 아니라 새 개체를 만들 가능성이없는 것일 수 있습니다.

둘 이상의 메소드에 전달되는 매개 변수 그룹을 찾으십시오. 심지어 두 개의 메소드에 전달 된 그룹도 새 오브젝트가 있어야합니다.

그런 다음 기능을 새로운 객체로 리팩터링하면 코드와 OO 프로그래밍에 대한 이해에 얼마나 도움이 될지 믿지 않을 것입니다.


루틴이나 매개 변수를 사용하지 않는 언어의 이름을 지정하십시오. 나는 생각조차 할 수 없으며 심지어 어셈블리조차도 루틴 (라벨)을 갖는 것으로 간주 될 수 있습니다.
Auron

x86 어셈블리에는 분명히 루틴이 있습니다 (호출 / 반환). 다른 것들은 cmp / jmp 콤보를 요구할 수 있습니다.
Brian Knoblauch

죄송합니다. "ret", "return"이 아닙니다. 한숨. 벌써 긴 하루였습니다.
Brian Knoblauch

애매한 문구 Auron에 대해 유감스럽게 생각합니다. 질문에 대한 대답이 아니라 언어에 따른 답변이었습니다.
Bill K

1
모든 언어가 통과 구조를 허용하지는 않습니다. 또한 구조를 전달한다는 것은 수신 방법이 구조를 처리하기위한 코드를 가져야하므로 더 많은 매개 변수가 필요할 수 있음을 의미합니다. 또한 비 oo 언어에서는 일반적으로 추가 매개 변수가 필요합니다. 모든 OO 언어에는 "this"라는 "숨겨진"매개 변수가 있습니다. 그렇지 않으면 전달해야합니다 (또는 더 끔찍한 언어 / 디자인에서는 전 세계에있을 수 있음). 액세스 가능)
Bill K

13

단순한 숫자가 아닌 다른 고려 사항이있는 것 같습니다.

  1. 기능의 주요 목적과 일회성 설정에 대한 논리적 관계

  2. 환경 플래그 일 경우 번들링이 매우 편리합니다.


12

Alan Perlis의 잘 알려진 프로그래밍 에피 그램 중 하나 (1982 년 9 월 ACM SIGPLAN Notices 17 (9)에 언급)는 "매개 변수가 10 개인 프로 시저가 있다면 아마도 일부를 놓쳤을 것"이라고 말합니다.



9

나에게있어서, 목록이 내 IDE에서 한 줄을 넘으면 너무 많은 매개 변수입니다. 눈을 마주 치지 않고 모든 매개 변수를 한 줄로보고 싶습니다. 그러나 그것은 나의 개인적인 취향 일뿐입니다.


이것은 일부 개발자와 함께 foo (int a, float b, string c, double d)를 시도 할 때까지 좋습니다. 그들과 함께 일하지 않는 것이 가장 좋습니다. : D
Rontologist

4
다른 누군가가 엄청나게 긴 이름을 수업에 주었을 때 나는 그것이 내 일상을 정의하거나 부르는 방법에 영향을 미치지 않을 것입니다.
finnw

9
"캐리지 리턴"에 대해 소개하겠습니다.

3
목록이 IDE에서 한 줄을 넘어 서면 모니터가 너무 작아 해당 코드와 함께 사용할 수 없으므로 더 높은 수평 해상도의 모니터를 명확하게 구입해야합니다. 줄 바꿈 또는 매개 변수 양 축소는 근본 문제를 해결하지 못하는 해결 방법 일뿐입니다. 즉 모니터가 해당 코드베이스에 비해 너무 작습니다.
Kaiserludi

9

나는 일반적으로 5에 동의하지만 더 필요한 상황이 있고 문제를 해결하는 가장 명확한 방법이라면 더 많이 사용합니다.


8

단기 기억의 7 가지?

  1. 기능의 이름
  2. 함수의 반환 값
  3. 기능의 목적
  4. 파라미터 1
  5. 매개 변수 2
  6. 파라미터 3
  7. 파라미터 4

잘. 경험상 규칙입니다. 함수 본문을 코딩 할 때는 함수 이름을 신경 쓰지 않으며 반환 값과 해당 purporse는 밀접한 관련이 있습니다.
Auron

7
8. 매개 변수 순서
Eva

7

에서 최악의 5 코드 조각 "이 생성자인가", 두 번째를 확인합니다. 37 개 이상의 ⋅ 4 ≈ 150 개 이상의 매개 변수가 있습니다.

여기 프로그래머가이 생성자를 썼습니다. [...] 당신 중 일부는 큰 생성자라고 생각할 수도 있지만 이클립스 자동 코드 생성 도구 [.] NOO를 사용했습니다. 이 생성자가 직접 작성되었다고 결론 내립니다. (이것은 생성자의 상단 부분에 불과하며 완성되지는 않았습니다).

150 개가 넘는 매개 변수가있는 생성자


이것은 너무 슬프다 ... "레코드"나 "구조체"또는 "값 객체"에 대해 알지 못한다. 여러 개의 값을 하나로 묶어 공통 이름을 부여하여 읽을 수있는 방식으로 많은 값을 계층 적으로 표현할 수있다. 적 말한 적이 누구도 당신도 그 🙈 할 수 있기 때문 년 unlaced 신발
유사시

6

하나 이상 필요합니다. 나는 glib을 의미하지는 않지만 반드시 몇 가지 옵션이 필요한 기능이 있습니다. 예를 들면 다음과 같습니다.

void *
mmap(void *addr, size_t len, int prot, int flags, int fildes, off_t offset);

6 개의 논증이 있으며, 각각의 주장은 필수적입니다. 또한 번들링을 정당화하기위한 공통적 인 연결 고리가 없습니다. 어쩌면 "struct mmapargs"를 정의 할 수도 있지만, 더 나쁠 것입니다.


음, prot그리고 flags그것은 5는 길처럼 비트 (6)보다 훨씬 더 나은 마법의 번호가 어떻게 든 것을 디자이너가 느끼는 경우 함께 출시 된 수있는 open콤바인 다른 모든 기타 플래그로 읽기 / 쓰기 모드. 그리고 매핑 된 섹션이의 현재 탐색 위치에서 시작하도록 지정하여 제거 할 있습니다. 나는 당신이 할 수 없는 지역이 있을 수있는 상황이 있는지 모르겠지만 그렇지 않은 경우 엄격하게 필요하지는 않습니다. offsetfiledesmmaplseek
Steve Jessop

... 그래서 mmap일부 디자이너와 사용자는 긴 매개 변수 목록을 선호하는 반면 다른 일부는 호출하기 전에 더 적은 수의 매개 변수를 준비하는 것을 선호합니다.
Steve Jessop

1
@Steve : 사전에 별도의 호출로 탐색 위치를 설정하면 무례한 경쟁 조건이 발생했을 것입니다. 일부 API (OpenGL)의 경우 호출에 영향을주는 매개 변수가 너무 많아서 실제로 상태를 사용해야하지만 일반적으로 모든 호출은 가능한 한 많이 독립되어야합니다. 멀리서 행동하는 것은 어두운면으로가는 길입니다.
Ben Voigt

5

Perl Best Practices 에 따르면 3은 괜찮고 4는 너무 많습니다. 그것은 단지 지침 일 뿐이지 만, 우리 가게에서는 우리가 고수하려고 노력합니다.


5

5 개의 매개 변수에서 공용 함수에 대한 제한을 그립니다.

IMHO, 긴 매개 변수 목록은 코드의 몇 가지 특정 위치에서만 호출되는 개인 / 로컬 도우미 기능에서만 사용할 수 있습니다. 이 경우 많은 상태 정보를 전달해야 할 수도 있지만 가독성은 그다지 중요하지 않습니다 (또는 코드를 유지하고 모듈의 기본 사항을 이해해야하는 사람)만이 관심을 가져야하기 때문입니다 그 함수를 호출합니다.


정확히이 시점에서 많은 사람들이 실제 논쟁이 아닌 모든 것을 실제 논거가 아닌 필드의 형태 (멤버 변수)로 객체의 상태로만 옮기는 이유는 무엇입니까? 그 객체는 클래스로 표현 될 것입니다. 한 번 또는 모든 용도로 인스턴스화됩니다. 때때로 그러한 객체는 하나의 패키지 private 또는 public 메소드를 가지는데, 각각의 인수가 거의없는 개인 메소드에 작업을 위임합니다. 이제 구성과 상태가 적절한 위치에 있기 때문에 몇 가지 인수가 가능합니다. :)
yeoman

5

고려해야 할 관련 질문 은 루틴이 얼마나 응집력 이 있는지 입니다. 많은 수의 매개 변수가 루틴 자체가 너무 많은 일을하려고하므로 응집력이 의심됨을 나타내는 냄새 일 수 있습니다. 나는 단단하고 빠른 수의 매개 변수가 불가능하다는 데 동의하지만 응집력이 높은 루틴은 적은 수의 매개 변수를 의미한다고 생각합니다.



4

나는 일반적으로 세 가지 매개 변수에서 멈 춥니 다. 이제 더 이상 매개 변수 배열 또는 구성 개체를 전달해야하므로 API를 변경하지 않고도 향후 매개 변수를 추가 할 수 있습니다.


API가 변경되면 비 호환성이 여전히 발생할 수있는 스텔스 변경뿐만 아니라 덜 분명한 API도 실제로 변경해야합니다.
wnoise

그러나 에지 케이스를 구성하기 위해 하나 이상의 매개 변수가 필요한 경우 API를 사용하여 관련이없는 구성 요소로 전파해서는 안됩니다.
Eran Galperin

4

매개 변수 목록의 길이 제한은 하나 이상의 제한입니다. 그리고 제한은 적용된 폭력을 의미합니다. 우스운 것처럼 들리지만 프로그래밍 할 때도 비폭력적일 수 있습니다. 코드가 규칙을 지시하도록하십시오. 매개 변수가 많은 경우 함수 / 클래스 메서드의 본문이이를 사용할 수있을만큼 커질 것입니다. 또한 큰 코드 스 니펫은 일반적으로 리팩터링하여 더 작은 청크로 나눌 수 있습니다. 따라서 리팩터링 된 작은 코드 조각으로 나뉘어져 있기 때문에 많은 매개 변수를 무료 보너스로 사용할 수 없습니다.


4

성능 관점에서 지적해야 할 한 가지는 매개 변수를 메서드에 전달하는 방법에 따라 많은 매개 변수를 값으로 전달하면 각 매개 변수를 복사 한 다음 스택에 배치해야하기 때문에 프로그램 속도가 느려진다는 것입니다.

단일 클래스를 사용하여 모든 매개 변수를 포함하면 참조로 전달되는 단일 매개 변수가 우아하고 깨끗하며 빠르기 때문에 더 효과적입니다!


나는이 답변에 +1을주었습니다. 코드 청결 또는 임의의 한계 이외의 것을 논의하는 유일한 것이기 때문에 주관적입니다. 어떤 사람들은 당신이 루프에 있고 스택에서 수십 개의 인수를 밀 때 스택에서하고있는 일에 대해 생각하지 않을 수도 있습니다. 반복되는 경우 컴파일하는 ABI의 REGISTERS가 전달한 인수 수를 고려해야합니다. 예를 들어, MS 64 ABI에서 최대 인수 레지스터를 통해 전달 그래서 4 개 인수를 사용하여 꽤 휴대용 4. "시스템 V"(비 Windows OS에 의해 사용되는) ABI 이상의 레지스터를 사용하여 인
Lakey

3

나에 따르면 당신이 4 또는 고정 번호를 초과하는 경우가있을 수 있습니다. 조심해야 할 것들

  1. 분석법이 너무 많이 수행되므로 리팩터링해야합니다.
  2. 컬렉션 또는 일부 데이터 구조 사용을 고려할 수 있습니다.
  3. 수업 디자인을 다시 생각해보십시오. 일부 물건을 전달할 필요는 없습니다.

사용 편의성 또는 코드 판독 용이성에서 메소드 서명을 "워드 랩 (word wrap)"해야 할 때, 생각을 멈추고 생각해야한다고 생각합니다. 결과가 없다. 과거와 현재의 아주 훌륭한 도서관은 4-5 개 이상의 유모차를 사용합니다.


3

경험상, 전화를보고 그것이 무엇을하는지 알 수있을만큼 오랫동안 매개 변수를 기억할 수 있어야합니다. 따라서 메서드를 볼 수 없으면 메서드 호출로 넘어 가서 너무 많은 매개 변수를 수행하는 매개 변수를 기억하십시오.

저에게는 약 5에 해당하지만 밝지는 않습니다. 귀하의 마일리지가 다를 수 있습니다.

매개 변수를 보유하고 설정 한 한계를 초과하는 경우 전달할 특성이있는 오브젝트를 작성할 수 있습니다. Martin Fowler의 리팩토링 책과 메소드 호출을보다 간단하게하는 장을 참조하십시오 .


1

작업중인 환경에 따라 크게 달라집니다. 예를 들어 javascript를 예로 들어 보겠습니다. 자바 스크립트에서 매개 변수를 전달하는 가장 좋은 방법은 키 / 값 쌍이있는 객체를 사용하는 것입니다. 실제로는 하나의 매개 변수 만 있습니다. 다른 시스템에서는 스위트 스폿이 3-4 개가됩니다.

결국, 그것은 모두 개인적인 취향으로 귀결됩니다.


1

3은 괜찮습니다. 4는 지침으로 너무 많습니다. 3 개 이상의 매개 변수를 사용하면 필연적으로 하나 이상의 작업을 수행하게됩니다. 하나 이상의 작업을 별도의 방법으로 분할해야합니다.

그러나 내가 작업 한 최신 프로젝트를 살펴보면 예외가 많으며 대부분의 경우 3 개의 매개 변수로 내려 가기가 어렵습니다.


1

하나의 루틴에 7-10 개의 매개 변수가있는 경우 새 클래스로 묶는 것을 보지만 해당 클래스가 getter 및 setter가있는 필드 일뿐이 아니라면 새 클래스는 값을 섞는 것 이외의 다른 작업수행해야 합니다. 밖. 그렇지 않으면 오히려 긴 매개 변수 목록을 사용하고 싶습니다.


1
두 곳 이상에서 사용되는 경우 데이터 전용 클래스와 함께 번들로 묶을 것입니다. 그러나 보통 두 생성자를 모두 만듭니다.
Leahn Novash

1

사람들은 평균적으로 한 번에 7 +/- 2 개의 물건을 머리에 담을 수 있다는 것은 알려진 사실입니다. 나는 그 원칙을 매개 변수와 함께 사용하고 싶습니다. 프로그래머가 모두 평균 이상의 지능적인 사람들이라고 가정하면, 10 세 이상의 모든 것이 너무 많다고 말할 수 있습니다.

BTW, 매개 변수가 어떤 식 으로든 비슷한 경우 구조체 또는 클래스가 아닌 벡터 또는 목록에 추가합니다.


1

함수가 얼마나 자주 호출되는지에 대한 대답을 기반으로합니다.

한 번만 호출 된 init 함수 인 경우 관심있는 10 개 이상의 매개 변수가 필요합니다.

프레임 당 여러 번 호출되면 구조를 만들고 포인터를 전달하는 것이 더 빠르기 때문에 포인터를 전달하는 경향이 있습니다 (매번 구조체를 다시 작성하지 않는다고 가정).


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