언어 구문에 대해 쓰고 있습니다. 메소드 이름 내에 매개 변수가 배치되는 언어가 있습니까?


29

자바 스크립트에서 :

function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
   // Some code here.
}
getTopCustomersOfTheYear(50, 2010);

C #에서 :

public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers, 
 int whichYear)
{
   // Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);

PHP에서 :

public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
   // Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);

이 구문을 지원하는 언어가 있습니까?

function GetTop(x)CustomersOfTheYear(y)
{
    // Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);

보다 의미적이고 읽기 쉬운 함수 작성 형식이 아닙니까?

업데이트 : 이 질문을하는 이유는 새로운 언어에 대한 새로운 구문에 대한 기사를 쓰고 있기 때문입니다. 그러나 메서드 선언을위한 이러한 구문을 사용하면 개발자에게 더 친절하고 친숙 할 수 있으며 자연어에 더 가깝기 때문에 언어 학습 곡선이 줄어들 것이라고 생각했습니다. 이 기능이 이미 고려되었는지 여부를 알고 싶었습니다.


12
일단 관용구에 익숙해지면 읽기가 더 쉬울 수 있지만, 올바른 파서를 작성하는 것이 어려울 것 같습니다.
메이슨 휠러

2
"자리 표시 자"는 무엇을 의미합니까? 마지막 코드 예제는 Objective-C와 SmallTalk를 연상 시키지만이 질문은 제시된대로 이해하기 어렵습니다.
greyfade

3
AFAIK 스몰 토크는 같은 독점적으로이 구문을 사용하여 첫 번째 언어이었다 'hello world' indexOf: $o startingAt: 6Rectangle width: 100 height: 200. Btw.,이 질문에 무슨 문제가 있습니까?
maaartinus

8
괄호를 움직이면 returnValue = GetTop(50, CustomersOfTheYear(2010))다음과 같이 나타납니다 . 이것은 똑같이 읽을 수 있고 실제로 더 유연 / 직교합니다. ... 그렇습니다. 평범한 일반적인 문법입니다.
dagnelies

2
@arnaud : 전적으로 동의합니다. 제안 된 구문은 분해가 부족한 해결 방법 일뿐입니다.
back2dos

답변:


41

예, 그렇습니다 그렇습니다. 그런 언어가 있으며, 많은 사람들이 일단 익숙해지면 더 읽기 쉽습니다.

Objective-C에서 방법은 다음과 같습니다.

- (NSArray*)getTop:(int)count customersOfTheYear:(Year)year;

실제로는 잘 읽히지 않는 꽤 잘 고안된 예제이므로 실제 코드에서 더 나은 예제가 있습니다.

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

빨강, 녹색, 파랑 및 알파 값을 사용하여 새 UIColor 인스턴스를 반환하는 메서드의 프로토 타입입니다. 당신은 이것을 다음과 같이 부를 것입니다 :

UIColor *violet = [UIColor colorWithRed:0.8 green:0.0 blue:0.7 alpha:1.0];

Objective-C Programming Language 에서 매개 변수가 산재 된 메시지 이름에 대해 자세히 알아보십시오 .


16
Objective CI에서 처음으로 그것에 대해 읽었을 때 그것이 영리하다고 생각했지만 실제로 는 매개 변수 이름 이 더 뻣뻣하고 관리하기가 더 어려워졌습니다. 그 외에도 좋은 대답입니다.
ZJR

2
메소드가 어떻게 호출되는지에 대한 예제는 잘못되지 않을 것입니다.
greyfade

3
@ZJR는,에도 불구하고 반대 위키 백과의 의견 ,의 Obj-C의 스타일은 같은 명명 된 매개 변수,하지만 서로 다른. 위의 예제에서 메소드 이름은 다음과 같습니다 +colorWithRed:blue:green:alpha:. 내가 방법을 일치하는 매개 변수 이름을 사용하는 일이,하지만 난 쉽게 사용할 수도 r, b, g,와 a. JavaScript 오퍼와 같은 명명 된 매개 변수를 사용하면 주어진 실제 이름을 사용하여 값에 액세스합니다. 실명 매개 변수는 일반적으로 임의의 순서로 제공 될 수 있으며 매개 변수는 선택적 일 수 있습니다. 예, 비슷하지만 근본적으로 다릅니다.
Caleb

2
나는 파이썬을 생각했다 : color(r=0xFF,g=0xFF,b=0x55)또는 color(b=0x32,r=0x7F,a=.5,g=0xFF)등등. 그런 다음 이름매우 높은 매개 변수를 호출 해 봅시다 . :)
ZJR

3
@ZJR, 파이썬 예제가 옳습니다. 이것이 바로 "명명 된 매개 변수"라고 부르는 것입니다. Obj-C는 실제로 당신에게 전혀 그것을주지 않는다고 말하고 있습니다. 구문은 보이는 방법은 부분으로 분리되어 있기 때문에 자바 스크립트의 명명 된 매개 변수처럼 많이, 각 부분은 콜론을 가지고 있지만 정말 전혀없는 것을 . Obj-C의 이름은 메소드 이름의 일부이며, 구현에서 매개 변수를 참조하는 데 사용할 수있는 이름이 아닙니다. 주문 문제; 매개 변수는 선택 사항이 아닙니다. 아마 우리는 아마 더 이상 동의하지 않을 것입니다.
Caleb

25

답 : 스몰 토크

http://en.wikipedia.org/wiki/Smalltalk

'hello world' indexOf: $o startingAt: 6 자바와 같다 "hello world".indexOfStartingAt(o, 6)

Rectangle width: 100 height: 200 자바와 같다 new Rectangle(100, 200)

구문은 ... expression word1: parm1 word2: parm2 word3: parm3 ...호출 된 메소드의 이름은 모든 단어의 연결입니다.


17

" 유창한 인터페이스 (이것은 원래 @Jesper가 작성한"응답 "에 대한 의견을 제기 함)라는 추상화를 찾고 있다고 생각합니다 ." 이 공통 패턴은 많은 언어로 성공적으로 구현되었으며 Objective-C는 단 하나입니다.

다음은 매우 깨끗한 예입니다.

Person bo = new Person();
bo.Set.FirstName("Bo").LastName("Peep").Age(16).Size("Little").LostHerSheep();

이 같은이 구현 될 수있는 방법을 볼 수 있습니다 랜디 패터슨유창 인터페이스를 디자인하는 방법 .

Andre Vianna는 간략한 역사를 보여준 다음 유용한 정보를 포함하여 두 가지 기사로 가능한 구현에 대해 논의합니다. Vianna는 Smalltalk 80 에서 처음으로 " 캐스 케이 딩 (cascading )" 이라고 했던 이전의 아이디어를 지적 하며, 같은 메시지로 여러 메시지를 보낼 수있게했습니다. 다음과 같이 보였습니다 :

aThing one: 'one';
  two: 'two';
  other.

이후 "로 진화 계단식 방법 체인 우리가", " 수정 방법은 여러 수식어가 하나의 식으로 호출 할 수 있도록하는 것이, 호스트 개체를 반환합니다. "방법은 나중에이 될 자란 체인 유창 인터페이스 자주 오늘날 우리가 알고있는 개념과 사용 . 당신이 할 계획은 매우 비슷합니다.

Ayende Rahien"유창한 인터페이스"가 "메소드 체인"과 어떻게 다를 수 있는지에 대해 설명합니다 .

유창한 인터페이스는 일반적으로 BDD (행동 중심 개발)에 사용되는 일부 새로운 도구에서 볼 수 있으며 새로운 Constraint-Based Assert Model 에서 주요 .NET 단위 테스트 도구 인 NUnit 에도 적용되었습니다 .

이러한 기본 접근 방식은 Ruby, Python, C #, Objective-C 및 Java를 포함한 다른 언어로 구현되었습니다 . 비슷한 것을 구현하려면 체인과 유창성에 매우 근본적인 " 폐쇄 "라는 개념에 대해 연구하고 싶을 것입니다 .

아마도 이러한 모델을 개선 할 수 있습니다. 이것이 우리가 새로운 언어를 얻는 방법입니다. 그럼에도 불구하고, 메소드 체인과 유창한 인터페이스를 완전히 이해하면 아이디어를 발전시킬 수있는 좋은 출발점이 될 것입니다!


2
가독성을 높이기 위해 예제를 추가하고 단어를 다시 작성하는 것이 도움이 될 수 있지만 지금까지 대부분의 조사 된 답변에 +1했습니다.
haylem

@haylem, 다시 돌아가서 예제를 좀 더 자세하게 작성해 주셔서 감사합니다!
존 토 블러

3
유창한 스타일에 대한 설명이 좋았 기 때문에 반대 의견이지만, 실제로 OP가 요구하는 것은 아닙니다. 내가 읽을 때, 질문은 단일 함수 또는 메소드 이름의 일부와 매개 변수를 산재하는 것과 관련이 있습니다 . 제안 된 함수 선언에 유의하십시오 function GetTop(x)CustomersOfTheYear(y). 이 함수는 단일 함수이며 서로 다른 두 함수에 대한 호출을 연결하지 않습니다.
Caleb

@ Caleb 나는 여기 에서이 매개 변수가 유창한 인터페이스 (이 답변) 또는 명명 된 매개 변수 (또 다른 답변)를 수행 할 수없는 방법이라고 지적하려고합니다. 지금까지 나는 유창한 인터페이스 / 명명 된 매개 변수가 더 잘 수행 할 수 없다는 이점을 보지 못했습니다.
이즈 카타

16

Objective-C가 그렇게합니다. 다음은 일반적인 프로토 타입입니다.

- (void) areaWithHeight: (float) height andWidth: (float) width;

이러한 메소드를 호출하는 방법은 다음과 같습니다.

float area = [self areaWithHeight: 75 andWidth: 20];

Objective-C는 주로 Mac OS X 용 Cocoa 및 iOS 용 Cocoa Touch와 함께 사용되지만 gcc는 gcc가 작동하는 거의 모든 플랫폼에서 Objective-C 코드를 빌드합니다.


글 머리 기호는 하이픈이어야합니다. 답변 텍스트의 하이픈이 마크 업으로 간주됩니다. Objective-C의 하이픈은 객체에 속하는 메소드 ([foo bar : x])를 선언하는 데 사용됩니다. 여기서 foo는 객체 또는 클래스 인스턴스입니다. 더하기 부호는 클래스 메소드에 사용되며 C ++은 정적 멤버 함수입니다.
마이크 크로포드

13

공통 lisp에서 다음과 같은 함수에 키워드 인수를 정의 할 수 있습니다.

(defun area (&key width height)
    (* width height))

이 함수는 다음과 같이 호출됩니다.

(area :width 2 :height 3)

Ada에서는 특별한 선언이 필요하지 않습니다. 인수를 순서대로 나열하거나 다음과 같이 인수의 이름을 지정하여 다른 프로시 저나 함수를 대신 호출 할 수 있습니다.

a := area(width => 2, height => 3);

마지막으로 부스트 라이브러리에는 C ++에 기능을 추가하기위한 해킹 계층이 포함되어 있습니다. http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html


5

이름을 찾을 수 없었지만 비슷한 기능을 수행하는 디자인 패턴이 있는데, 함수 호출은 설명대로 수정 된 새 객체를 반환합니다. 예를 들면 다음과 같습니다.

query = db.getTopCustomers(50).forYear(2010);

데이터가 관리하기 어려운 복잡성을 피하기 위해 데이터가 매우 직교해야하기 때문에 자주 사용되지는 않지만 올바른 환경에서 유용 할 수 있습니다.


6
이를 유창한 인터페이스 디자인 스타일 이라고합니다 .
Jesper

@ Jesper, 내가 보는 것은 jQuery 체인과 매우 유사합니다. 내가 맞아?
Saeed Neamati

예, @Saeed, jQuery는이 스타일을 사용합니다.
Karl Bielefeldt

5

파이썬에는 키워드 매개 변수가 있습니다. 함수 정의 예

def getTopCustomers(count,year):
...

함수 호출 예

x = getTopCustomers(year=1990, count=50)

(이것은 원래 질문의 정신에 있지 않다는 것을 이해하지만 lisp의 키워드 매개 변수가 자격이되면 그렇게합니다. Smalltalk 및 Objective-C에서 인수 사이의 키워드는 실제로 함수 이름 / 조회의 일부입니다 .)


저는 개인적으로 이것을 더 좋아합니다. 이것은 매개 변수의 순서를 알고 있다면 매개 변수 이름없이 함수를 호출하는 옵션을 제공합니다.
Pablo Mescher

4

Agda에는 mixfix 표기법이 있습니다

if_then_else x y z = case x of
                     True -> y
                     False -> z

 if cond then x else y

함수의 이름이 밑줄로 표시 될 때마다 사이에 인수를 사용하여 두 부분으로 나눌 수 있습니다


4

하지 프로그래밍 언어이지만 그 자체 , 오이는 공백을 포함 할 수 있으며, 영어처럼 보이게하기위한 것입니다 함수 이름의 중간에서 매개 변수를 사용합니다.

'함수'는 루비에서 정의됩니다.

# definition
Given /^I calculate (.*) times (.*)$/ do |x, y|
    @result = x.to_i * y.to_i
end

Then /^the result should be (.*)$/ do |v|
    @result.should == v.to_i
end

# usage
Scenario:
    Given I calculate 6 times 9
    Then the result should be 42

4

TeX에서는 "인수 패턴"을 갖는 매크로를 정의 할 수 있는데, 이는 기본적으로 호출 프로토콜이 자유 롭다는 것을 의미합니다. 구체적인 예를 들어,

\def\getTopCustomers#1OfTheYear#2;{%
  The #1 top customers of the year #2.
}
\getTopCustomers 50 OfTheYear 2010;

;레지스터를 가지고 노는 것에 동의하면 다음을 제거 할 수도 있습니다 .

\newcount\customers
\newcount\year
\def\getTopCustomers#1OfTheYear{%
  \customers#1\relax
  \afterassignment\reallyGetTopCustomersOfTheYear
  \year
}
\def\reallyGetTopCustomersOfTheYear{%
  The {\the\customers} top customers of the year {\the\year}.
}
\getTopCustomers 50 OfTheYear 2010

TeX를 사용하면 어휘 분석기를 재구성 \afterassignment할 수 있으며, 위에서 사용한 매크로 덕분에 내장 프로 시저를 사용 하여 어휘 수를 지정할 수 있습니다. 매우 간결한 호출 프로토콜 을 정의하는 것이 매우 유용 합니다. 예를 들어, 테이블의 마크 다운 표기법을 이해하는 TeX 매크로를 작성하는 것은 매우 그럴듯합니다.

이제“TeX에서 고객이 저장되어있는 데이터베이스에 어떻게 액세스합니까?”라고 질문하지만 이것은 또 다른 질문입니다. :)

일반적인 lisp에서, query당신이 쓸 수 있는 매크로 를 정의하는 것이 가능합니다.

(query getTopCustomers 50 OfTheYear 2010)

여기서 getCustomers 및 OfTheYear는 기호로 해석됩니다. 그런 다음 매크로를 이해하는 것이 매크로의 역할입니다. 매크로 시스템은 응용 프로그램에 맞게 조정 된 의사 언어를 쉽게 만들 수 있기 때문에 일반적인 lisp는 코드 가독성 영역에서 우수합니다. (응용 프로그램 언어라고합니다.)

추신 : 아무도 C ++을 인용하지 않은 것 같습니다. (전 처리기없이) 얻을 수있는 가장 가까운 것은

query.getTopCustomers(50).OfTheYear(2010):

트릭은 구현 getTopCustomers하는에 대한 참조를 반환하도록하는 queryOfTheYear입니다. 이 예제를 작은 쿼리 언어로 만들 수 있지만 최종 속성을 확인하거나 (값을 반환) finalise메서드를 추가해야합니다 (조회 수행 및 값 반환). 느낌이 들면 STL의 스트림 컨트롤러를 모방하고 다음과 같은 것을 쓸 수 있습니다.

query << getTopCustomers(50) << OfTheYear(2010) << flush;

그러나 이것은 다시 응용 언어의 방향으로 가고 있습니다.

편집 : @han 답변을 간과했지만 Common Lisp 및 C ++ (Tex는 제외)도 인용했습니다.


2

JavaScript 또는 클로저를 지원하는 다른 언어에서 다음 과 같은 함수를 카레 할 수 있습니다 .

function getTopCustomersFunc(count) {
    return function(year) {
       // run some query, return count customers from year
    }
}
var top20Func = getTopCustomersFunc(20);
var top20Customers2005 = top20Func(2005);
var top20Customers2008 = top20Func(2008);

1
+1 이것은 흥미 롭기 때문에 top20Func의 '20'은 더 이상 매개 변수가 아니라 매개 변수를 상기시키는 이름의 일부라는 것을 기억하십시오. 당신은 쉽게 말할 수 있습니다 : var top5Func = getTopCustomersFunc(37);. '5'는 여기에서 오해의 소지가 있지만 코드는 변수가 이름이 지정된 것처럼 정확하게 작동합니다 top37Func.
Caleb

1

이는 "언어"의 정의에 따라 다르지만 로봇 프레임 워크 테스트 프레임 워크를 사용하면 이런 방식으로 키워드를 정의 할 수 있습니다. 의 설명서에서임베디드 인수 :

Select ${animal} from list | Open page | pet selection
                            | Select item from list | animal_list | ${amimal}

위의 내용은 "$ {animal} '이 매개 변수 인"select $ {animal} from list "라는 새 키워드 (기본적으로 함수)를 선언합니다. 당신은 "목록에서 고양이를 선택"처럼 호출


이것은 SQL 문처럼 보입니다. +1
Saeed Neamati 4:25에

1

알립니다 7.

To create (employee - a person) being paid (salary - a number):
    say "Welcome to your new job, [name of employee]!";
    choose a blank row from the table of employees;
    now the paid entry is the salary;
    now the name entry is the name of the employee.

등등.


3
이것은 언어의 구문이 어떻게 작동하는지 정확하게 설명하지는 않습니다. 많은 사람들이 정보 언어에 익숙하지 않으며 코드의 다른 영역에서 호출 또는 사용과 매개 변수를 구별 할 수 없습니다.

나는이 언어에 흥미가있다. 정교화되지 않은 코드 샘플만으로는 대답이 다소 짧았지만 OP에서 제공 한 샘플도 그렇습니다 (보다 일반적인 언어 임에도 불구하고). Wiki 는 그것에 관한 좋은 기사를 가지고 있습니다.
YoYo

0

Common Lisp의 키워드는 이미 언급되었지만 Common Lisp의 매크로는이를 매우 쉽게 허용합니다.

(defmacro get-my-element (from list at index)
  `(nth ,index ,list))

그러면 다음과 같이 호출 될 수 있습니다.

(get-my-element from '(a b c) at 1) ;returns B

주의 할 점은, 그러나, 조건 있다는 것입니다 from및이 at적용되지 않습니다. 거기에 무언가 가 있어야합니다. 완전히 건너 뛰는 것은 오류이지만 매크로는 그냥 버릴 수 있기 때문에 가독성을 넘어서는 것은 중요하지 않습니다 (중요).

(get-my-element from '(a b c) 3 1) ;also returns B

-2

Clojure에서는 다음과 같은 상황에서 키워드 인수를 사용하는 것이 일반적입니다.

(get-customers :top 50 :year 2010)

키워드 인수는 상당히 융통성이 있으며 선택 사항이며 기본값을 지정할 수 있습니다.


-4

파이썬에서 이것을 에뮬레이션 할 수 있습니다. 예를 들어

def GetTop(customers, ofYear):
  #write some code here to get the customers

print GetTop(customers=50 ofYear=2010)

또는

def GetTop(**args):
  #write some code here using the same parameter names as above

print GetTop({customers: 50, ofYear: 2010})

1
두 번째 예의 구문이 잘못되었습니다. 또한 누군가가 이미 이것을 게시했습니다.
Winston Ewert

이것은 단지 3 년 전에
포지셔닝 된
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.