"get"과 "find"접두사를 사용하여 이름 지정 방법을 결정하는 방법과 이유


47

getSomethingvs로 시작하는 특정 방법의 이름을 지정 해야하는지 항상 알아내는 데 어려움이 있습니다 findSomething.

문제는 잘못 설계된 API를위한 헬퍼 를 작성하는 데 있습니다 . 일반적으로 객체에서 데이터를 가져올 때 발생하며,이 경우 객체를 매개 변수로 사용해야합니다. 다음은 간단한 예입니다.

public String getRevision(Item item) {
    service.load(item, "revision");
    // there is usually more work to do before getting the data..
    try {
        return item.get_revision();
    }
    catch(NotLoadedException exception) {
        log.error("Property named 'property_name' was not loaded", exception);
    }
    return null;
}

어떻게 그리고 왜이 메소드 명명 사이에서 결정하는 getRevision()findRevision()?


2
잘못 설계된 API 의 가장 좋은 도우미 는 까다로운 이름 지정을 방해하지 않고 반부패 계층을 설정하는 것입니다 . AnticorruptionLayer를 사용하여 해당 모델과 사용자의 모델로 /로부터 번역합니다. "
gnat

1
나는이 개념에 대해 들어 본 적이 없다. 예제와 더 나은 링크가 있습니까?
knownasilya

1
웹을 검색하면 많은 정보가 있습니다. 예 : 부패 방지 계층 분석, 1 부 "아마도 이미 존재하는 스파게티와 상호 작용하는 작업에 직면 할 수 있습니다. 부패 방지 계층에 들어가기 ..."
gnat

답변:


82

Get검색 시간이 매우 짧다는 것을 알 때 사용 합니다 (해시 테이블 또는 btree에서 조회하는 것처럼).

Find실행하는 데 "더 긴"기간필요한 검색 프로세스 또는 계산 알고리즘을 의미 합니다 (일부 임의의 값이 더 긴 경우).


3
+1 검색 할 때 get을 사용하고 작업을 수행하기 위해 작업을 수행해야 할 때를 찾습니다.
Jim

5
코드 변경 (일부 부품이 최적화되고 알고리즘이 변경됨)과 API 변경을 고려할 때 종종 올바른 기준으로 보이지 않습니다. find나중에 해시 테이블 알고리즘으로 교체하면 어떻게 하시겠습니까?
meze

2
또한 호출을 읽을 때 검색 기준이 성공하지 못하여 찾기가 성공하지 못하면 "찾기"가 호출 될 수 있지만, 비정상적인 문제가 없으면 "get"이 성공할 것으로 예상됩니다.
gnasher729

함수가 조건을 기반으로 결과를 필터링하기 위해 선택적 매개 변수를 허용하면 어떻게됩니까? 모두 getfind그것이 사용되는 방법에 따라 적용됩니다.
ESR

60

나는 그것이 find실패 할 수 있지만 말해서는 안된다고 말할 것 get입니다.


24
findNULL을 get반환하지만 NULL을 반환하지 않지만 throw (또는 주장) 할 수 있음을 의미한다면 동의합니다.
Sjoerd

1
나는 이것에 대해 @Sjoerd에 전적으로 동의합니다.
mhr

그리고 만약에 find()반환 한다면 Optional<>? 이 경우 find에도 null안전합니다.
코더

42

아이들과 자주 대화를 인용하려면 :

나 : 꼬마 야! 배터리 좀 찾아 봐

아이 : 그러나 그들은 어디에?

나 : 그래서 내가 찾아 보라고 했어요 . 그들이 어디 내가 알고, 내가 가서 말했을 것이다 얻을 그들을. 아니면 어머니에게 물어볼 수도 있습니다.

같은 생각이 있습니다.

  • "get"을 사용하면 값이 싼 정보를 반환하고 (인라인되거나 다른 방식으로 최적화 될 수 있음)이 객체가 고유하게 소유 한 정보를 얻을 수 있습니다.

  • 정보를 얻기 위해 작동하거나 다른 개체를 사용하여 정보를 찾는 방법에는 "find"를 사용하십시오.


15
프로그래머 만이이 대화를 자녀와 대화 할 수 있습니다. "쓰레기를 꺼내시겠습니까?" "아니." "쓰레기를 꺼낼 래?" "예."
Robert Harvey

3

찾기는 호출간에 변경 될 수있는 일부 매개 변수로 데이터베이스 쿼리를 실행할 때와 같이 결과가 없음을 의미합니다. 반면에 Get은 결과가 메서드에 미리 알려져 있거나 한 번 알려진 후에는 변경되지 않으며 호출에 매개 변수가 없음을 나타냅니다.
예를 들어 Customer findCustomerById (long customerId) 및 Customer getCustomer ()를 사용합니다.


3

다음 패턴을 적용합니다.

  • Foo GetFoo() null을 반환 할 수 없으며 복잡도가 O (log (n)) 이하입니다.
  • bool TryGetFoo(out Foo) null을 반환 할 수 있고 복잡도가 O (log (n)) 이하
  • Foo FindFoo() null을 반환 할 수 없으며 복잡도가 O (log (n)) 이상입니다.
  • bool TryFindFoo(out Foo) null을 반환 할 수 있고 복잡도가 O (log (n)) 이상입니다.

그렇게하면 의도와 복잡성에 대해 코드가 명확 해집니다.

일반적으로 Getter는 직접 목록 또는 사전 / 집합 액세스를위한 것입니다.
파인더는 심층 검색, 전체 목록 스캔 등입니다 ...

귀하의 경우 :

public bool TryGetRevision( Item item, out String revision ) 
{
    service.load( item, "revision" );
    // there is usually more work to do before getting the data..
    try 
    {
        revision = item.get_revision();
        return true;
    }
    catch( NotLoadedException exception )
    {
        log.error( "Property named 'property_name' was not loaded", exception );
        revision = "";
        return false;
    }
}

try짧고 정확한 +1
SpaceTrucker

2

get사실 어떤 경우에도 적합합니다. 실제로 어떤 것을 얻기 위해서는 먼저 그것을 찾아야한다고 가정합니다. 확실하지 않으면를 사용하십시오 get.

내가 사용하는 것이 find같은 메소드 findMinimum()또는 findOptimal()반환 값을 계산하고 단순히 일부 데이터를 수신 할 수있는 DB에 요청, 파일 시스템, 원격 서버 등을하지 않는 특별한 알고리즘이있는 곳, 즉.


1
좋은 지적입니다. 개인적으로 나는 find당신이 제공 한 예제에서 접두사로 사용하지 않을 것입니다 . 귀하의 예와 같은 계산 작업의 경우 calculate또는 을 사용 compute합니다.
knownasilya


1

나는 일반적으로 Get객체 / 값 Find을 검색하고 위치 를 검색하는 데 사용 합니다 (예 : 배열).

예를 들어 :

object o = obj.GetItem( 'name');

integer i = somearray.Find( 'name');

0

나에게 find하나 이상의 결과가있을 수 있음을 암시합니다. get하나만 의미합니다.


8
그 느낌을 가지고있는 것 같지만 완전히 동의하는지는 확실하지 않습니다. 그것을 이런 식으로 생각 : getCatfindCatgetCatsfindCats. 는 find..여전히 단일 개체를 반환 나타냅니다. 제 생각에는 복수가 명사에 추가되어야합니다.
knownasilya
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.