2011-11-09 5 views
1

저는 저장소와 같은 추상화를위한 API를 개발 중입니다. 나는 두 가지 방법이 있습니다Get() 메서드의 변형 이름은 무엇입니까?

// Throws an exception if object cannot be found 
MyObj Get(MyIdType id); 

// Returns false if object cannot be found; no exception 
bool TryGet(out MyObj obj); 

세 번째 변형에 대한 요구 사항이 있습니다 : 개체를 찾을 수없는 경우 null을 반환하고, 예외가 발생하지 않는 한.

// Returns null if object cannot be found; no exception 
MyObj ?????(MyIdType id); 

나는 무엇에 이름을 붙였습니까? GetOrDefault은 혼란 스럽습니다. GetIfNotNull이 제안되었지만 명확하지 않은 것으로 보입니다. GetOrNull은 지금까지 가장 유망한 제품입니다.

누구나 다른 제안이 있거나 따라야 할 규칙이있는 공개 API를 알고 있습니까?

+5

하지 마십시오. 그들에게 Get과 TryGet으로 충분하다고 설득하십시오. Null은 악마입니다. – TrueWill

+0

.Net의 맛? – IAbstract

+1

나는 그들이 null 인 경우 Get()에서 예외를 throw하기를 원한다고 더욱 화가났습니다. 그것은 끔찍한 일입니다. –

답변

2

LINQ 확장 방법 FirstOrDefault을 기반으로 GetOrDefault (사용자가 제안한대로)로 가고 싶습니다.

GetValueGetValueOrDefault이 더 나을 것입니다. GetOrDefault

...OrDefault는 LINQ에서 매우 표준입니다 :에 대해 어떻게

+0

그것이 나의 원래 제안 이었지만 내 고객은 그것을 배제했다. – afeygin

+1

나는 클라이언트가 싫어 ... 나는 그것들이 (LINQ에서) 마이크로 소프트가 사용하는 표준 명명 규칙이라는 것을 그들에게 확신시킬 것이다. 거의 모든 C# 개발자는 문서를 보지 않고 이것이 무엇을 의미하는지 알 수 있지만 문서화해야하는 다른 메서드 이름은 알 수 있습니다. – Connell

+1

클라이언트가 제안 된 메소드 이름을 좋아하지 않는다면, 클라이언트가 자신의 메소드 이름을 제안 할 것을 제안합니다. – phoog

1

.

+0

그건 내 원래의 제안 이었지만 내 클라이언트는 그 객체를 "기본값으로"해석 할 수 있기 때문에 너무 혼란 스럽다고 판결했습니다. – afeygin

+0

@afeygin - 'GetValueOrNull'은 모호하지 않습니다. – Oded

+1

@afeygin *** ***은 디폴트로 객체 – Connell

3

두 가지 상황에서 다르게 동작하는 Get 메서드를 사용하지 않기로했습니다. 모든 경우에 대해 Get 반환 값을 가져 오지 않는 것이 좋습니다. 예외를 던지지 않는 이유는 무엇입니까?

필자는 필요하다면 null 값이 반환되면 예외를 던질 사용자 코드를 남겨 두겠다.

예외를 throw 할 때와 관련된 자세한 지침은 this question을 참조하십시오.

MyObj Get(MyIdType id); 

대신 여기에 예외를 던지는, 단순히 null을 반환 : 내 생각에

+0

을 기본값으로 설정하는 이유는 무엇입니까? – IAbstract

0

, 당신은 충실해야한다. 경우 예외 또는 선택적으로을 던져 명확한 요구 사항이, null, 나는 시도 할 것이다 :

MyObj Get (MyIdType id, bool ReturnDefault = false) // if .net 4 

나는 특히이 옵션을 좋아하지 않는다 - 그러나 때때로 요구 사항은 우리가 느끼는 생각보다 우선합니다 오른쪽 또는 자연스러운.

0

GetObjectOrReturnDefaultValue을 시도해 볼 수 있습니다. 참조 유형이 GetObjectOrReturnNull입니다. 길고 못 생겼지 만 모호하지는 않습니다.

0

interface에 변형 bool TryGetXXXXX(out T value) 만 남기고 그 나머지를 확장 방법으로 제공합니다. 인터페이스 자체가 매우 작아 지지만 동시에 클라이언트가 원하는만큼 유용합니다.

관련 문제