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

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”이라는 이름은 스레드 내에서 실행중인 코드를 나타냅니다.


답변

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

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


답변

자바 세계에서는이라고 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’과 일치합니다.

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


답변

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

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

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