"to"와 "as"메서드 이름 접두사의 차이점은 무엇입니까? [닫은]


78

"to""as" 메소드 이름 접두사 의 차이점은 무엇입니까?

  • toList (),
  • asList (),
  • 기타...

분석법을 설계 할 때 언제 사용해야합니까?

답변:


120

toXYZ()함수는 변환을 수행하고, 새로운 복귀 할 것으로 예상된다 독립적 (불변 최적화를 허용하지만, 객체를 java.lang.String.toString()그냥 객체를 반환).
예를 들어, C ++ std::bitset::to_ulong()에서는 쉽게 변환 할 수 없으며 전체가 과도하게 to_string()복잡하고 복잡한 변환을 수행하고 메모리를 할당합니다.

asXYZ()한편 함수 최소 일을 상기 광원의 (잠재적으로 다른) 뷰를 리턴 할 것으로 예상된다.
예를 들어 C ++ std::as_const()에서는 상수 참조 만 반환하고 더 관련 std::forward_as_tuple있는 것은 참조로 인수를 참조합니다.


19
이에 대한 기존의 선례가 있음이 밝혀졌습니다. 일반적으로 As [something]은 캐스트와 유사하지만 To [something]은 기존 오브젝트와 다른 유형의 새 오브젝트를 빌드합니다. ToList의 경우 O (n)이되고 "As"보다 거의 확실히 비쌉니다. 참조 stackoverflow.com/questions/17968469/...
로버트 하비

5
설명적인 이름을 선택하는 과정의 일부이며, 이러한 특정 구별이 코딩 표준에 코드화되어 있지 않더라도이를 위반하면 가장 놀랍게 되는 원리가 깨집니다 .
중복 제거기

11
나는 그것을 본능적으로 "to"를 "change to"로, "as"를 "treat as"로 생각할 것이다. 전자는 일을 바꾸는 일을 의미하고, 후자는 그것이 일하는 방식에 차이가 있음을 의미합니다.
Latty

6
그것이 무언가를 의미한다면, 이것은 이것을 의미해야합니다. 나는 종종 의미가 없다는 것을 제안하기 때문에 임의의 타사 코드 (문서에서 무언가를 보지 않고)에 의존하지 않을 것입니다. 그래도 코드 기반으로 채택하는 것이 좋습니다.
Ben

4
이 대답은 C ++에서도 정확합니다. 예를 들어 std::to_string(x)새 문자열 객체를 만들지 만 std::as_const(x)기존 객체의 참조 (보기)를 만듭니다.
Quuxplusone

13

솔직히 말하면 이름이 일치하지 않을 수 있습니다. 예를 들어 스몰 토크에서 표준 라이브러리 개체 봐는 "복잡한 변환"또는 "다른 종류의 간단한 표현을 반환"할 수있는 모든 방법을로 시작하는 경우 as와 같이, asString, asFloat, asSeconds,와 다른 것 아무것도 변환 표준 방법 as: aClass.

루비, 방법의 동일한 종류 접두어 to_같이 to_s, to_a, to_h, 짧은 string, array그리고 hash각각.

표준 라이브러리는 서로 다른 종류의 변환을 구분하지 않는 것 같습니다. 아마도 구현 세부 사항으로 간주해야하기 때문일 것입니다.

그러나 Java에서는 많은 혼합이 있습니다. 당신이 언급 한 바와 같이,있다 toString, asList등등합니다. 각각의 접두사에 다른 의미를 정의하려고하면 표준 라이브러리의 다른 곳에서 항상 반대 예를 찾을 수 있기 때문에 이것이 이름 불일치라고 생각합니다.

어쨌든 중요한 것은 여러분과 팀이 하나의 접두사를 선택하여 코드 전체에서 일관되게 사용하는 것입니다. 일관성이 핵심이므로 사람들은 당신이 원했던 것처럼 궁금해하지 않습니다.


1
나는 믿지 않는다 : 전체 팀에 대해 하나의 스타일을 선택하는 대신 모듈에서 비슷한 경우에 대해 하나의 스타일을 일관되게 선택하십시오.
Daniel Hári

12
Java에서는 toString객체와 완전히 분리 된 새 문자열을 만듭니다 (불변성으로 인해 다른 방법은 없습니다). 예를 들어 for Collection#toArray를 유지하면서 Arrays#asList양방향으로 연결된 어레이의 뷰 를 반환합니다 (배열을 변경하면 목록이 변경되고 그 반대도 마찬가지 임). 따라서 예외가있을 수는 있지만 상당히 일관성이 있습니다. 하나의 접두사를 선택하는 것은 잘못입니다. 이 있다면 Arrays#toList새로운 기본 배열로 새 목록을 만들 것으로 기대됩니다.
maaartinus

스몰 토크가 거기서 실수를했다고 생각하지만 그들은 협약을 이해하지 못했습니다. 너무 추상적이고 영향을 미치지 않기 때문에 이해하기가 어려울 수 있습니다. 이 질문을하는 것조차 통찰력이 필요합니다.
usr

3
@usr 스몰 토크는 컨벤션이되기 전에 설계되었을 수도 있습니다
Bergi

6

이미 받아 들여진 답변이 있지만 C ++에 중점을두고있는 반면 질문에는 java 태그가 붙어 있습니다 . Java에서 이런 종류의 것을 염두에 두는 첫 번째 예는 Arrays.asList 입니다. Arrays.asList 는 본질적으로 목록에 싸서 배열의 뷰를 반환합니다. 기본 배열과 목록은 여전히 ​​연결되어 있습니다. 배열에 대한 변경 사항은 목록에 반영되며 그 반대도 마찬가지입니다. 그러나리스트의 toArray 메소드에 의해 리턴 된 배열 은 원래 배열 및리스트와 독립적입니다.

String[] wordArray = {"one", "fine", "day"};
List<String> wordList = Arrays.asList(wordArray);

// changes to the array are visible in the list
System.out.println(wordList); // prints "[one, fine, day]"
wordArray[1] = "horrible";
System.out.println(wordList); // prints "[one, horrible, day]"

// changes to the list are visible in the array
wordList.set(1, "beautiful");
System.out.println(wordArray[1]); // prints "beautiful"

// but changes to the list or array don't affect the 
// result from the list's toArray method.
String[] moreWords = wordList.toArray(new String[] {});
wordList.set(0, "the");
wordArray[1] = "best";
for (int i=0; i<3; i++) {
  System.out.println(moreWords[i]); // prints "one", "beautiful", and "day"
}

그러나 모든 라이브러리 개발자가이 규칙을 준수한다고 보장 할 수는 없으므로 문서를 확인하여 이것이 알 수없는 코드에서 발생하는 동작인지 확인해야합니다.

내가 자주 사용하는 ... () 메소드 보았던 다른 곳은 하위 유형으로 다운 캐스팅 유형입니다. 예를 들어, 열거 된 하위 유형 집합이 있으면 다음과 같은 코드로 끝날 수 있습니다.

  /**
   * Every Node is either an ANode or a BNode.
   */
  interface Node {

    /**
     * Returns this Node as an ANode.
     * 
     * @return this node
     */
    default ANode asANode() {
      if (this instanceof ANode) {
        return (ANode) this;
      }
      else {
        throw new UnsupportedOperationException();
      }
      // Or, in Java8 style, perhaps:
      // return Optional.of(this)
      //     .filter(ANode.class::isInstance)
      //     .map(ANode.class::cast)
      //     .orElseThrow(UnsupportedOperationException::new);
    }

    /**
     * Returns this Node as a BNode.
     * 
     * @return this node
     */
    default BNode asBNode() {
      if (this instanceof BNode) {
        return (BNode) this;
      }
      else {
        throw new UnsupportedOperationException();
      }
    }
  }

1

내가 알아 차린 차이점은 (지금 생각하면서)

  • 일반적으로 다른 참조 유형 (약간 복잡한 객체)으로 변환
  • 일반적으로 간단한 값 유형을 반환합니다

우리는 AsInteger와 AsString을보고 ToArray와 ToStringList를 봅니다.

의미있는 전환을 의미하기 위해 (이것은 운동, 과정입니다). 원래의 객체를 표현하는 방법 인 표현을 의미합니다.

이것을 바라 보는 또 다른 방법 :

  • To는 작업이므로 메소드에 사용합니다.
  • 간단한 표현이므로 속성에 사용합니다.

그리고 처리해야 할 "선행 기술"(또는 레거시)이 있습니다. 언어가 완전히 처음부터 시작되기 전에 StrToInt () 및 IntToStr ()과 같은 라이브러리 함수가 있습니다. 그들은 변환을 수행했으며, 작업이기 때문에 SomethingToSomethingelse ()라고 부르는 것이 합리적이었습니다. 결국, To는 As보다 더 활동적입니다. 특히 델파이에 대해 생각하고 있습니다.

C #이 OO를 향한 야망으로 설계되었을 때 정수를 문자열로 변환하는 정수 객체에 대한 메소드를 갖는 것이 합리적이었습니다. Convert 클래스도 있지만 문자열로 변환하는 것이 너무 일반적이므로 객체에서 가상 메서드가되었습니다. 디자이너는 ToString이 이전 패러다임의 사람들에게 더 친숙 할 것이라고 생각했을 수도 있습니다. 아마도 이것이 가상 속성 AsString이 아닌 가상 메서드 ToString ()을 얻은 이유 일 것입니다.


3
무엇에 대해 toString()?
중복 제거기

당신은 저를 거기에 데려 갔다. AsString이 더 적합했을 것입니다. 몇 가지 생각을 더하면 내 대답을 업데이트 할 것입니다.
Martin Maat

이 답변이 실제로 C #의 규칙과 일치한다고 생각하지 않습니다. 예 : ToList () 및 AsEnumerable ()은 모두 복잡한 객체를 반환하지만 차이점은 ToList ()는 항상 새 객체를 반환하는 반면 AsEnumerable ()은 원래 객체에 대한 뷰 또는 어댑터를 반환합니다.
JacquesB

@JaquesB 분명히 다른 아이디어가 여기저기서 적용되었습니다. 델파이는 데이터베이스 필드를 캡슐화하는 TField 객체에 AsInteger 및 AsString 속성을 가지고 있습니다. 나는 이것에 의해 편향되었을 수 있습니다. 그러나 다시 질문에는 C #이나 Delphi가 아닌 Java로 태그가 지정됩니다.
Martin Maat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.