호출되는 객체를 수정하는 함수 / 방법을 설명하는 데 사용되는 용어는 무엇입니까?


12

일반적인 질문에 대해 죄송합니다. 나는 모든 것을 검색 하고 이것 과 비슷한 많은 스레드를 찾았 지만 내 특정 질문에 대답하는 스레드 는 아닙니다. 아마도 내가 찾고있는 용어가 존재하지 않기 때문일 수 있습니다.

내 친구가 프로그래밍, JavaScript를 배우고 있는데 왜 이것이 작동하지 않는지 물었습니다.

var a = "Hello World";
a.replace("Hello", "Goodbye");

console.log(a)  // Logs "Hello World"

JavaSript에서 문자열을 변경할 replace수 없으므로 수정하지 않기 때문 a입니다. 이 Becuase 반환 문자열을, 당신은 뭔가를해야 할 것 ...

var a = "Hello World";
a = a.replace("Hello", "Goodbye");

console.log(a);  // Logs "Goodbye World"

그러나 대안은 JavaScript 호출과 같은 기능 reverse()입니다. 예를 들면 다음과 같습니다.

var fruits = ["Apples", "Oranges", "Bananas"];
fruits.reverse();

console.log(fruits)  // ["Bananas", "Oranges", "Apples"]

친구가 왜 replace작동하지 않는지 물었을 때 , 내가 알지 못하는 한, 내가 알지 못하는 단어에 도달하고 있다는 것을 깨달았습니다.

" 바꾸기 기능이 ________이므로 문자열을"문자열 바꾸기 " 로 설정 해야합니다."

reverse는 ________이므로 배열을 "array dot reverse"와 동일하게 설정할 필요는 없습니다 .

나는 그것이 내가 찾고있는 단어라고 믿지 않지만 프로토 타입 기능에 익숙 합니다. 누구든지이 공백을 채우도록 도와 줄 수 있습니까?


6
어쩌면 그 단어는 "돌연변이"일까요? 에서와 같이 : You don't need to set an array equal to "array dot reverse", because reverse is a mutator function. 나는 그 용어를 호출하는 인스턴스를 "돌연변이시키는"함수를 말하는 용어를 들었다고 생각 합니다. 그러나 아마도 다른 곳에서 다시 확인해야합니다.
FrustratedWithFormsDesigner

감사합니다! 방금 Mutator Methods 에 대해 읽었 으며이 대화에 확실히 적합하다고 생각합니다. 확실히 내가 찾고있는 영역에서.
Santi

혼란 스럽습니다. 제목에서는 호출 한 객체를 수정하는 함수에 대해 묻지 만 예제에서는 호출 객체를 수정하는 메소드 , 즉 제목과 정확히 반대되는 방법을 보여줍니다 . 둘 중 어느 쪽입니까?
Jörg W Mittag

확실히 30 줄로 자세히 설명되어 있습니다. 헤드 업 덕분에 제목을 정확하게 수정하겠습니다!
Santi

답변:


12

당신이 찾고있는 개념 쌍은 변경 가능 / 불변의 매개 변수 와 결과의 제자리 / 반환입니다.

귀하의 예에서 :

replace 함수는 파이썬에서는 변경할없는 문자열에서 작동 하므로 replace 함수 새 문자열을 반환 하므로 문자열을 "string dot replace"로 설정해야 합니다.

C / C ++ 프로그래머에게는 이것이 "참조에 의해 전달됨"보다는 "값에 의해 전달됨"매개 변수로서보다 친숙하므로 결과를 변경할 수 없습니다 .

reverse는 변경 가능한 배열에서 작동 하므로 반환하기 전에 내부에서 변경할 수 있기 때문에 배열을 "배열 도트 반전"으로 설정할 필요가 없습니다 .

이러한 C / C와 같은 언어에서 ++이 어드레스 통과 즉 "참조로 전달"파라미터로 알려져 의해 수정되지 않은 경우에 const, 변경의 기능을 허용 하는 mutate 결과 변화하는 어드레스의 내용 제자리를 리턴하기 전에한다.

물론이 두 메커니즘에 의해 반환 결과는, 예를 들면하는 기능을 가지고 드문 일이 아니다 int SomeFn(int p1, int p2, int *ErrCode), 할 수 잠재적으로 반환 값과의 내용을 수정하여 두 결과를 반환을 ErrCode.

세번째 방법

완성도를 높이기 위해 결과를 반환하는 세 번째 메커니즘은 부작용 또는 전역 적입니다 (예 : 파일 범위, 프로그램 전체, 공유 또는 환경 값 수정). 잘 문서화되어 있지 않으면 코드를주의 깊게 읽어야 만 변경되는 내용을 찾을 수 있으므로 일반적으로 나쁜 소식 으로 간주됩니다 . C / C ++와 같은 언어에서는 다른 모듈에서도 주어진 이름을 가진 외부 스코프 변수가 있고 동일한 이름의 마스킹 로컬 범위 변수가 없어서 너무 쉽게 수행 할 수 있습니다 . Python에서 외부 범위 값을 명시 적으로 설정하여 외부 범위 값을 사용할 수있는 경우가 아니면 외부 범위에서 값의 값을 읽을 수 있습니다.global 키워드, 외부 범위 변수를 수정하려고하면 동일한 이름의 로컬이 자동으로 생성됩니다.


아, 나는이 용어에 익숙하지만 함수 자체 를 설명하는 실제 단어가 있는지 확실하지 않습니다 . 에서와 같이 (The reverse function is a _______ function.말했듯이, 이것은 내 친구에게주는 것과 거의 동일한 반응이므로, 나는 당신의 확인에 감사합니다-나는 여전히 특정한 용어가 있는지 궁금합니다. 나는 질문을 조금만 열어 두려고하지만이 단어가 단순히 존재하지 않는 경우에 이것을 분명히 대답으로 받아 들일 것입니다.
Santi

2
파이썬과 같은 일부 언어에서는 자신을 수정하는 클래스를 가질 수도 있습니다. 일부 컨텍스트에서는이 "원숭이 패치"가 좋은 것으로 간주되며 "자체 수정 코드"로 간주되어 금지됩니다. 또한 코드 조각이 무작위로 "돌연변이"되고 /되거나 결합 된 다음 "최상의"성능을 위해 어떤 방식 으로든 테스트되고 선택되는 "진화 코드"를 가질 수 있습니다.
Steve Barnes

-1. 문자열이 변경 가능하거나 변경 불가능한지 여부는 문자열에서 작동하는 기능과 관련이 없습니다. 함수가 변경 불가능하거나 변경 불가능하며 "돌아가거나 제자리에"있지 않습니다. 함수는 인수를 수정하고 여전히 반환 할 수 있습니다.
Miles Rout

@MilesRout은 제자리에서 수정하는 함수는 명확성을 위해 일부 C / C ++ 예제와 완전한 결과를위한 부작용으로 결과를 반환한다고 덧붙였습니다.
Steve Barnes

4

그것을 표현하는 가장 좋은 방법은 다음과 같습니다.

  • Array reverse메소드가 변경되고 있습니다. 그것은이다 뮤 테이터 . 일반적인 특수한 경우는 setter 입니다.

  • String replace메소드는 변경되지 않습니다 . mutator아닙니다 . 이 수정하지 않으면 아무것도 , 그것의 부작용 무료 . 일반적인 특수한 경우는 getter 입니다.

  • JavaScript 문자열은 변경할 수 없으므로 String 메서드 는 변경할 수 없습니다.

    "Hello World".replace ( "Hello", "안녕하세요");

    불편하게해야합니다. 문자열 리터럴을 수정하지 않습니다. 결과를 버립니다. 정적 코드 분석기는 때때로 이러한 버그를 감지 할 수 있습니다.

  • JavaScript Array는 변경 가능 하므로 Array 메소드가 변경 될 수 있습니다. JavaScript는 어레이를 로컬 저장 빈으로 사용하는 경향이 있으며, 쉽게 수정하고 자주 복사하지 않습니다.

2

때로는 순수 기능 프로그래밍의 맥락에서 사용될 때 destructive 라는 입력 값을 수정하는 함수를 들었습니다 (따라서 순수 함수가 아닙니다) . 그래도 이것이 올바른 용어인지 확실하지 않습니다.

귀하의 경우에는 다음과 같이 말하십시오.

replace 함수는 파괴적 이지 않기 때문에 문자열을 "string dot replace"로 설정해야합니다 .

reverse는 파괴적 이므로 배열을 "array dot reverse"와 동일하게 설정할 필요는 없습니다 .


1

아마도 순수한 당신이 찾고있는 단어는?

replace()부작용 (예 : 문자열 수정)이없는 것처럼 보이기 때문에 순수한 것으로 보이 reverse()거나 배열 상태를 변경하기 때문에 불완전합니다.


관련 개념이지만 다른 속성도 포함합니다 (예 : 전역 상태에 액세스하지 않고 항상 동일한 입력에 대해 동일한 출력을 생성 함).
Jacob Raihle

1

이들은 일반적으로 함수와 메소드로 분리됩니다 (메소드는 함수의 서브 세트입니다). 함수는 독립적으로 호출 할 수있는 코드 섹션 인 반면, 메서드에는 작동하는 현재 '컨텍스트'개념이 있습니다. 메소드의 조치는 컨텍스트의 상태를 변경합니다.

객체 지향 프로그래밍에서 컨텍스트는 함수가 작동하는 인스턴스입니다.


0

나는 공식적인 대답이 있다는 것을 모르겠지만 여기에 당신이 좋아할만한 두 가지가 있습니다.

순서

질문에 대한 좋은 답변 처럼 보였으므로 질문 BTW와 매우 비슷합니다. 확인해야합니다.

내부 단항 작동

java.util.function 페이지를 검토하십시오 . 다양한 프로토 타입의 델리게이트 (입력 / 출력 서명)에 대한 일종의 구성 이름을 제공합니다. 예를 들어 인수를 취하고 아무것도 반환하지 않는 델리게이트는 consumer 라고합니다 .

이제, OOP의 신입생으로서, 메소드는 숨겨진 매개 변수 ( this) 를 취하는 함수일 뿐이라는 것을 알아야합니다 . 참조로 제공되므로 입력 및 출력 매개 변수의 역할을합니다.

이 Java 녀석들에 따르면 (그리고 그들은 똑똑해 보인다), 단일 입력을 받아들이고 같은 유형의 값을 반환하는 델리게이트를 단항 연산자 라고합니다 .

이제의 경우 array::Reverse()배열을 변경할 수 없으며 잠재적으로 많은 공간을 차지할 수 있으므로 작업을보다 효율적이고 편리하게 수행 할 수 있습니다. 따라서 Reverse()이다 제자리 단항 연산자 .

그러나 나에게 "연산자"는 특수 기호 (예를 들어 덧셈 연산자라고도 함 +) 또는과 같은 수학적 키워드 mod입니다. 따라서 나는 operat를 호출하는 것을 선호 이온 산출 자리에서 단항 연산 .


개념을 섞고 있습니다. Reverse()조작자가 아니다 단항 연산자는 동일한 타입의 값을 반환 할 필요는 없다 (예를 들어 !, delete, typeof) 및 연산자는 위임 아니다. 그러나 "in-place"는 인스턴스를 수정하는 메소드의 좋은 용어입니다. [나는 투표하지 않았지만 모든 답변이 유용하더라도 모든 답변을 투표하지 않은 것처럼 보입니다.]
Jerry101

확실하지 않습니다. 모든 프로토 타입은 대리인이 나타낼 수 있습니다. "연산자"는 내가 언급 한대로 작동하지 않으므로 "연산"이라고 말하면 실제로 Reverse()단항 연산입니다. 그러나 전반적으로 나는 이것이 조금 이상 하다는 것에 동의하지만, 나는 꽤 똑똑한 사람들이 작성한 것처럼 보이는 링크 된 문서 의 용어를 그대로 사용 하고 있습니다. 최소한 아무것도 아닌 것보다 낫습니다.
John Wu

아, 알 겠어요! 람다를 Java로 개조하기 위해 기능 인터페이스 (1 개의 메소드 만있는 Java 인터페이스) 라는 아이디어를 기반으로 일반 Java 객체를 전달하여 "함수"로 적용 할 수 있습니다. (브라이언 게츠는 람다 추가에 기술 이야기가 있습니다. 여러 번 그가 말하는 "명백한 접근 방식은 빨려 한 것입니다.") 만들 때 기능적인 인터페이스 스트림 처리 객체를, 그들은 종류와 같은 학대 용어 "연산자." 혼란 스러워요! 좋은 이름이 없어야합니다. 수신자 객체를 수정하거나 수정하지 않는 OOP 메소드에 대한 좋은 용어 소스라고 생각하지 않습니다.
Jerry101
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.