본문 바로가기

[한글화 시리즈-12] JUnit Rules JUnit Rules이 룰셋은 JUnit test를 사용할 떄 발생하는 다양한 문제점들에 관한 룰들을 포함한다. JUnitStaticSuiteJUnit test의 suite() 메소드는 public static 이어야 한다. (JUnit 3)import junit.framework.*; public class Foo extends TestCase { public void suite() {} // static을 붙이자 private static void suite() {} // public을 붙이자 } JUnitSpelling몇몇 JUnit framework의 메소드들은 오타를 낼 가능성이 높다.import junit.framework.*; public class Foo extends TestCase { .. 더보기
[한글화 시리즈-11] JavaBean Rules JavaBean Rules이 룰셋은 java bean에 관한 룰들을 포함한다. BeanMembersShouldSerializeBean 클래스이거나 간접적 혹은 Bean으로부터 직접적으로 참조된 클래스라면, 직렬화(serializable)는 꼭 필요하다. 클래스 맴버 변수들은 transient, static 으로 선언하거나, accessor 메소드들을 갖어야한다. 변수를 transient 선언 하는 것이 가장 쉽고 안전한 방법이다. 예로, 접근 메소드(accessor)들은 자바 명명 규칙을 따라야한다. 변수명이 foo라면, 접근 메소드들은 getFoo와 setFoo가 되어야 한다. *transient는 bean의 클래스 맴버 변수들 중 객체직렬화를 원치 않는 변수에 선언한다. private transien.. 더보기
[한글화 시리즈-10] Import Statement Rules Import Statement Rules이 룰셋은 클래스를 임포트 하는 룰을 포함한다. DuplicateImports중복된 import는 피해야 한다.//java.lang.String은 java.lang.* 패키지 import에 포함되어 있으므로, //중복된 import이다. import java.lang.String; import java.lang.*; public class Foo {} DontImportJavaLangjava.lang 페키지 내의 어떠한 것도 import 하는 것은 피해야한다. 해당 클래스들은 자동으로 import된다.// 기본적으로 String은 import되어 있으므로 import를 다시 할 필요 없다. import java.lang.String; public class Foo .. 더보기
[한글화 시리즈-09] Finalizer Rules Finalizer Rules이 룰셋은 finalizer에 관한 룰을 포함하고 있다. Effective Java에서는 여러가지 이유로 finalizer의 사용을 경고하고 있다. 정말 꼭 필요할 경우에만 사용하자. Java는 C가 아니다. 소멸자로 오인은 금물 EmptyFinalizer만약 finalize() 메소드가 비어있다면, 이 메소드는 존재할 필요가 없다.public class Foo { //비어있는 finalize() 존재 이유가 없다. protected void finalize() {} } FinalizeOnlyCallsSuperFinalize만약 구현된 finalize() 메소드는 supert.finalize() 호출과 함께 다른 작업들을 해야한다.public class Foo { protect.. 더보기
[한글화 시리즈-08] Design Rules(2) Design Rules(2)이 룰셋은 클래스 디자인 시 고려할만한 룰을 포함한다. AvoidSynchronizedAtMethodLevel메소드 단위의 동기화는 메소드 내에 새로운 코드가 추가되거나 할 경우 역효과를 낼 수 있다. 그러므로, 필요한 부분만 동기화 블록을 이용하는 것이 더욱 효율적이다.public class Foo { // 이런 방식은 피하자! synchronized void foo() { } // 선호되는 방식 void bar() { synchronized(this) { } } } MissingBreakInSwitchswitch 내의 case는 꼭 break;로 끝내자. 버그를 만드는 가장 쉬운 방법이다.public class Foo { public void bar(int status) {.. 더보기
[한글화 시리즈-07] Design Rules(1) Design Rules(1)이 룰셋은 클래스 디자인 시 고려할만한 룰을 포함한다. UseSingletonStatic 메소드들로만 이루어진 클래스와 같은 경우에 Singleton 패턴을 이용하여 구현해야 한다. 만약 Singleton 패턴을 이용하여 구현할 시에는 모든 메소드는 non-static 이어야 하며, 생성자는 private으로 접근제한하여 외부에서 객체 생성(instantiation)을 하는 것을 막아야한다. 하지만 abstract class에는 적용할 수 없다.//나쁜 예 //모든 메소드가 static 메소드이다. public class MaybeASingleton { public static void foo() {} public static void bar() {} } //좋은 예 //내부 .. 더보기
[한글화 시리즈-06] Coupling Rules Coupling Rules이 룰셋은 객체들과 패키지들 간의 부적절한 결합(coupling)에 관한 룰들을 포함한다. CouplingBetweenObjects이 룰은 한 객체 안에 유니크한 속성(unique attributes), 지역 변수들(local variables)과 반환 타입들(return types)의 숫자를 카운트 하며, 특정 한계점(기본 20개)을 넘은 너무 높은 수준의 객체간의 결합도를 경고한다.import com.Blah; import org.Bar; import org.Bardo; public class Foo { private Blah var1; private Bar var2; //많은 수의 imports들과 유니크한 객체들을 포함하여 결합도를 높이는 것은 좋지 않다. void Obj.. 더보기
[한글화 시리즈-05] Clone Implementation Rules Clone Implementation Rules이 룰셋은 clone() 메소드를 사용할 경우 고려해볼만한 룰로 구성되어 있다. ProperCloneImplementation객체의 clone() 메소드는 단순히 생성자로 객체를 생성하지 말고 super.clone()을 이용하여 implements해야 한다.//나쁜 예 class Foo implements Cloneable{ public Object clone() throws CloneNotSupportedException{ return new Foo(); // 단순히 new를 이용해서 생성하면 안된다. } } //좋은 예 class Foo implements Cloneable{ private String type; private String value; p.. 더보기
[한글화 시리즈-04] Code Size Rules Code Size Rules이 룰셋은 문제를 발생시킬 수 있는 코드 사이즈에 관한 룰을 포한한다. NPathComplexity메소드의 복잡성는 많은 량의 비순환적인 실행 문(acyclic execution paths)을 의미한다. 일반적인 한계점은 한 메소드당 200이며, 이 한계점을 넘은 복잡성를 줄일 필요가 있다. public class Foo { void bar() { //대량의 복잡한 코드 (200 paths 이상) } } ExcessiveMethodLength하나의 메소드가 과도한 기능을 수행하는 것은 이 룰을 위반하는 것이며, 메소드의 사이즈를 줄이기 위하여 메소드 내의 기능을 분산 위임하여 실행할 수 있는 helper methods를 생성하거나 복사 붙여넣기로 만든 모든 코드를 제거한다.pu.. 더보기
[한글화 시리즈-03] Braces Rules Braces Rules이 룰셋은 괄호에 대한 룰들을 정의한다. IfStmtsMustUseBraces조건절을 괄호없이 사용하는 것은 피해야 한다.public class Foo { public void bar() { int x = 0; if (foo) x++; //간결하지만 버그를 유발할 수 있다. } } WhileLoopsMustUseBraceswhile반복문도 괄호를 꼭 사용해야 한다.public void doSomething() { //버그가 발생할 수 있다. while (true) x++; } IfElseStmtsMustUseBracesif else 조건문은 반드시 괄호를 사용해야 한다.public void doSomething() { // 이것까지는 용인할 수 있다. if (foo) x++; // .. 더보기