Akashic Records

Powerful Fluent Interfaces is Now Easier than Ever: op4j 1.0 Released 본문

오래된글/Java

Powerful Fluent Interfaces is Now Easier than Ever: op4j 1.0 Released

Andrew's Akashic Records 2018. 4. 9. 13:06
728x90

op4j는 개발자를 행복하게 하는 도구라고 합니다. op4j는 Code에서 보조적인 부분인 테이터 변환, 구조적 반복, 필터링, 매핑 등을 깔끔하게 정리 할수 있게 해주어 품질을 향상시키고, 의미론적이며, 청결하고, 가독성 있는 Java Code를 만들수 있게 해주는 Java Library 입니다.(사이트에서 이렇다고 정의 하고 있습니다.)

op4j를 다운 받아 TestCode를 만들어볼까요?

목표 코드는 여러개의 문자형 날짜중 과거 날짜만 추려서 Calendar Object로 반환 하는 메소드를 만들어 봅니다.

먼저 op4j없는 코드를 구현 한다면

package com.naver.blog.inter999.op4j;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.LinkedHashSet;

import java.util.List;

import java.util.Set;

public class NonOp4j {

public Set<Calendar> getCalendar(List<String> list) {

Calendar now = Calendar.getInstance();

SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

Set<Calendar> set = new LinkedHashSet<Calendar>();

Date date = null;

for (String element : list) {

if (element != null) {

try {

date = dateFormat.parse(element);

} catch (ParseException e) {

e.printStackTrace();

}

Calendar calendar = Calendar.getInstance();

calendar.setTimeInMillis(date.getTime());

if (!calendar.after(now)) {

set.add(calendar);

}

}

}

return set;

}

}


주어지는 파라미터는 여러개의 날짜를 전달 받기 위해 문자열의 List 객체 입니다. 문자열은 날짜를 나타내며 "dd/MM/yyyy" 형태로 정의 되어 있습니다.

calendar.after(now)로 현재시각을 확인해서 과거 날짜만 Calendar로 변환하여 Set에 담아 반환 합니다.

이 Method에서는 한 번의 For문과 두 번의 IF문이 존재 합니다. 이것이 op4j에서 말하는 보조적인 코드에 해당 됩니다.

이코드를 테스트 하면

package com.naver.blog.inter999.op4j;

import java.util.ArrayList;

import java.util.Calendar;

import java.util.List;

import java.util.Set;

import org.junit.Assert;

import org.junit.Test;

public class HelloOp4jTestCase {

private static List<String> seedDate;

static {

seedDate = new ArrayList<String>();

seedDate.add("12/10/1492");

seedDate.add("6/12/1978");

seedDate.add("15/07/2045");

seedDate.add(null);

}

@Test

public void getNonOp4jCalendar() {

NonOp4j nop4j = new NonOp4j();

Set<Calendar> calendars = nop4j.getCalendar(seedDate);

Assert.assertNotNull(calendars);

Assert.assertNotSame(0, calendars.size());

for(Calendar cal : calendars) {

System.out.println(cal.getTime());

}

}

}


결과 출력:

Fri Oct 12 00:00:00 KST 1492

Wed Dec 06 00:00:00 KST 1978

너무 단순한 코드라 별 설명 하지 않겠습니다.

그럼 op4j를 사용하여 코드를 작성 해보도록 하겠습니다.

package com.naver.blog.inter999.op4j;

import java.util.Calendar;

import java.util.List;

import java.util.Set;

import org.javaruntype.type.Types;

import org.op4j.functions.Fn;

import org.op4j.functions.FnCalendar;

import org.op4j.functions.FnString;

import org.op4j.functions.Function;

public class UseOp4j {

public Set<Calendar> getCalendar(List<String> list) {

Calendar now = Calendar.getInstance();

Function<List<String>,Set<Calendar>> dateProcessFunction =

Fn.onListOf(Types.STRING).toSet().map(FnString.toCalendar("dd/MM/yyyy")).removeAllNullOrTrue(FnCalendar.after(now)).get();

Set<Calendar> set = dateProcessFunction.execute(list);

return set;

}

}


상당히 짧아진 코드를 볼수 있습니다. 특이한 것은 For문과 IF문이 보이지 않는다는 것입니다.

"Function<List<String>,Set<Calendar>> dateProcessFunction" 이 부분은 dataProcessFunction이라는 이름의 함수를 만드는데

이게 함수 Input 파라미터로 "List<String>"을 받고 결과 값은 "Set<Calendar>"로 반환 한다는 내용입니다.

"Fn.onListOf(Types.STRING).toSet()" LIst에서 String Type을 Set으로 변환 하여라.

"map(FnString.toCalendar("dd/MM/yyyy")).removeAllNullOrTrue(FnCalendar.after(now))" List의 각 항목을 하나 하나 변환 하는데 map의 ()안 조건에 충족한 경우에만 변환 한다.

"get()" 함수 실행 결과를 반환 한다.

테스트 코드는 NonOp4j와 동일 하니깐 여기 적지는 않겠습니다.

가독성 있고 각 메서드 나열이 언어적인 의미가 있는 것 같습니다만 아직은 생소하네요.

몇가지 예를 더 들어 볼까요?

op4j에서 문법 형식 은 아래와 같다고 나와 있습니다.


output = Op.on(input).[ACTION].[ACTION]...[ACTION].get();

function = Fn.on(inputType).[ACTION].[ACTION]...[ACTION].get();


Op.on은 실행할때 사용하고 Fn.on은 함수 정의에 사용합니다.


String[] values = ...;

List<String> upperStrs = Op.on(values).toList().map(FnString.toUpperCase()).get() Function<String[],List<String>>

upperStrsFunc =

Fn.onArrayOf(Types.STRING).map(FnString.toUpperCase()).toList().get();

...

String[] values = ...;

List<String> upperStrs = upperStrsFunc.execute(values);

op4j에서 ACTION은 모두 Chained Method입니다.

버전 1.0이 릴리즈 된 오픈소스 치고는 Document가 아주 잘 되어있습니다.

거의 대부분의 사용법에 대해서 나와 있는 것 같습니다.

저는 개인적으로 코드 가독성을 중요하게 생각 하기 때문인지 op4j가 마음에 드는 군요.

하지만 op4j을 저만 알고 잘 써봤자. op4j를 모르는 사람이 코드를 봤을 땐 난독증에 걸리겠지요.



728x90

'오래된글 > Java' 카테고리의 다른 글

Sampling & Testing JUnit  (0) 2018.04.09
Reqular Expression in XML  (0) 2018.04.09
non-blocking 소켓  (0) 2018.04.09
Nail 이미지 생성 클래스  (0) 2018.04.09
Lessons learned from getting .NET to REST with Java  (0) 2018.04.09
Comments