[api] 부울 메서드 명명 가독성

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

public boolean isUserExist(...)

또는:

public boolean doesUserExist(...)

또는:

public boolean userExists(...)



답변

public boolean userExists(...)

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

if userExists ...

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


답변

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

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

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

if isUserExistif doesUserExist중복 보인다.


답변

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

하지만 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”에 이어 참 / 거짓을 반환하는 많은 함수가 어쨌든 사라지고 객체에 상태를 묻는 대신 무언가를하도록 지시합니다. 상태에 따라 방법.


답변

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


답변

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

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

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


답변

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

  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))


답변

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

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

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