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

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

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

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



답변

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

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


답변

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

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

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

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

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


답변

이미 받아 들여진 답변이 있지만 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();
      }
    }
  }


답변

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

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

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

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

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

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

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

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


답변