어제 clojure 스터디에서 다룬 내용인데 같이 공유해보면 재미있을 듯하다. 다음 소스 코드는 slipp 소스 코드 중의 일부인데 자바를 활용해 프로그래밍하다보면 자주 등장하는 부분이다. 다음 두 소스 코드에서 중복을 찾아보자.
public Set<SocialUser> findFacebookAnswerers() {
Set<SocialUser> answerers = Sets.newHashSet();
for (Answer answer : answers) {
if (answer.isFacebookWriter()) {
answerers.add(answer.getWriter());
}
}
return answerers;
}
public Set<Tag> getPooledTags() {
Set<Tag> pooledTags = Sets.newHashSet();
for (Tag tag : getTags()) {
if (tag.isPooled()) {
pooledTags.add(tag);
}
}
return pooledTags;
}
위 소스 코드에 무슨 중복이 있냐고 생각할 수 있다. 소스 코드의 중복을 찾고 clojure를 활용해 개선한 내용은 추후 댓글을 통해 이야기해보도록 하겠다. clojure를 활용하지 않더라도 자바를 활용해 중복을 제거할 수도 있다. 심심할 때 한번 도전해 보기 바란다.
0개의 의견 from FB
4개의 의견 from SLiPP
외부 반복자 사용에 의해서 아래 5가지 내용이 중복됩니다.
내부 반복자를 사용해서 중복을 제거할 수 있습니다. 여기서는 filter가 되겠네요.
sudo code 입니다.
spring camp에서 위 내용을 정리했어서 링크 하나 남깁니다 :) http://www.slideshare.net/DaewonJeong/scala-is-java8next
정식으로 만들어 봤습니다. (회의 중... ㅋㅋㅋ)
``` import java.util.*;
public class CollectionUtil { public static Set select(Iterable<? extends T> source, FilterFunc filter) { Set selected = new HashSet(); for(T item: source) if(item != null && filter.apply(item)) selected.add(item); return selected; }
}```
같은 내용인지는 모르겠지만, 나름 궁금해서.. 음. Predicate 를 별도로 구현하는 놈을 만든다 쳐도, isFacebookWriter() 나 isPooled() 와 같이 해당 도메인에 종속적인 메소드는 어케 처리해야 할까요? R/I는 아닐테고..아~
guava 내부 소스에 쓰셧길래 반복문도 클로져 느낌으로 바꿔 보긴 했는데 이것도 복잡하게 보이긴하네요 ㅋㅋ
의견을 남기기 위해서는 SLiPP 계정이 필요합니다.
안심하세요! 회원가입/로그인 후에도 작성하시던 내용은 안전하게 보존됩니다.
SLiPP 계정으로 로그인하세요.
또는, SNS 계정으로 로그인하세요.