2013-10-04 1 views
1

메서드 매개 변수에 포함 된 표현식을 사용하여 코드를 구조화하는 것은 일반적으로 나쁜 습관으로 간주됩니까? 대신 변수를 선언해야합니까?메서드 매개 변수 식을 포함하는 것은 나쁜 습관입니까?

(예를 들어 안드로이드 코드)

((EditText)view.findViewById(R.id.fooEditText)) 
    .setText(
    someExpression 
     ? getResources().getString(R.string.true_expression_text) 
     : getResources().getString(R.string.false_expression_text) 
); 

는 개인적으로 내가 잘 생겼다고 생각하지만,이은에, :)

답변

2

내가 거의 확실히를 단순화 할 격퇴 생각하면 그냥 궁금하고 방법의 수 :

EditText editText = (EditText) view.findViewById(R.id.fooEditText); 
String resourceName = someExpression ? R.string.true_expression_text 
            : R.string.false_expression_text; 
editText.setText(getResources().getString(resourceName)); 

한 성명에서 모두 수행이 어렵게 D에 열심히 를 읽을 수 있습니다 ebug, IMO. 여기서도 중복을 제거했지만 조건 연산자의 피연산자에 모두 getResources().getString(...)을 호출 했으므로 다른 리소스 이름을 사용했습니다.

내 메인 쇠고기는 원래 코드와 함께 캐스트의 결과에 대한 메서드를 호출합니다. 다른 것 외에, 필요한 것보다 더 많은 괄호가 도입되어 일반적으로 혼란 스럽습니다.

1

예를 들어 상황에 따라 달라집니다.

player.setName(User.getName()); 

player.setName(getGroup().getUsers().get(0).getName()); 

내가 말할 것

나쁜 연습 및 기차 난파의 위험에 대한 Clean Code by Bob Martin에서 언급 ... 다음과 같은 부수고 훈련을하지만, 잘 될 것이다. 또한 @Jon Skeet에 언급 된 것처럼 중복 호출은 메서드 호출 대신 변수를 사용하는 또 다른 이유입니다.

+0

나는 심지어 후자의 코드를 기차 사고라고 부르지 않을 것이다. 질문의 코드보다 여전히 * 상당히 * 간단합니다. –

+0

나는 OP가 언급 한 코드보다 훨씬 간단하다는 것에 동의한다. (특히 삼항 연산자로 인해) 나는 그저 간단한 예제로 더 많은 것을 의미했다. – david99world

+0

그 책을 사야 할지도 모르겠다. – elimirks

0

단어 "격퇴"는 당신의 것이었지만 확실히 나의 반응을 묘사합니다. if 문, 검색 및 적어도 5 개의 역 참조가 시작되기 전에이 문이 수행하는 작업에 집중할 수 없습니다.

다른 모든 것을 구문 분석하는 동안 내 마음에 두 개의 분리 된 상태 집합을 보유해야하므로 삼중 연산자는 특히 유해합니다. 일부 사람들은 지역 변수에 대한 간결함 (나는 그들 중 하나가 아닙니다)을 선호하지만 다른 진술에 포함 된 삼중 연산자 (또는 다른 분기)는 특히 마음에 들지 않습니다. 복잡한 명령문을 사용하기 때문에 나머지 코드 또는 유사한 작동을 무시하면 적어도 조건문을 분리하십시오.