programing tip

부울 메서드 명명 가독성

itbloger 2020. 8. 18. 07:26
반응형

부울 메서드 명명 가독성


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

public boolean isUserExist(...)

또는:

public boolean doesUserExist(...)

또는:

public boolean userExists(...)

public boolean userExists(...)

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

if userExists ...

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


userExists내 호출 코드의 90 %가 다음과 같기 때문에 라고 말할 것입니다.

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

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

if isUserExistif doesUserExist중복 보인다.


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


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

하지만 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) ...

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


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

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

I'd probably go for number three because of how it sounds when reading it in if statements. "If user exists" sounds better than "If does user exists".

This is assuming it's going to be to used in if statement tests of course...


I like any of these:

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

Purely subjective.

I prefer userExists(...) because then statements like this read better:

if ( userExists( ... ) )

or

while ( userExists( ... ) )

Method names serves for readability, only the ones fit into your whole code would be the best which most of the case it begins with conditions thus subjectPredicate follows natural sentence structure.


Why not rename the property then?

if (user.isPresent()) {

참고URL : https://stackoverflow.com/questions/1566745/boolean-method-naming-readability

반응형