함수는 변경되지 않은 매개 변수 만 반환합니다.


15

방금 작업중 인 프로젝트 에서이 기능을 찾았습니다.

  -- Just returns the text unchanged.
  -- Note: <text> may be nil, function must return nil in that case!
  function Widget:wtr(text)
      return text
  end

너무 슬프게도 코더는 더 이상 회사에서 작동하지 않습니다. 왜 아무것도하지 않는 함수를 만들지 만 호출 된 매개 변수를 반환합니까?

이 예제에 지정되지 않았지만 어떤 경우에도 전체적으로 그러한 기능에 대한 사용이 있습니까?

로 인해

function aFunction(parameter)
    return parameter
end

종료

aFunction(parameter) == parameter

왜 내가 뭔가를 쓸까요

aFunction(parameter) == whatIWantToCheck

대신에

parameter == whatIWantToCheck

?



13
@gnat 어떻게 지구상에서 복제본입니까?
Kilian Foth

13
응? 이 함수는 매개 변수 체인을 반환 this합니다.
Kilian Foth

11
@gnat 문제는 누군가가 스스로를 반환하는 것 외에는 아무것도하지 않는 함수를 작성하는 이유 입니다. 예, 메소드 체인을 허용하기 위해 특정 객체 또는 값을 반환 할 수는 있지만 그의 질문은 아닙니다. 그의 질문은 누군가가 왜 메소드 체인 관점에서 무언가를 작성 해야하는지입니다 .OP의 기능을 메소드 체인에서 벗어날 수 있으며 단일 차이를 만들지 않기 때문에 완전히 중복되고 불필요한 호출입니다. int getParam(int param) { //DO NOTHING return param; }
ZeroStatic

4
이것은 아마도 주제가 아니고 루아에는 적용되지 않지만 PHP에는 유효한 유스 케이스가 있습니다-구 버전에서는 new Foo()->method();유효한 구문이 아니었고 같은 구문 function with($what) { return $what; }; with(new Foo())->method();이 해결 방법으로 사용되었습니다.
DCoder

답변:


57

질문은 무언가에 추가 할 때마다 같은 가치를 얻는다면 숫자 0의 장점을 묻는 것과 같습니다. 항등 함수는 함수의 0과 같습니다. 그 자체로는 쓸모가 없지만 함수를 매개 변수로 사용하거나 결과로 반환 할 수있는 고차 함수를 사용하는 표현식의 일부로 유용한 경우가 있습니다. 대부분의 기능을 프로그래밍 언어가있는 이유 id또는 identity자신의 표준 라이브러리에 있습니다.

다시 말해, 편리한 기본 기능을 만듭니다. offset = 0기본 정수 로 설정하고 싶을 때와 같이 오프셋으로 아무것도 filterFunction = identity하지 않아도 필터가 아무것도하지 않더라도 기본 기능 으로 설정하는 것이 편리 할 수 ​​있습니다 .


필터 함수가 부울 값을 반환하지 않아야합니까? 이 경우 "zero"필터 함수는 true를 반환하는 함수입니다.
Kirill Rakhman

1
@cypressious 그러면지도 기능.
sapi

6
아니면 디자인 컨셉을 충실하기 : 널 객체 패턴 , 함수 에디션
blgt

@cypressious, 그 인수로 전달되는 술어에 대한 것 filter 고차 함수입니다. 1 차 filter함수의 유형은 다음 [a] -> [a]과 같습니다.
Karl Bielefeldt

예를 들어 C #에서는 다음을 사용합니다..OrderBy(x => x)
CodesInChaos

27

확실한. 절대적으로 필요한 곳에서 항목을 검색 할 수 있지만 모든 결과를 원하고 정확하게 저장된 대로 가져 오더라도 모든 쿼리에 대해 필터 기준과 출력 포맷터를 지정해야하는 외부 API를 상상해보십시오 .

그런 다음 데이터를 얻기 위해 사소한 "모든 것을 수락"하고 사소한 "변경되지 않은 상태로 되돌리기"기능을 개발해야합니다. wtr정확하게 사소한 의사 포맷터입니다. 해당 API를 많이 사용하는 경우 무언가를 쿼리 할 때마다 익명 함수를 작성하지 않고이 의사 헬퍼 함수를 ​​배치하는 것이 매우 유용 할 수 있습니다. ( 아무것도하지 않는다는 것을 즉시 알 수 있도록 하기 identity보다는 호출하는 것이 좋습니다 wtr.)


나는 아직 감각을 이해하지 못했지만 정확히 시나리오입니다. 나는 당신의 대답을 명심 하면서이 프로젝트를 진행하면서 잠시 후에 이해할 수 있다고 생각합니다. atm 그것은 나에게 쓸모가 없어 보인다. ... 만약 내가 rawdata를 얻었다면, 왜 rawdata를 다시 내게주는 함수를 원
할까

3
API가있는 경우 @Sempie 다시는 필요 서식 기능을 함수가 텍스트 아무것도하지 않는 경우, 변경되지 않은 텍스트를 얻을 수있는 유일한 방법입니다.
Doval

3
다시 말해 : 필터 / 포맷 인수를 전달 해야하는 함수가 있고 인수로 절대 사용할 수없는 경우 null빈 필터 함수를 'nothing'으로 필터링하면 프로그램이 더 이상 불평하지 않게됩니다.
ZeroStatic

3
@Sempie SQL 작업을 했습니까? WHERE조항을 포함하거나 포함하지 않는 방법을 알고 있습니까? 그것은 구문 상 설탕의 문제입니다. 본질적으로 WHERE조항이 없다는 WHERE것은 단지 앞서 나가서 모든 것을 허용 하는 조항이있는 것과 정확히 동일 합니다. SQL의 디자이너가 WHERE모든 것을 받아 들일 때조차 절을 내려 놓는 대신 절을 지정하지 않아도된다는 사실은 다소간 구문 설탕이며 간단한 편의를 위해 해당 옵션을 제공했습니다. ..
Panzercrisis

5
많은 경우 코드가 호출이 필요한지 여부를 결정하고 필요하지 않은 경우 코드를 결정하는 것보다 무조건 가상 메소드를 호출하거나 유용한 것을 수행하지 않을 수도있는 델리게이트를 무조건 더 신속하고 깨끗하게하는 것이 중요합니다.
supercat

15

다형성이 아닌가?

Qt에 대한 나의 경험 tr()wtr()방법은 텍스트의 현지화에 사용됩니다 ( Qt에 있음 ) Widget.

따라서 변경되지 않은 텍스트를 반환 하여이 방법은 다음과 같습니다 Widget does no localization (translation of the text) by default. Override this function to enable your own logic.


1
이것이 QT 일이라는 것을 몰랐습니다. 이것은 분명히 대답입니다.
Corley Brigman

8

이에 대한 가장 일반적인 경우는 '나중에 추가 된 기능'입니다. 그래서 프로그래머는 나중에 그 기능에 약간의 변화가있을 수 있다고 생각했습니다. 매개 변수 자체가 아닌 함수로 액세스하기 때문에 전역 적으로 쉽게 변경할 수 있습니다. 인덱스가 있다고 가정 해 보겠습니다.

function getIndex(index)
    return index
end

색인이 0에서 시작하기 때문에 이것은 모두 괜찮습니다. 나중에 다른 곳에서 구성 요소를 변경하면이 구성 요소는 인덱스를 1에서 시작하도록 변환해야합니다. 코드의 어느 곳에 나 수백 개의 index + 1을 추가해야합니다. 그러나 이와 같은 방법으로 간단히 말하십시오.

 function getIndex(index)
    return index+1
end

그리고 당신은 괜찮아요 이와 같은 기능은 과도하게 엔지니어링을 유발할 수 있지만 어떤 시점에서는 많은 의미가 있습니다!


2
예, OP에 의해 게시 된 함수의 doctstring은 이것이 그의 경우에 함수의 목적임을 시사 하지 않습니다 .
Mark Amery

6

이와 같은 스텁 기능은 유형 상속 상황에서 일반적입니다. 기본 클래스는 유용하지 않지만 파생 클래스는 입력으로 다양한 작업을 수행 할 수 있습니다. 기본 클래스에서 스텁 함수를 선언하면 모든 파생 클래스가 해당 이름의 함수 를 가질 수 있으며 개별 파생 클래스 이를보다 정교하고 유용한 것으로 대체 할 수 있습니다 .


5

하나의 추가 시나리오는 파이썬 및 C # 속성의 사용과 유사하지만 기능이없는 언어에서의 사용과 유사합니다.

일반적으로 클래스의 멤버로 무언가를 선언 할 수 있습니다. '이름'을 문자열로 가정 해 봅시다. 이것은 다음과 같이 액세스한다는 것을 의미합니다.

someobject.name

나중에 이름이 객체의 내용에 따라 달라져야한다고 결정합니다. 따라서 실제로 함수 여야합니다. 죄송합니다! 인수가 없어도 이제 액세스하는 모든 코드를 다음으로 변경해야합니다.

someobject.name()

그러나이 호출의 인스턴스가 많으면 그로 인한 문제가 발생할 가능성이 매우 낮습니다.이 변경 사항이 발생하지 않는 곳에서는 그 시점에 도달하면 프로그램이 중단됩니다.

C # / Python의 속성을 사용하면 속성이었던 속성 대신 함수를 대체하면서 속성을 변경할 수 있습니다. 미리 계획하지 않아도됩니다.

만약 당신의 언어가 그것을 가지고 있지 않다면, 당신은 미리 계획을 세워야하지만, 처음부터 아무 것도하지 않는 함수를 만들어서 사람들이 전에했던 것과 같은 방식으로 지원할 수 있습니다. 처음에는 재미있는 일이 없으며 제거 해야하는 것처럼 보이며이 유형의 많은 기능은 절대 변경되지 않습니다. 그러나 나중에 전화 Widget.wtr를 할 때마다 특수 문자를 제거해야 한다는 것을 알고 있다면 큰 문제는 아닙니다. 이미 기능이므로 추가하고 완료했습니다.

TL; DR 이것은 미래의 변화를 미리 계획하는 현명한 프로그래머 일 수 있습니다.


3
이 방법이 다른 것에 의존한다면 의미가 있지만, 그렇지 않습니다. 속성, getter / setter 또는 필드가 아닙니다. 현재 아무것도하지 않는 방법입니다. 그가 미래의 변화를 계획하고있는 유일한 방법은이 방법의 논리가 바뀌어야하는 것입니다.
Matthew Steeples

1
그럴 필요는 없습니다 ... 지금 당장은이 데이터를 처리하지 않지만 나중에 처리하고 싶다면 해당 데이터의 모든 사용자가 무료로 처리 된 데이터를 가져옵니다. 어리석은 예 : 문자열을 화면에 인쇄한다고 가정 해 봅시다 print data. 그런 다음 나중에 모든 문자열이 대문자 여야한다는 것을 알고 있습니다. 프로그램에서 모든 인쇄물을 찾아로 변경해야 print data.upper()합니다. 그러나 당신이 def cdata(data): return data있고 어디에서나 말 한다면, 당신은 print cdata(data)단지 변화 def cdata(data): return data.upper()하고 그것이 유일한 변화입니다.
Corley Brigman

무슨 말인지 알 겠어 그게 더 의미
마태 복음 첨탑에게

2

쓸모 없지는 않지만 실제로는 코드가 더 균일하고 유연하기 때문에 매우 유용 할 수 있습니다.

예를 들어 "모두"또는 "남성"또는 "여성"인 사람 만보고 싶은 경우 사용자 목록과 사용자가 선택할 수있는 드롭 다운 목록이 있다고 가정합니다.

"all"을 특수한 경우로 처리 할 수 ​​있으며,이 경우 명시 적으로 if와 if를 확인해야합니다. 또는 매개 변수 만 반환하는 필터 함수를 가질 수 있습니다 (예 : 모든 것이 통과되도록). "모두"사례에 사용되도록 할당되었습니다.


4
그것은 시나리오에 맞지 않습니다. 나는 그의 매개 변수를 반환하고 어떤 경우에도 다른 작업을 수행하지 않는 함수를 의미했습니다.
Sempie

@Sempie : 이것이 그가 말하는 것입니다. 당신이 있다면Filter 에 클래스 또는 인터페이스를 MaleFilter하고 FemaleFilter서브 클래스와 코드가 어떤 필터, 아무것도하지 않는 필터를 (변경의 매개 변수를 반환)가 필요합니다 당신이 처리하는 방법입니다 All. 이 함수는 아무 것도 수행하지 않지만 수행하는 것으로 대체 할 수 있습니다.
Magus

@Magus, 그러나 시나리오에서 함수는 일종의 자리 표시 자 중 하나이거나 나중에 대체되거나 이전 함수가 더 이상 사용되지 않지만 프로그램 에이 패스 스루가 필요하기 때문에 존재합니다. 어쨌든 핸드 오버가 아닙니다. 이 함수는 필터와 마찬가지로 변경되지 않은 매개 변수를 다른 함수에 제공하지 않고 호출 함수로 반환합니다.
Sempie

@Sempie 아니요, 임시 통과로 사용되는 것은 아닙니다. 유용한 코딩 (및 수학) 개념 인 "정체성"기능입니다. 그리고 "다른 함수"또는 호출 함수로 리턴하는지 여부에 관계없이 여전히 핸드 오버입니다. 키는 "식별"함수가 호출 함수에서 호출 할 수있는 많은 기능 중 하나 일 수 있으며 사용됩니다. 호출 된 함수가 아무것도 할 필요가없는 경우 if 및 특수 대소 문자를 피합니다.
Hejazzman 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.