인수를 취하지 않고 아무것도 반환하지 않는 함수의 이름은 무엇입니까? [닫은]


80

Java 8 java.util.function패키지에는 다음이 있습니다.

  • 기능 : 하나의 인수를 취하여 하나의 결과를 생성합니다.
  • 소비자 : 하나의 주장을 취하고 아무 것도 생산하지 않습니다.
  • 공급자 : 논증하지 않고 하나의 결과를 산출합니다.
  • ... : 프리미티브, 2 개의 인수 등을 처리하는 다른 경우 ...

그러나 나는 " 논쟁을 취하지 않고 아무 것도 발생시키지 않는 "경우 를 다루어야한다 .

에 대한 내용은 없습니다 java.util.functionnal.

따라서 질문은 다음과 같습니다.

' 인수를받지 않고 아무것도 반환하지 않는 함수 '의 이름은 무엇입니까 ?

Java 8에서 그 정의는 다음과 같습니다.

@FunctionalInterface
public interface InsertANameHere {
    void execute();
}

Executor는 이미 존재하고 또 다른 목적이 있습니다 : " 제출 된 실행 가능한 작업을 실행하는 개체 ". 서명이 일치하지 않으며 ( execute(Runnable):void) 기능적인 인터페이스 도 아닙니다 .

Runnable 이 존재하지만 스레딩 컨텍스트에 강력하게 연결되어 있습니다.

  • 패키지는 java.lang아닙니다 java.util.function.
  • javadoc은 " Runnable 인터페이스는 인스턴스가 스레드에 의해 실행되도록 의도 된 모든 클래스에 의해 구현되어야합니다 "라고 말합니다.
  • "Runnable"이라는 이름은 스레드 내에서 실행중인 코드를 나타냅니다.

28
"하지만"논쟁은없고 아무것도 생성하지 않습니다 "에 대한 것은 없습니다." - Runnable ?
user11153

11
RunnableRunnable은 Thread( Executor예 :) 이외의 다른 클래스에서도 사용되기 때문에이 시점에서 javadoc 이 오래 되었다고 생각합니다 .
SpaceTrucker

13
즉, 의미하지 않는다 @superbob 그 Runnable에만 할 수 있습니다이야 .run()Thread의. 실제로 그들은 질문에 설명 된 목적을 위해 매우 일반적으로 사용됩니다.
blgt

5
@superbob 초기 목적 이었지만 Java 8부터 기능 인터페이스로 "개장되었습니다". 그래서 이것이 java.util.function 패키지 에서 아무것도 발견하지 못한 이유 입니다.
user11153

5
Semi-Snark : ImpureFuntion은 반드시 부작용에만 의존하기 때문에 그렇지 않은 경우에는 그렇지 않습니다. ( en.wikipedia.org/wiki/Pure_function#Impure_functions ) 좀 더 Seriosuly : 적어도 void 실행 ()의 의미와 일치하는 명령형 (일을 수행);
Kristian H

답변:


71

모든 arity에 대해 별도의 이름으로 그렇게하는 Java의 선택은 어리 석었습니다. 정확하게 에뮬레이션 할 가치가 없습니다. 그러나 일관성을 유지 해야 하거나 매우 일반적인 라이브러리 코드를 작성하는 경우 Konrad의 제안이 좋습니다. Procedure반지에 던질 수 있습니다 .

의사 기능 패러다임을 사용한다고해서 정상적인 명명 원칙이 적용되는 것은 아닙니다. 인터페이스는 거의 항상 무엇의 이름을 따서 명명해야 없는 몇 가지 일반적인 구문 아이디어 후. 함수가 실행 취소 스택에 배치되면 이름을 지정해야합니다 UndoFunction. GUI 이벤트에서 호출 된 경우 이름을 지정해야합니다 GUIEventHandler. 친구는 나쁜 명명 규칙을 영구히 유지하지 않습니다.


Procedure괜찮습니다. 문맥 상, 이런 종류의 "구조"를 처리해야하는 일반 라이브러리를 개발 중입니다.
superbob

18
나는 Procedure파스칼 시절을 좋아 합니다. A Procedure는 부작용이 있지만 a Function는 없습니다. 값을 반환하지 않기 때문에 부작용이있을 수 있습니다.
스펜서 Rathbun

내가 사용하는 경향 수 있습니다 ProcedureRIR<T1,T2>에 대한 void proc(T1, int, T2)다른 유형 마찬가지로, 그리고 - 아마 오히려 종류의 가능한 모든 조합에 밀어 넣는 것보다 수요 대부분을 생성.
supercat

1
실제로 실제 기능 프로그래밍은 일반적으로 헝가리어 스타일 명명을 권장하지 않습니다. 이것은 기능보다는 oo 패러다임의 정신입니다.
slebetman

3
If the functions are placed into an undo stack, they should be named UndoFunction.함수의 이름을 지정하는 것과 다른 유형을 제공하는 것에는 차이가 있습니다. 기능적인 스타일에서 당신은 만들 것이다 UndoFuncton지금 당신이 그것에 통과 할 수 없기 때문에 유형을 flip, curry, compose, filter, map내 의견 등을, 다른 arities과 다른 이름을 기능을 제공하는 자바의 결정은 바보 진짜 이유입니다. 물론, 부작용을 사용하려면 무엇이든 호출하십시오. 당신은 이미 창 밖으로 작곡을 던졌고 아마도 기능도 사용하지 않을 것입니다.
Doval

33

자바 세계에서는이라고 Runnable합니다. C # 세계에서는이라고 Action합니다.

그러나 더 큰 사물에 잘 맞는 더 나은 이름이 있습니다.

매개 변수가없는 void 기능 인터페이스 외에도 하나, 둘 이상의 인수를 허용하거나 값을 반환하는 비슷한 기능 인터페이스가 필요하다고 결정하면 나중에 더 크게 볼 수 있습니다. 이 경우 모든 엔티티의 이름이 동형이며 서로 일치하기를 원할 것입니다.

그래서 Java에는 Procedure다음과 같이 정의 된 함수 인터페이스가 있습니다.

public interface Procedure
{
    void invoke();
}

public interface Procedure1<T1>
{
    void invoke( T1 argument1 );
}

... (사진을 얻습니다.)

그리고 Function첫 번째 일반 매개 변수가 반환 유형 인 비슷한 방식으로 정의 된 s 라는 비슷한 인터페이스 세트가 있습니다 .

public interface Function<R>
{
    R invoke();
}

public interface Function1<R,T1>
{
    R invoke( T1 argument1 );
}

그래서 여기의 요점 Procedure은 더 큰 사물에 잘 맞기 때문에 아주 좋은 이름입니다. 나중에 인수를 허용하거나 값을 리턴하는 메소드와 유사한 기능 인터페이스를 사용하기로 결정한 경우이 인터페이스가 실행됩니다.

참고 : 나는 기본적으로"정상적인 명명 원칙은 창 밖으로 나가지 말아야한다"는 "칼리 빌레펠트 (Karl Bielefeldt)의 주장에 동의 한다." 그러나 그는 "거의 항상"허용합니다. 때로는 (필수 익명의) 절차와 기능이 필요할 수 있으며, 이것이 OP가 요구하는 것입니다.

개정 2017-11-10 :

당신은 Function1<R,T1>대신에 왜 물어볼 수 Function1<T1,R>있습니까? 어느 쪽이든 갈 수 있지만 왼쪽에서 반환 값을 선호합니다 .'convert-to '(source-to)와 반대로'convert-from '(소스에서 대상) 명명 규칙을 따르고 싶기 때문에 대상) 규칙. (실제로, 아무도 생각을 전혀하지 않았다는 의미에서, 협약보다 사고에 더 가깝습니다. 왜냐하면 그들이 전혀 생각을하지 않았다면 그들은 '전환'협약에 도착했을 것이기 때문입니다. )

나는 Joel Spolksy-잘못된 코드를 잘못 보이게 만드는 것에 대해 읽었습니다 . 매우 긴 기사이므로 전체를 읽는 것이 좋습니다.하지만 직접 사례로 건너 뛰려면 'TypeFromType'을 검색하십시오. TL; DR을 제공하면 아이디어는. myint = intFromStr( mystr )보다 훨씬 낫습니다 myint = strToInt( mystr ). 첫 번째 경우 유형의 이름이 관련 값에 가깝기 때문에 'int'가 'int'와 일치한다는 것을 쉽게 알 수 있습니다. 'str'은 'str'과 일치합니다.

따라서 확장하여 코드에 표시되는 방식으로 항목을 주문하는 경향이 있습니다.


1
이 솔루션은 정말 좋습니다. Java의 자체 공급 업체 인 Consumer, BiFunction보다 방 탄성이 더 뛰어납니다. 모든 것을 두 가지 개념으로 만 분류하기 때문입니다. @Karl Bielefeldt가 " 모든 바보에 대해 별도의 이름으로 그렇게하는 Java의 선택 "에 대해 대답 한 것을 상기시킵니다 . 유일한 단점은 프리미티브 유형과 그 조합 (DoubleToLongFunction, ToLongBiFunction 등의 재미있는 것들)을 처리하지 않는다는 것입니다. 그러나 원시는 또 다른 관심사입니다.
superbob

예. 기본적으로 제네릭을 프리미티브로 대체하기 시작하면 이는 실제로 성능에 관심 이 있다는 것을 의미 하므로 여기에 제시된 규칙에서 벗어나 사용자 정의 된 성능 향상을 위해 사용자 정의 된 이름을 사용하는 것이 좋습니다.
Mike Nakis

1
두 번째 답변을 수락 할 수 있다면 절차 N , 기능 N 제안 덕분에 귀하의 답변을 선택할 것 입니다. 나는 아직도 그것을 upvoted.
superbob

왜 그렇지 Function1<T1, R>않습니까?
ErikE

@ ErikE 그것은 매우 좋은 질문이며, 대답을 내 글을 수정했습니다.
Mike Nakis

18

왜 안돼 Command? 데이터가없고 데이터를 반환하지 않는다고 가정하지만 호출하면 효과가 있다고 가정하면 (그렇지 않으면 실제로 의미가 없을 것입니다.) 거의 유일한 일이라고 생각합니다.

말하자면, Action.NET 에는 일반적인 대리자가 있습니다. Java와는 달리 Consumer0에서 16까지의 인수를 사용할 수 있습니다. 다시 말해, 가장 간단한 버전은 아무 것도 필요하지 않습니다 . MSDN 참조 .

그리고 그 이름은 "소비"할 것이 없다는 것을 의미하지 않기 때문에, 좋은 이름 선택처럼 보입니다.


1
Command좋습니다. 명령 패턴 과 혼동 될 수 있지만 솔루션 일 수 있습니다.
superbob

7
나는 Action이상을 좋아한다 Command. 명령은 수신 및 평가되는 것과 비슷하지만 부작용에 대한 조치가 실행됩니다.
Bergi

7
음 ... 어떻게 할 수 없는 명령 패턴이 될? 당신은 정확하게 명령 엔티티를 구축했습니다! 그것은 심지어 전통적으로 명명 된 execute()방법을 가지고 있습니다. 0_o '
hijarian

1
일반적인 (그리고 좋은) Swing 인터페이스 인 Action의 제안을 싫어하십시오. 명령이 합리적입니다.
user949300

@ user949300 그러나 상황에 따라 다릅니다-Java는 당신이 보는 큰 세계입니다. 나는 Android 개발자입니다 (현재). 나는 J2EE 관련 특질이 없습니다.) 물론 선택한 명명 규칙이 충돌해서는 안된다는 것에 동의합니다. 프레임 워크에서 사용하는 것과 함께.
Konrad Morawski
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.