스칼라의 매개 변수가없는 및 ​​빈 패턴 방법


10

나는 Odersky의 Programming Scala (2nd)를 통해 현재 Scala를 배우고 있습니다. 나는 10 장까지 올라가서 매개 변수가없고 비어있는 방법을 소개합니다. 난 그냥 내 머리를 얻을 수 없습니다.

지금까지 내가 이해하는 것은 방법에 부작용이 있고 매개 변수가없는 방법이 있으면 빈 병을 사용해야한다는 것입니다.

이 협약의 이점이 무엇인지 알 수 없습니다. Stack Exchange의 게시물을 읽었지만 솔직히 말해서 게시물 이이 주제에 대해 깊이 논의하기 시작했을 때 나는 잃어 버렸습니다.

이 언어 기능의 일반적인 사용 사례와 더 잘 이해하는 데 도움이되는 이점에 대한 간단한 설명을 찾고 있습니다.

scala 

답변:


14

나는 왜 컨벤션의 필요성을 막기 위해 언어를 디자인하지 않는지에 대한 질문을 받았습니다. 다시 말해서, 왜 스칼라는 프로그래머가 가끔 생략하지 않고 항상 괄호를 사용하지 않는가?

대답은 참조 투명성에 있습니다. 기본적으로 함수에 부작용이 없으면 프로그램 동작을 변경하지 않고 함수 호출을 결과로 바꿀 수 있습니다.

즉, 매개 변수 나 부작용이없는 함수는 의미 적 val으로 해당 함수의 리턴 값을 보유하는 것과 같습니다 . 이 속성으로 인해 클래스가 발전함에 따라 프로그래머는 val편의성 또는 효율성에 따라 함수 사용 또는 함수 사용 간에 전환 할 수 있습니다 .

괄호를 생략 할 수 있기 때문에 같은 코드를 호출하는 것은 함수인지 또는 queue.size이면 신경 쓰지 않아도됩니다 . 따라서 클래스 의 구현 자는 호출 코드를 변경하지 않고도 둘 사이에서 자유롭게 변경할 수 있습니다 (다시 컴파일해야한다고 생각하지만). 그것은 클래스의 공개 인터페이스를 안정화시킵니다. 예를 들어, 당신은 밖으로 시작 할 수 호출하여 기초에 잠재적 인 후 변경 A와 효율성의 이유.sizevalQueuequeue.sizesizeListO(n)sizeval

이 규칙은 부작용이있을 때 괄호를 제안하여이 클래스 멤버가 확실히 함수 호출이므로 참조에 투명 하지 않다는 것을 분명히 합니다 . 부작용을 일으키는 지 아는 코드를 호출하는 것이 중요하므로 반복해서 호출하는 것을 피할 수 있습니다. 그것이 함수인지 아닌지에 관심이 없다면, 그것이 아닌 것처럼 취급 할 수도 있습니다.


6

그것은 언어 디자인의 일부가 아닌 관습 입니다. 코드를 잘 이해하기 위해 코드를 작성한 후에 읽어야하는 사람들을 돕기 위해 이정표로 사용됩니다.

에서 메소드 호출에 스칼라의 스타일 가이드 :

스칼라는 arity-0의 메소드에서 괄호를 생략 할 수 있습니다 (인수 없음).

reply() 

// is the same as 

reply

그러나이 구문은 문제의 메서드에 부작용이없는 경우에만 사용해야합니다 (순전히 기능적). 즉, 호출 할 때는 괄호를 생략 할 수 queue.size있지만 호출 할 때는 괄호를 생략 할 수 있습니다 println().

규칙 을 종교적으로 준수하면 코드 가독성이 획기적으로 향상되고 주어진 방법의 가장 기본적인 작동을 한 눈에 훨씬 쉽게 이해할 수 있습니다. 단순히 두 문자를 저장하기 위해 괄호를 생략하려는 충동에 저항하십시오!

.NET에서 규칙은 코드를 실행하는 데 시간이 오래 걸리는 경우 (예 : 50ms 이상) 메서드 를 사용 하고 속성 (필수적으로 비어있는 빈 메서드)을 사용하지 않으면 (즉, 단순 조회) 사용하는 것입니다.

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