답변:
toXYZ()
함수는 변환을 수행하고, 새로운 복귀 할 것으로 예상된다 독립적 (불변 최적화를 허용하지만, 객체를 java.lang.String.toString()
그냥 객체를 반환).
예를 들어, C ++ std::bitset::to_ulong()
에서는 쉽게 변환 할 수 없으며 전체가 과도하게 to_string()
복잡하고 복잡한 변환을 수행하고 메모리를 할당합니다.
asXYZ()
한편 함수 최소 일을 상기 광원의 (잠재적으로 다른) 뷰를 리턴 할 것으로 예상된다.
예를 들어 C ++ std::as_const()
에서는 상수 참조 만 반환하고 더 관련 std::forward_as_tuple
있는 것은 참조로 인수를 참조합니다.
std::to_string(x)
새 문자열 객체를 만들지 만 std::as_const(x)
기존 객체의 참조 (보기)를 만듭니다.
솔직히 말하면 이름이 일치하지 않을 수 있습니다. 예를 들어 스몰 토크에서 표준 라이브러리 개체 봐는 "복잡한 변환"또는 "다른 종류의 간단한 표현을 반환"할 수있는 모든 방법을로 시작하는 경우 as
와 같이, asString
, asFloat
, asSeconds
,와 다른 것 아무것도 변환 표준 방법 as: aClass
.
루비, 방법의 동일한 종류 접두어 to_
같이 to_s
, to_a
, to_h
, 짧은 string
, array
그리고 hash
각각.
표준 라이브러리는 서로 다른 종류의 변환을 구분하지 않는 것 같습니다. 아마도 구현 세부 사항으로 간주해야하기 때문일 것입니다.
그러나 Java에서는 많은 혼합이 있습니다. 당신이 언급 한 바와 같이,있다 toString
, asList
등등합니다. 각각의 접두사에 다른 의미를 정의하려고하면 표준 라이브러리의 다른 곳에서 항상 반대 예를 찾을 수 있기 때문에 이것이 이름 불일치라고 생각합니다.
어쨌든 중요한 것은 여러분과 팀이 하나의 접두사를 선택하여 코드 전체에서 일관되게 사용하는 것입니다. 일관성이 핵심이므로 사람들은 당신이 원했던 것처럼 궁금해하지 않습니다.
toString
객체와 완전히 분리 된 새 문자열을 만듭니다 (불변성으로 인해 다른 방법은 없습니다). 예를 들어 for Collection#toArray
를 유지하면서 Arrays#asList
양방향으로 연결된 어레이의 뷰 를 반환합니다 (배열을 변경하면 목록이 변경되고 그 반대도 마찬가지 임). 따라서 예외가있을 수는 있지만 상당히 일관성이 있습니다. 하나의 접두사를 선택하는 것은 잘못입니다. 이 있다면 Arrays#toList
새로운 기본 배열로 새 목록을 만들 것으로 기대됩니다.
이미 받아 들여진 답변이 있지만 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를 봅니다.
의미있는 전환을 의미하기 위해 (이것은 운동, 과정입니다). 원래의 객체를 표현하는 방법 인 표현을 의미합니다.
이것을 바라 보는 또 다른 방법 :
그리고 처리해야 할 "선행 기술"(또는 레거시)이 있습니다. 언어가 완전히 처음부터 시작되기 전에 StrToInt () 및 IntToStr ()과 같은 라이브러리 함수가 있습니다. 그들은 변환을 수행했으며, 작업이기 때문에 SomethingToSomethingelse ()라고 부르는 것이 합리적이었습니다. 결국, To는 As보다 더 활동적입니다. 특히 델파이에 대해 생각하고 있습니다.
C #이 OO를 향한 야망으로 설계되었을 때 정수를 문자열로 변환하는 정수 객체에 대한 메소드를 갖는 것이 합리적이었습니다. Convert 클래스도 있지만 문자열로 변환하는 것이 너무 일반적이므로 객체에서 가상 메서드가되었습니다. 디자이너는 ToString이 이전 패러다임의 사람들에게 더 친숙 할 것이라고 생각했을 수도 있습니다. 아마도 이것이 가상 속성 AsString이 아닌 가상 메서드 ToString ()을 얻은 이유 일 것입니다.
toString()
?