메서드가 상수를 반환하면 안됩니다
항상 동일한 상수 값을 반환하는 메서드를 만들어 메서드 호출로 인한 오버헤드를 발생시킬 이유가 없습니다
이런 코드는 코드를 읽는 사람이 ‘메서드가 뭔가 다른 업무를 하는 것인가?’ 하는 착각을 하게 만들어 더더욱 안좋습니다.
차라리 상수를 사용해주세요.
이 규칙은 상수를 반환하는 코드만을 갖는 메서드가 있을 때 문제임을 알립니다.
규칙을 어긴 코드
int getBestNumber() {
return 12; // 규칙을 어긴 코드
}
규칙을 준수한 코드
static final int BEST_NUMBER = 12;
예외
@Override이나 @RequestMapping같은 어노테이션을 사용하는 ...
내부 클래스에서만 호출되는 "private" 메서드는 해당 내부 클래스로 이동해야 합니다
private 메서드가 내부 클래스에서만 호출되면 해당 내부 클래스로 이동시키지 않을 이유가 없습니다.
그렇게해도 바깥 계층의 클래스 멤버들이 여전히 동일한 접근 권한을 갖습니다.
게다가 코드는 훨씬 명확해지고 덜 혼란스러워질 겁니다.
규칙을 어긴 코드
public class Outie {
private int i=0;
private void increment() { // 규칙을 어긴 코드
i++;
}
public class Innie {
public void doTheThing() {
Outie.this.increment();
}
}
}
규칙을 준수한...
레이블은 사용되선 안됩니다
레이블은 Java에서 일반적으로 사용되지 않으며 많은 개발자가 작동 방식을 이해하지 못합니다.
게다가 레이블을 사용하면 제어 흐름을 따라가기 어렵게 만들어 코드의 가독성을 해칩니다.
규칙을 어긴 코드
int matrix[][] = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
outer: for (int row = 0; row < matrix.length; row++) { // 규칙을 어긴 코드
for (int col = 0; col < matrix[row].length; col++) {
if (col == row) {
continue oute...
의미없이 괄호를 중복해선 안됩니다
괄호가 사용할 필요가 없는 경우에 괄호를 사용하면 작업 순서를 더 명확히 할 수 있습니다.
하지만 괄호를 중복해서 사용하는 것은 오해의 소지가 있으므로 제거해야 합니다.
규칙을 어긴 코드
int x = (y / 2 + 1); // 컴파일러에 의해 괄호가 필요 없는 경우지만 이건 괜찮습니다
if (a && ((x+y > 0))) { // 규칙을 어긴 코드
//...
}
return ((x + 1)); // 규칙을 어긴 코드
규칙을 준수한 코드
int x = (y / 2 + 1);
if (a && (x+y > 0)) {
//...
}
return (...
암시적 문자열 및 바이트 연결이 혼동되어서는 안 됩니다.
Python은 컴파일 시에 인접한 문자열 또는 바이트 리터럴을 연결합니다. “a” “b”는 “ab”와 동일하다는 의미입니다. 이것은 때때로 긴 문자열을 여러 줄로 분할하는 데 사용됩니다. 그러나 암시적 문자열 연결도 매우 혼란스러울 수 있습니다.
다음 문맥에서는 쉼표를 잊어버렸음을 나타낼 수 있습니다.
두 문자열이 같은 줄에 있을 때는 잘못된 형식의 튜플처럼 보입니다. 괄호는 필수적으로 작성할 필요가 없으며 쉼표만 작성할 수 있습니다.
문자열이 list, set 또는 tuple에 있을 때.
규칙을 어긴 코드
def func():
return "item1" "item2" # 규칙을 어긴 코드
...
함수 매개변수의 기본값을 수정하거나 할당하면 안됩니다.
Python에서 함수의 매개변수는 기본값을 가질 수 있습니다. 이 기본값은 함수가 정의될 때 실행되는 표현식입니다(즉, 단 한번). 함수가 호출될 때마다 동일한 기본값이 사용되므로 수정하면 이후의 모든 호출에 영향을 미칩니다. 이것은 매우 혼란스러운 버그를 만들 수 있습니다.
변경 가능한 기본값을 다른 객체에 저장하는것도 좋지 않습니다(예: 속성으로). 그러면 여러 인스턴스가 동일한 값을 공유하고 하나의 개체를 수정하면 모든 객체가 수정됩니다.
이 규칙은 다음과 같은 경우에 문제를 야기합니다.
기본값은 함수에서 수정되거나 변수 이외에 할당되며 다음 유형 중 하나를 가집니다:
내장 함수: ...
클래스 메서드의 첫 번째 인수는 명명 규칙을 따라야 합니다.
관례에 따라 클래스 메서드의 첫 번째 인수(즉 @classmethod 데코레이터가 있는 메서드)는 cls로 이름이 지정되어 인수가 클래스 자체임을 상기시켜 줍니다. 인수에 다른 이름을 지정하면 코드의 사용자와 관리자 모두를 혼란스럽게 할 가능성이 높습니다. 또한 cls 매개 변수를 잊어버렸음을 나타낼 수도 있습니다. 이 경우 메서드 호출이 실패할 가능성이 큽니다. 이 규칙은 init_subclass, class_getitem 및 new 메서드에도 적용됩니다. 첫 번째 인수는 항상 “self”가 아닌 클래스이기 때문입니다.
규칙을 어긴 코드
class Rectangle(object):
@classmethod
...
Boolean 검사는 반전되지 않아야 합니다.
부울 비교의 결과를 뒤집는 것은 불필요하게 복잡합니다. 그 반대의 비교가 대신 이루어져야 합니다.
규칙을 어긴 코드
if not a == 2: # 규칙을 어긴 코드
b = not i < 10 # 규칙을 어긴 코드
규칙을 준수한 해결책
if a != 2 :
b = i >= 10
If you like SONARKUBE, don’t forget to give me a star.
원문으로 바로가기
전체 글 239개, 30 페이지