부울 메서드 명명 가독성


120

가독성 관점에서 볼 때 부울 메서드에 대해 어떤 메서드 이름을 선호합니까?

public boolean isUserExist(...)

또는:

public boolean doesUserExist(...)

또는:

public boolean userExists(...)

21
첫 번째는 다음과 같이 들립니다isBabbyFormed

언어에 따라 다릅니다. 언어마다 규칙이 다릅니다. Java와 Objective C가 떠 오릅니다. 또한 경계선 주관적입니다.
Jed Smith

주관적-충분히
공정함

2
순전히 주관적입니다. getUserExistence, userIsNotExtinct, userHasExistentialState등 ...
dreamlax

Sartre는 자랑 스러울 것입니다
Cornel Masson

답변:


112
public boolean userExists(...)

내가 선호하는 것입니다. 조건부 검사를 자연 영어와 훨씬 더 비슷하게 만듭니다.

if userExists ...

하지만 딱딱하고 빠른 규칙은 없다고 생각합니다.


3
"당신의 {method call}을 자연 영어와 훨씬 더 비슷하게 만듭니다"는 전반적으로 합리적인 이름 지정을위한 훌륭한 테스트처럼 들립니다. 문제에 대한 내 생각을 명확히했습니다. 감사합니다!
cori

16
다른 한편으로, "if"바로 뒤에 오지 않는 경우, "userExists ()"는 의도 된 질문이 아니라 사실의 진술처럼 들립니다. 간단한 질문에 대한 영어 자연어 단어 순서 규칙을 따르는 "IsUserExisting ()"또는 "DoesUserExist ()"와는 다릅니다.
Oskar Berggren

4
.. 그러나 bool을 반환하는 메서드가 외부에서 사용되는 이유는 if무엇입니까? 부작용이 있다면 그것은 훨씬 더 냄새입니다. if IsUserExisting()그리고 if DoesUserExist()끔찍한 보이는 피해야한다.
RJFalconer

@RJFalconer는 때때로 그 방법의 결과를 여러 곳에서 사용해야 할 수도 있으므로 변수에 할당합니다. 메소드가 호출 userExists되었으므로 선언 할 변수의 이름은 무엇입니까? userExists메소드가 아닌 변수에 좋습니다. @Oskar가 썼 듯이-그것은 질문이 아니라 진술처럼 들립니다.
Jarosław Wlazło

주제, 술어 및 객체 (예 : UserSessionIsComplete 또는 IsUserSessionComplete)가 있어야하는 상황의 경우 어느 것을 선호합니까?
Yang

40

나는 말할 것입니다 userExists시간의 90 % 내 호출 코드는 다음과 같이 때문에 :

if userExists(...) {
  ...
}

말 그대로 영어로 읽습니다.

if isUserExistif doesUserExist중복 보인다.


18

가독성 을 추구하는 동안 명확성 을 희생하지 않도록주의하십시오 .

하지만 if (user.ExistsInDatabase(db))보다 더 좋은 읽고 if (user.CheckExistsInDatabase(db)), 빌더 패턴 (또는 당신의 상태를 설정할 수있는 클래스)와 클래스의 경우를 고려 :

user.WithName("Mike").ExistsInDatabase(db).ExistsInDatabase(db2).Build();

그것이 ExistsInDatabase존재하는지 확인하거나 존재한다는 사실을 설정하는지 여부는 명확 하지 않습니다. 비교 값을 쓰지 if (user.Age())않거나 전혀 쓰지 않을 것입니다. if (user.Name())if (user.Exists())순전히 그 속성 / 함수가 부울 유형이고 자연 영어처럼 읽을 수 있도록 함수 / 속성의 이름을 바꿀 수 있기 때문에 왜 좋은 생각입니까? 부울 이외의 다른 유형에 사용하는 것과 동일한 패턴을 따르는 것이 그렇게 나쁜가요?

다른 유형의 경우 if명령문은 함수의 반환 값을 코드의 값과 비교하므로 코드는 다음과 같습니다.

if (user.GetAge() >= 18) ...

"if user dot get age is greater than or equal to 18 ..."로 읽습니다. 사실- "자연 영어"가 object.verb아닙니다. 많은 주류 언어). 프로그래머는 일반적으로 위의 진술을 이해하는 데 문제가 없습니다. 그럼 다음이 더 나빠질까요?

if (user.CheckExists() == true)

일반적으로 단축됩니다

if (user.CheckExists())

치명적인 단계에 이어

if (user.Exists())

"코드가 쓰여진 것보다 10 배 더 자주 읽힌다"는 말이 있지만, 버그를 쉽게 발견 할 수있는 것도 매우 중요합니다. 객체가 존재하도록하고 성공에 따라 true / false를 반환하는 Exists ()라는 함수가 있다고 가정합니다. 코드를 쉽게 볼 수 있고 if (user.Exists())버그를 발견하지 못할 수 있습니다 if (user.SetExists()). 예를 들어 코드를 읽으면 버그가 훨씬 더 분명해질 것 입니다.

또한 user.Exists ()는 복잡하거나 비효율적 인 코드를 쉽게 포함 할 수 있으며 데이터베이스를 왕복하여 무언가를 확인할 수 있습니다. user.CheckExists ()는 함수가 어떤 일을한다는 것을 분명히합니다.

여기에서 모든 응답을 참조하십시오. 명명 규칙 : 부울을 반환하는 메서드의 이름은 무엇입니까?

마지막으로 "Tell Do n't Ask"에 이어 참 / 거짓을 반환하는 많은 함수가 어쨌든 사라지고 객체에 상태를 묻는 대신 무언가를하도록 지시합니다. 상태에 따라 방법.


2
> Suppose you had a function called Exists() which causes the object to exist그것은 이미 문제입니다. 이러한 방법은와 같은 동사 여야합니다 Create. 최소한 Exist이지만 동사로 "exist"는 거의 사용되지 않습니다. It's not clear if ExistsInDatabase is checking whether it does exist, or setting the fact that it does exist.매우 명확합니다. 부울을 반환하는 것 이외의 다른 작업을 수행하면 대부분의 개발자가 놀랄 것이라고 주장합니다.
RJFalconer

@RJFalconer Most developers는 문장의 핵심입니다. 나는 무언가가 존재하는지 확인하는 것 외에 다른 것이 all developers있다면 놀랄 것이라고 말할 것 CheckExists()입니다. 그것은이 아니라 Exists()그냥, 끔찍한 이름 CheckExists()A는 더 나은 이름, 그리고이 질문은 일반적인 원칙, 무슨 최고의 명명 패턴으로, 요구하고있다? 대답은 다른 함수처럼 취급하고, 이름을 동사로 시작하고, 부울을 반환하기 때문에 다른 패턴을 사용하지 않는 것입니다.
Michael Parker

예, 질문은 부울 메서드에 대한 최상의 명명 패턴에 관한 것입니다. Bool 메서드는 고유하며 고유 한 공통 이름 인 술어를 갖습니다. 다른 기능처럼 취급해서는 안됩니다. 부울 메서드 이름의 질문과 함께 동사를 넣는 것은 중복됩니다. 그리고 코드 가독성에 부정적인 영향을 미칩니다. 동사없이 질문 형식으로 부울 메서드를 명명하는 것은 업계에서 가장 좋은 방법으로 받아 들여지고 있습니다. 예 : docs.microsoft.com/en-us/dotnet/api/system.io.file.exists developer.android.com/reference/java/io/File#exists ()
Almir

@Almir File.Exists는 매우 오래된 호출 (최소한 dot net 1.1)이며 현대 가독성 표준의 좋은 예가 아닙니다. 마이크로 소프트가 동의하는 방법의 더 현대적인 예는 현대 닷 넷 코어 API에서 봐 : github.com/dotnet/sdk , 어떤 임의의 예는 링크 링크 링크
마이클 파커

15

가독성의 목표는 항상 자연어에 가장 가까운 코드를 작성하는 것이어야합니다. 따라서이 경우 userExists에는 최선의 선택 인 것 같습니다. 그럼에도 불구하고 접두사 "is"를 사용하는 것은 예를 들어 isProcessingComplete.


1
두 번째 예로 ProcessingIsComplete자연어에 더 가깝습니까? 예 : if (ProcessingIsComplete ())
Yang

9

1) 자연어에서 의미가 있고 2) 내가 본 API의 규칙을 따르기 때문에 userExists ()를 사용합니다.

자연어로 이해되는지 확인하려면 소리내어 읽으십시오. "사용자가있는 경우"는 "사용자가있는 경우"또는 "사용자가있는 경우"보다 유효한 영어 구문처럼 들립니다. "사용자가있는 경우"가 더 나을 수 있지만 "the"는 아마도 메서드 이름에 불필요합니다.

Java SE 6에 파일이 있는지 확인하려면 File.exists ()를 사용 합니다. 이것은 버전 7 에서 동일하게 보입니다 . C #을 사용하여 같은 규칙 으로 수행 파이썬루비를 . 바라건대, 이것은 이것을 언어에 구애받지 않는 대답이라고 부르기에 충분히 다양한 컬렉션입니다. 일반적으로 나는 당신의 언어 API를 유지하기 위해 이름 지정 방법을 선호합니다.


5

여기에 몇 가지 다른 답변에서 놓친 것으로 생각되는 사항이 있습니다.

  1. 이것이 C ++ 클래스 메서드인지 C 함수인지에 따라 다릅니다. 이것이 메소드라면 호출 if (user.exists()) { ... }되거나 호출 if (user.isExisting()) { ... }
    되지 않을 것 if (user_exists(&user))입니다. 이것이 상태 bool 메서드가 객체 앞에있을 때 문장처럼 읽히기 때문에 상태 bool 메서드가 동사로 시작해야하는 코딩 표준 뒤에있는 이유입니다.

  2. 불행히도 많은 오래된 C 함수는 성공에 대해 0을 반환하고 실패에 대해 0이 아닌 값을 반환하므로 모든 bool 함수가 동사로 시작하거나 항상 true와 비교하지 않는 한 사용되는 스타일을 결정하기 어려울 수 있습니다. if (true == user_exists(&user))


5

이 질문에 대한 나의 간단한 규칙은 다음과 같습니다.

부울 메서드에 이미 동사가있는 경우 추가하지 마십시오. 그렇지 않으면 고려하십시오. 몇 가지 예 :

$user->exists()
$user->loggedIn()
$user->isGuest() // "is" added

2

순전히 주관적입니다.

나는 userExists(...)다음과 같은 진술이 더 잘 읽기 때문에 선호합니다 .

if ( userExists( ... ) )

또는

while ( userExists( ... ) )

1

이 특별한 경우에, 첫 번째 예는 너무 끔찍한 영어로 나를 움찔하게 만듭니다.

나는 if 문에서 읽을 때 소리가 어떻게 들리기 때문에 아마도 세 번째로 갈 것입니다. "사용자가있는 경우"가 "사용자가있는 경우"보다 더 잘 들립니다.

이것은 물론 if 문 테스트에서 사용될 것이라고 가정합니다.


1

다음 중 하나를 좋아합니다.

userExists(...)
isUserNameTaken(...)
User.exists(...)
User.lookup(...) != null

0

메서드 이름은 가독성을 위해 제공되며 전체 코드에 맞는 이름 만 조건으로 시작하는 대부분의 경우가 가장 좋으므로 subjectPredicate는 자연스러운 문장 구조를 따릅니다.


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