자바.next:첫 번 째 부분-공통점


원본 주소:
Java.next: Common Ground
  
번역:
Eastsun
본문 은 자바 넥 스 트 시리즈 의 첫 번 째 부분 이다.이 부분 에서 나 는 자바 넥 스 트 의 언어 로 서 가지 고 있 는 공 통 된 특징 을 탐구 할 것 이다.
저 는'자바.next'의 대표 로 네 가지 언어 를 선 택 했 습 니 다.Clojure,Groovy,Jruby,그리고 Scala.언뜻 보기에 이 몇 가지 언어 는 매우 큰 차이 가 있다.Clojure 는 Lisp 사투리 입 니 다.Groovy 는'클래스 자바'로 서 의 선택 입 니 다.Jruby 는 Ruby 언어의 우아 함 을 가 지 는 동시에 Rails 가 가 져 온 장점 도 가진다.다른 것 과 달리 스칼라 는 정적 언어 가 가지 고 있 는 특징 을 가지 고 있다.
네가 예상 한 바 와 같이,이 언어 들 중 누가 가장 좋 은 변론 인지 에 관 한 많은 것들 이 있다.이렇게 많은 변론 이 있 는 이 유 는 어느 정도 공통점 이 많 기 때문이다.그것들 은 자바 언어 라 는 공 통 된 변천 배경 을 가지 고 있다.자바 언어 가 가지 고 있 는 장점 과 결함 은 이러한 언어의 디자인 방향 에 영향 을 미친다.
이 글 에서 나 는 다음 두 가지 측면 에서 이런 언어의 공통점 을 논술 하 는 데 중심 을 두 었 다.
  
☆지난 10 년 동안 우 리 는 가상 컴퓨터 를 바탕 으로 대상 을 대상 으로 하 는 언어 프로 그래 밍 에서 읽 기 쉽 고 유지 가능 한 응용 을 어떻게 개발 하 는 지 에 대해 많은 것 을 얻 었 다.자바.next 는 이러한 성 과 를 받 아들 여 이런 언어 들 이 형식 이 아니 라 문제 의 본질 을 더욱 중시 하 게 만 들 었 다.☆'본질 VS 형식'의 디자인 이념 으로 인해 프로 그래 밍 방식 이 크게 바 뀌 었 다.이런 관념의 변 화 는 예전 에 C/C+에서 자바 로 바 뀌 었 던 것 보다 더욱 크다.
나 는 자바 넥 스 트 가 가지 고 있 는 공 통 된 장점 을 다음 과 같은 8 가지 로 요약 한다.
●모든 대상●간결 한 속성 정의 방식●사용 하기 쉬 운 집합 류●함수 식 프로 그래 밍●연산 자 재 부팅●유지 가능 한 이상 처리●기 존 클래스 에 새로운 방법 추가●새로운 언어 구조 만 들 기
모든 것 이 대상 이다.
자바 에서 우 리 는 매 순간 대상 유형 과 기본 유형의 차이 점 에 직면 해 야 한다.이런 차 이 는 세 가지 실제 문 제 를 초래한다.
  
1.API 는 두 부 를 써 야 합 니 다.하 나 는 대상 유형 에 대한 것 입 니 다.기본 유형더 나 쁜 상황 은 여러 부 를 다시 써 야 한 다 는 것 이다.하 나 는 대상 유형 을 대상 으로 한 다음 에 모든 기본 유형 에 대해 각각 한 부 씩 써 야 한다.2.기본 수치 유형 은 범위 제한 이 있 습 니 다.경 계 를 넘 으 면 프로그램 이 기괴 한 형식 으로 중 단 됩 니 다.3.높 은 정밀도 유형(번역자 주:BigInteger 등 유형)에 대해 직관 적 인 수학 연산 자(+,-,etc.)를 사용 하여 조작 할 수 없습니다.
자바.next 에 서 는 모든 것 이 대상 입 니 다.너 는 모든 유형 에서 같은 문법 호출 방법 을 사용 할 수 있다.
; clojure
(. 1 floatValue)
1.0

// groovy
1.floatValue()
===> 1.0

# ruby
1.to_f
=> 1.0

// scala
1.floatValue
res1: Float = 1.0

간결 한 속성 정의 방식
자바 에 속성 을 만 들 려 면 도 메 인,Getter,Setter,그리고(보통)해당 하 는 구조 함 수 를 정의 해 야 합 니 다.모든 정 의 는 적절 한 방문 수식 어 를 필요 로 합 니 다.자바.next 에서 너 는 한 가지 공 을 다 할 수 있다.
; clojure
(defstruct person :first-name :last-name)

// groovy
class Person {
    def firstName
    def lastName
}

# ruby
Person = Struct.new(:first_name, :last_name)

// scala
case class Person(firstName: String, lastName: String) 

Getter,Setter 또는 구조 함수 가 필요 하 다 면 다른 부분 을 다시 쓰 지 않 아 도 됩 니 다.
그게 다가 아니 야.이 모든 언어 는 TMTOWTDI(There's More Than One Way To Do It)를 믿 기 때문에 위 와 같은 요 구 를 실현 할 수 있 는 방식 만 있 는 것 이 아니다.
용이 한 집합 류
자바.next 는 대부분의 중요 한 집합 류 에 편리 한 문법 을 제공 합 니 다:array 와 map.그 밖 에 함 수 를 매개 변수 로 일련의 조작 을 연결 시 켜 자바 의 명시 적 교체 나 순환 방식 을 사용 하지 않도록 할 수 있다.예 를 들 어 100 이내 의 기이 한 완전 제곱 수 를 찾 아 라.
; clojure
(filter (fn [x] (= 1 (rem x 2))) (map (fn [x] (* x x)) (range 10)))
(1 9 25 49 81)

// groovy
(1..10).collect{ it*it }.findAll { it%2 == 1}
===> [1, 9, 25, 49, 81]

# ruby
(1..10).collect{ |x| x*x }.select{ |x| x%2 == 1}
=> [1, 9, 25, 49, 81]

// scala
(1 to 10).map(x => x*x).filter(x => x%2 == 1)
res20: Seq.Projection[Int] = RangeMF(1, 9, 25, 49, 81)

해시 표(사전)에 대해 서도 똑 같이 편리 한 조작 을 하고 있다.
함수 식 프로 그래 밍
위의 집합 류 의 편리 한 사용 은 함수 식 프로 그래 밍 의 특수 한 상황 일 뿐이다.자바.next 에서 함 수 는 1 등 시민 으로서 함 수 를 매개 변수 로 하고 함 수 를 반환 값 으로 하 며 패 킷 을 닫 는 것 을 지원 합 니 다.간단 한 예 를 들 어:실행 할 때 지정 한 값 의 합 을 계산 할 수 있 는 함수 adder 를 만 듭 니 다.
; clojure
(defn adder [x] (fn [y] (+ x y)))

// groovy
adder = { add -> { val -> val + add } } 

# ruby
def adder(add)
  lambda { |x| x + add }
end

// scala
def sum(a: Int)(b: Int) = a + b

연산 자 과부하
자바 에 서 는 연산 자 를 다시 불 러 올 수 없습니다.그래서 당신 은 이렇게 BigDecimal 을 조작 할 수 밖 에 없습니다.

// Java math
balance.add(balance.multiply(interest));

자바.next 에서 연산 자 를 다시 불 러 올 수 있 습 니 다.이렇게 하면 당신 은 새로운 유형 을 만 들 고 내 장 된 유형 처럼 일 할 수 있 습 니 다.예 를 들 어 Complex Number 나 Rational Number 를 새로 만들어 서 지원+,-,*,/연산 자 를 만 들 수 있 습 니 다.

; Clojure
(+ balance (* balance interest))

// Groovy
balance + (balance * interest)

# JRuby
balance + (balance * interest)

// Scala 
balance + (balance * interest)

유지 보수 가능 한 이상 처리
검사 형 이상(Checked Exception)은 실패 한 시험 입 니 다.검사 형 이상 처리 코드 는 자바 코드 를 비대 하 게 만 들 고 문제 의 관건 을 가 렸 다.더 나 쁜 것 은 검사 형 이상 으로 코드 유지 가 어려워 졌 다 는 점 이다.
자바.next 는 검사 형 이상 을 밝 히 라 고 요구 하지 않 으 며,검사 형 이상 을 명시 적 으로 처리 하 라 고 요구 하지 않 습 니 다.이것 은 자바 플랫폼 의 다른 언어 가 자바 언어의 추악 한 검사 형 이상 을 완전히 피 할 수 있 음 을 나타 낸다.
기 존 클래스 에 새로운 방법 을 추가 합 니 다.
자바 에 서 는 기 존 클래스 에 방법 을 추가 할 수 없습니다.이 로 인해 대상 모델 을 황당 하 게 만 들 었 습 니 다.개발 자 는 도구 류 를 만들어 야 합 니 다.이것 은 OO 와 어 긋 납 니 다.

// Java (from the Jakarta Commons)
public class StringUtils { 
  public static boolean isBlank(String str) { 
    int strLen; 
    if (str == null || (strLen = str.length()) == 0) { 
      return true; 
    }  
    for (int i = 0; i < strLen; i++) { 
    if ((Character.isWhitespace(str.charAt(i)) == false)) { 
      return false; 
    } 
  }
}

자바.next 에서 기 존 클래스 에 추가 할 수 있 는 방법:

; Clojure
(defmulti blank? class)
(defmethod blank? String [s] (every? #{\space} s))
(defmethod blank? nil [_] true)

// Groovy
String.metaClass.isBlank = {
  length() == 0 || every { Character.isWhitespace(it.charAt(0)) }
}

# Ruby (from Rails)
class String 
  def blank? 
    empty? || strip.empty? 
  end 
end 

// Scala
implicit def strWrapper(s :String) = new {
    def isBlank = s.forall{ _.isWhitespace }
}

새로운 언어 구조 만 들 기
자바 는 자바 언어 와 API 라 이브 러 리 를 포함 합 니 다.이 두 부분 은 전혀 다 릅 니 다.새로운 API 라 이브 러 리 를 만 들 수 있 지만 새로운 언어 특성 을 추가 할 수 없습니다.
자바.next 에 서 는 API 라 이브 러 리 와 언어 특성 에 뚜렷 한 경계선 이 없다.핵심 언어 특성 처럼 새로운 언어 구 조 를 만 들 수 있 습 니 다.예 를 들 어 Clojure 는 and 함 수 를 제공 합 니 다.

; clojure
(and 1 2) => 2

네가 해결 해 야 할 것 이 반드시 이렇게 이원 화 된 문 제 는 아니다.대부분의 인자 가 true 로 돌아 갈 때 most 함수 가 필요 할 수도 있 습 니 다.Clojure 에는 이것 이 없 지만 직접 써 도 됩 니 다.

; clojure
(most 1 2) => true
(most 1 2 nil) => true
(most 1 nil nil) => false

여기 서 관건 은'내 언어 에 모스 트 조건 이 필요 한가?'가 아니다.분야 마다 수요 가 다르다.자바.next 에 서 는 언어 와 라 이브 러 리 의 경계 가 최소 화 되 어 있 으 며,반대 가 아 닌 적절 한 언어 특성 을 추가 할 수 있 습 니 다.
예 를 들 어 Ruby 의 attribute 문법 을 고려 합 니 다.

# Ruby
class Account
  attr_accessor :name
  dsl_attribute :type
end

  attr_accessor 는 Ruby 고유의 문법 입 니 다.dslattribute 는 내 가 쓴 라 이브 러 리 방법 입 니 다.할당 작업 을 할 때"="을 생략 할 수 있 도록 합 니 다.아래 와 같이:

# normal attributes
account.name = "foo"

# equals-free attributes
account.type checking

결론.
이 자바 넥 스 트 언어 들 은 상당히 많은 공통점 을 가지 고 있다.비록 나 는 고립 된 예 를 들 어 이러한 특징 을 설명 하지만,그것들 을 함께 사용 할 때 만 이 언어의 진정한 위력 을 나 타 낼 수 있다.자바.next 의 모든 특징 을 종합 하면 완전히 다른 인 코딩 방식 을 가 져 올 수 있 습 니 다.
  
★인 코딩 을 할 때 코드 의 테스트 와 적응성 을 위해 보수 적 인 방식 을 취 할 필요 가 없다.사용 류 공장,디자인 모델 과 주입 에 의존 할 필요 가 없다.대신 최소한 의 해결 방안 을 구축 하고 수시로 개선 할 수 있다.★자바.next 에서 당신 의 문제 에 더 적합 한 내부 영역 특정 언어(DSLs)를 개발 할 수 있 습 니 다.
나의 경험 으로 볼 때 이런 인 코딩 방식 은 코드 의 양 을 수량 급 으로 줄 이 고 코드 의 가 독성 을 높 일 수 있다.
많은 사람들 이'next big language'를 찾 고 있다.다음'big language'는 이미 여기에 있 지만 하나의 단독 언어 가 아니 라 하나의 개념의 종합 체 이다.자바 넥 스 트 에서 보 여 준 것 처럼.
자바.next 에 맞 는"big"라 는 칭호 로 넘 어 갈 까요?충분히 가능 합 니 다.나의 경험 에 따 르 면,일단 네가 변 화 를 하면,모든 단 계 는 학습 곡선 과 생산력 을 포함 하여 커 다란 발전 을 이 루 고 있다.
이 시리즈 의 후속 부분 에서 나 는 이 언어의 다른 점 을 토론 할 것 이다.

좋은 웹페이지 즐겨찾기