2012-12-17 7 views
3

저는 스칼라 신참이지만 자바 배경을 가지고 있습니다. 스칼라 코드를 작성할 때스칼라. 너무 많은 작은 함수, 너무 많은 클래스?

은 같은 스타일 옵션 매개 변수를 처리하는 데 유용합니다 :

val text = Option("Text") 
val length = text.map(s => s.size) 

있지만, 각 s => s.size 내가 아는 한 새로운 Function1[A, B]을 제공합니다. 그리고 예 8에서 그러한 전환을하면 8 개의 클래스가 추가로 생깁니다. 폼을 바인딩 할 때 이러한 스 니펫을 매우 많이 사용합니다. 따라서 질문은 다음과 같습니다.

덜 사용하고 if 표기법으로 대체하거나 JVM에 중요하지 않은 클래스 플러드입니까? 스칼라 컴파일러는 어떤 종류의 마술을합니까?

업데이트하십시오 어쩌면 더 구체적인 예는 다음과 같습니다

case class Form(name: Option[String], surname: Option[String]) 
val bindedForm = Form(Option("John"), Option("Smith")) 
val person = new Person 
bindedForm.name.foreach(a => person.setName(a)) 
bindedForm.surname.foreach(a => person.setSurname(a)) 

는 두 개의 서로 다른 Function1[String, String] 클래스를 생성합니다? 그러한 전환이 수백 번이라면 어떻게 될까요?

+1

우리는 J2ME 응용 프로그램을 만들었을 때 클래스의 양에주의를 기울였습니다. 오늘이 점에 대해 신경 쓰지 마십시오. –

답변

8

Android 용으로 개발하는 경우 아마도 Dalvik을 사용하여 코드를 실행하게 될 것입니다.이 코드는 성가신 64k 메서드 제한이 있습니다 (비록 are ways around it). 각 클래스는 두 가지 메소드 (생성자 및 적용)가 필요하기 때문에 문제가 될 수 있습니다.

그렇지 않으면 Sun/Oracle JVM의 클래스가 PermGen 공간으로 이동합니다.이 공간은 꼭 필요한 경우 JVM을 시작할 때 조정할 수 있습니다. 정말로 중요하지 않습니다. 예, 많은 수의 클래스를 갖게 될 것입니다.하지만 수만 명이지만, JVM은 잘 처리 할 수 ​​있습니다 (적어도 기대하는 것에 대해 기꺼이 감안할 때). 비정상적인 제약이 따르게 될 가능성이 높다는 것을 알지 못하는 한, 이것은 당신이 많이 염려해야하는 것이 아닙니다.

모든 기능을 만드는 데 성능상의 불이익이 더 커지는 경우가 더 많을 수 있습니다. 그러나 실제로 해당 페널티에 대해 실행하고 있지 않다면 걱정하지 마십시오. 이것은 스칼라 컴파일러가 원칙적으로 고칠 수있는 것입니다. 그리고 항상 영리 해지고 있습니다. 그래서 그냥 코드를 관용적 인 방법으로 작성하면 큰 성능 문제가 아니라면 컴파일러가 저장해주기를 바랍니다. 적절한 기회가 주어집니다. 그리고 더 나은 기회가 될 경우에 대비하여 더 어색한 구조를 사용하는 정책을 채택하는 것보다 필요한 경우 성능을 위해 "올바른"방식으로 작성한 다음 리팩토링하는 것이 더 쉬울 것입니다. 문제가된다. 물론 미리 알 수있는 장소가 있습니다. 옵션으로 거대한 파일에서 읽은 각 바이트를 래핑하는 것과 같은 병목 현상이 될 수 있지만, 그런 뻔뻔한 것들은 제외하면 반응 적으로 행동하는 것이 좋습니다. 사전에 폐쇄를 피하는 것보다 알려진 문제.

+0

그리고 java8과 같이 permgen이 제거되었습니다. 그래서 그냥 힙에 들어갑니다. – jilen