함수 매개 변수 이름 앞에 p *를 붙일 때의 이점은 무엇입니까?


22

함수 매개 변수 앞에 접두사를 사용하는 프로젝트 (Eclipse를 사용하는 Java 프로젝트 및 팀)가 자주 표시됩니다 p.

예를 들어

public void filter (Result pResult) ...

나는 개인적으로 이것에 어떤 이점도 보지 못하지만 추론이 무엇인지 알고 싶습니다. 내가 들었던 가장 좋은 설명은 동일한 이름을 가진 필드의 이름을 구별하는 것입니다. 나는 그 설명에 문제가 있지만 요점을 이해할 수 있습니다.

답변:


34

잘 알려진 헝가리 표기법 과 같이 기호에 의미있는 접두사를 추가하는 관행은 IDE가 존재하지 않거나 너무 원시적 인 시대로 거슬러 올라갑니다. 오늘날 마우스 클릭만으로 선언 지점을 찾을 때 공통 접두어를 지정하여 이름의 가장 소중한 부분 인 처음 몇 글자를 망칠 수는 없습니다.


10
시스템 헝가리어 표기법은 피해야 할 끔찍한 관행입니다. 반면, 일부 Apps Hungarian Notation 이 유용 할 수 있습니다 (예 : 안전하지 않은 사용자 입력의 오용 방지).
Casey Kuball

7
@Darthfett : 이런 종류의 헝가리 표기법조차도 변수 이름으로 직접 임시 수동 유형 시스템을 구현하려고 시도하는 것 같습니다. 정적으로 유형이 좋은 언어를 사용하고 실제 유형 시스템이 자동으로 그러한 것을 추적하도록하십시오!
Tikhon Jelvis

1
@WyattBarnett Systems 헝가리어는 프로그래머에게 최신 IDE에 대한 유용한 정보를 제공하지 않습니다. Apps Hungarian은 올바르게 시행 될 때 코드 검토에서 두통을 줄일 수 있습니다.
Casey Kuball

2
@TikhonJelvis 모든 언어가 강력하게 적용되는 typedef를 지원하지는 않습니다 (예 : C ++ typdefs ). 그것을 지원하는 언어의 경우, 당신이 옳습니다.
Casey Kuball

4
@ Darthfett : C / C ++에서는 하나의 요소 로 struct/ 래핑 할 수 있습니다 union.
Maciej Piechotka

9

의심되는 것처럼 매개 변수 이름과 멤버 또는 로컬 변수 이름 사이의 이름 충돌을 피하는 것입니다. 같은 이유로 멤버 변수에 접두사가 부여되는 경우가 있습니다 (예 :) m_result. 개인적으로, this이름 충돌이있는 경우 멤버 변수에 접두사를 사용하는 것을 선호합니다 . 그것은 언어에 내장되어 있으며 모든 사람들은 이미 그 의미를 알고 있습니다.


그게 내가하는 일입니다. 접두사를 사용하지 않으면 메소드를 호출 할 때 Eclipse에서도 도움이됩니다. 객체 트리를 빌드하고 호출하려는 메소드의 매개 변수 이름과 같은 변수 이름을 지정하면 참처럼 작동하지만 매개 변수 이름 앞에 접두사가 있으면 작동하지 않습니다.
oschrenk

5

매개 변수를 생성자 또는 setter와 같은 멤버 변수에 할당하려는 경우에만 매개 변수 접두사를 사용합니다.

Paint (newColor) {
  color = newColor;
}

저에게는 "this"접두사를 사용하는 것보다 다른 변수 이름을 사용하는 것이 더 맹목적으로 보입니다.

다른 상황에서는 멤버 변수와 쉽게 혼동 될 수있는 매개 변수를 사용하지 않습니다.

메소드 또는 클래스가 너무 커서 변수의 의미를 말하기가 어려운 경우 실제 솔루션은 더 작은 메소드 / 클래스로 나누는 것입니다. 접두사를 사용하면 근본적인 문제를 해결하는 반창고 솔루션입니다.


개인적으로, 나는 (예를 들어,이 경우 매개 변수 이름을 생략하는 것을 선호합니다 Paint (clr) { color = clr; }). ...이 일반적으로 하지만, 많은 모호함없는 color -> clr예외가 될 수있다, 특히있다.
저스틴 타임 2 복원 모니카

1

각 분석법 파라미터 이름과 함께 접두사로 'p'를 사용하도록 표준을 설정하면 나머지 분석법 본문에서 분석법 파라미터를 쉽게 인식 할 수 있습니다.

분석법 파라미터를 찾는 시간이 절약됩니다. 코드를 쉽게 디버깅 할 수 있습니다.


1
매개 변수가 무엇인지 아닌지 알 수없는 경우 방법이 잘못 작성되었을 수 있습니다. 어쩌면 너무 길거나 구조화되지 않은 변수를 너무 많이 사용합니까? 어느 쪽이든 불필요한 접두사를 추가하여 해결되는 다른 문제처럼 보입니다.
jakubiszon

1

짧게-이 연습은 코드를 읽기 어렵게 만듭니다.

긴-다른 악의적 인 관행을 지원하는 데에만 사용되는 악의적 인 관행이라고 주장합니다. 그러한 접두사를 사용하는 것이 도움이 될 수있는 몇 가지 이유를 살펴 보겠습니다.

  • 변수 이름의 충돌 방지

    • 매개 변수 이름이 매개 변수가 무엇인지 정확하게 표현합니까? "정확히 동일한"매개 변수 및 클래스 필드가있는 경우 매개 변수가 필요하지 않습니다.
    • 이 경우 Aaron의 답변에 설명 된 new * 접두사와 같은 클래스 생성자에 접두사를 사용하는 것이 좋습니다. 세터 메소드에도 유용 할 수 있습니다. 예 :

    public void setHeight(int newHeight) { this.height = newHeight; }

  • 메소드는 많은 매개 변수를 취하고 많은 변수를 선언하며 매개 변수가 무엇인지 쉽게 잊을 수 있습니다.

    • 위에서 설명한 것처럼 문제는 변수의 수에 있습니다.
    • 프로그램이 제대로 구성되지 않았을 수 있습니다. 모든 변수가 "독립적"인지 확인하십시오. 아마도 구조 나 클래스로 구성되어야합니다. 어쩌면 전체 계산이나 프로세스는 그러한 변수 수만큼 작동하기 위해 별도의 클래스로 래핑되어야합니다.
    • 그런 수의 변수가 필요하더라도 의미있는 이름을 사용해야하며 접두사는 당신과 의미있는 부분 사이에 있습니다.
  • 메서드는 매우 길며 매개 변수가 무엇인지 추적하려면 접두사를 사용해야합니다.
    • 문제는 메소드의 길이에 있습니다. 프로그램이 제대로 작성되면 항상 메소드 헤더와 본문 전체가 단일 화면에 표시되어야합니다.
    • 방법을 더 작은 블록으로 나누십시오.

특정 접두사를 추가하는 경우를 제외하고는 증상에 도움이 될뿐 실제 문제는 해결되지 않습니다.


0

나는 iParam의 팬이며, oParam은 매개 변수입니다. 나는 cParam에게 변화를 말하고 싶지만 받아 들일 수는 없다


2
이 접두사를 좋아하는 이유를 설명해 주시겠습니까?
피터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.