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


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.