작업을 수행하고 부울을 상태로 반환하는 메서드 이름을 지정하는 방법은 무엇입니까?

방법이 있다면

bool DoStuff() {
    try {
        // doing stuff...
        return true;
    }
    catch (SomeSpecificException ex) {
        return false;
    }
}

오히려 호출해야 IsStuffDone()합니까?

사용자가 두 이름을 모두 잘못 해석 할 수 있습니다. 이름이 DoStuff()부울 인 이유는 무엇입니까? 이름이 IsStuffDone()확실하지 않은 경우, 메소드가 태스크를 수행하는지 또는 결과 만 확인하는지 명확하지 않습니다.

이 사건에 대한 협약이 있습니까? 또는 이것이 결함으로 간주되는 대체 접근법입니까? 예를 들어, C #과 같은 출력 매개 변수가있는 언어에서 부울 상태 변수는 메소드에 전달 될 수 있으며 메소드의 리턴 유형은입니다 void.

편집 : 내 특정 문제에서 메서드는 인터페이스 구현의 일부이기 때문에 예외 처리를 호출자에게 직접 위임 할 수 없습니다. 따라서 호출자는 다른 구현의 모든 예외를 처리해야 할 책임이 없습니다. 이러한 예외에는 익숙하지 않습니다. 그러나 호출자는 npinti의 answer and commentStuffHasNotBeenDoneForSomeReasonException 에서 제안한 것처럼 사용자 정의 예외를 처리 할 수 ​​있습니다 .



답변

.NET에는 종종 메소드 중 하나가 예외 ( DoStuff)를 발생 시키고 다른 메소드가 부울 상태를 리턴하고 실행에 성공하면 out 매개 변수 ( TryDoStuff) 를 통한 실제 결과를 리턴하는 메소드 쌍이 있습니다 .

(마이크로 소프트 의 가장 대표적인 예 는 다양한 프리미티브 유형 의 메소드 이기 때문에 Microsoft는 이것을 “Try-Parse Pattern” 이라고 부릅니다 TryParse.)

Try사용하는 언어에서 접두사가 드문 경우에는 사용하지 않아야합니다.


답변

호출 코드에 예외를 던졌다면 어떨까요?

이렇게하면 코드를 사용하는 사람에게 예외 처리를 위임 할 수 있습니다. 향후에 다음을 수행하려면 어떻게합니까?

  • 예외가 발생하지 않으면 조치 A를 수행하십시오.
  • (예를 들어) a FileNotFoundException가 던져 지면 행동 B를 취하십시오.
  • 다른 예외가 발생하면 조치 C를 수행하십시오.

당신이 당신의 예외를 다시 던질 경우, 위의 변화는 것이 단순히 별도의 추가 수반 catch블록을. 그대로두면 메서드와 메서드가 호출되는 위치를 변경해야합니다.이 위치는 프로젝트의 복잡성에 따라 여러 위치에있을 수 있습니다.


답변

DoStuff() 충분하고 함수의 반환 값을 문서화해야하며 함수 이름에서 언급 할 필요가 없으며 사용 가능한 많은 API를 찾으십시오.

PHP

// this method update and return the number affected rows
// called update instead of updateAndGetAffectedCount
$affected = $query->update(/* values */);

C- 샤프

// Remove item from the List
// returns true if item is successfully removed; otherwise, false.
public bool Remove( T item )

답변

Java에서 Collection API 는 부울을 리턴 하는 add 메소드 를 정의 합니다 . 기본적으로 add가 컬렉션을 변경했는지 여부를 반환합니다. 따라서 List항목이 추가 Set되었으므로 일반적으로 true를 반환하지만 , 항목이 이미 있으면 false를 반환 Set할 수 있습니다. 각 고유 항목을 최대 한 번만 허용하기 때문 입니다.

즉, 컬렉션에서 허용하지 않는 항목 (예 : null 값)을 추가하면 NullPointerExceptionfalse를 반환 하는 대신 add가 발생 합니다.

사례에 동일한 논리를 적용 할 때 부울을 반환해야하는 이유는 무엇입니까? 예외를 숨기려면하지 마십시오. 예외를 던져라. 그렇게하면 무엇이 잘못되었는지 알 수 있습니다. 부울이 필요하지 않은 경우 (예외가 아닌 다른 이유로 인해 부울이 필요한 경우) DoStuff()동작의 이름 을 나타내는 메소드 이름을 지정하십시오 . 그것은 물건을한다.


답변

예외, 정상적인 조건과 같은 다른 이유로 실패 할 수 있으므로 다음을 사용하십시오.

boolean doStuff() - returns true when successful

부울의 의미를 문서화하는 것이 중요합니다.


답변

나는 보통 메소드가 OperationResult(또는 OperationResult<T>)을 반환 IsSuccess하고 OperationResult적절하게 속성을 설정합니다 . ‘usual’메소드가 void이면 return OperationResult, ‘usual’메소드가 오브젝트를 리턴 OperationResult<T>하면 Item특성 을 리턴 하고 OperationResult적절하게 설정하십시오 . 또한 메소드 가진 좋을 것 OperationResult같은 .Failed(string reason).Succeeded(T item). OperationResult시스템에서 빠르게 익숙한 유형이되고 개발자는이를 처리하는 방법을 알게됩니다.


답변

실제로 사용중인 언어에 따라 다릅니다. 일부 언어와 마찬가지로 많은 언어 나 다른 언어에는 실제로 존재하지 않는 규칙과 프로토콜이 있습니다.

예를 들어, Objective-C 언어 및 iOS / Mac OS X SDK 메소드 이름에서 일반적으로 다음 행을 따릅니다.

- (returndatatype) viewDidLoad {
- (returndatatype) isVisible {
- (returndatatype) appendMessage:datatype variablename with:datatype variablename {

보시다시피 viewDidLoad라는 메소드가 있습니다. 본인의 응용 프로그램을 만들 때마다이 유형의 명명을 사용하는 것을 선호합니다. 이것은 당신이 말한대로 어떤 일이 발생했는지 확인하는 데 사용될 수 있습니다. 나는 그것이 당신이 당신의 방법의 이름을 무엇에 대해 너무 깊이 생각하고 있다고 생각합니다. 대부분의 메소드는 관계없이 자신이하는 일의 상태를 리턴합니다 (예 :

PHP에서 연결이 실패하면 mysql_connect ()는 false를 반환합니다. 그것은 그렇다고 말하지는 않지만 설명서는 그렇게하므로 프로그래머에게 잘못 해석 할 수는 없습니다.