코드에서 들여 쓰기를 방지하기 위해 어떤 단계와 조치를 취할 수 있습니까?
코드에서 들여 쓰기를 방지하기 위해 어떤 단계와 조치를 취할 수 있습니까?
답변:
가장 좋은 방법은 추출 방법입니다.
int Step1(int state)
{
if (state == 100)
{
return Step2(state);
}
else
{
return Step3(state);
}
}
int Step2(int state)
{
if (state != 100)
{
throw new InvalidStateException(2, state);
}
// ....
}
if
조건 에서도 작동합니다 . 극단적으로, 실행 가능한 의사 코드로 끝납니다.
else
블록 을 버리는 것입니다 .
가드 조항을 고려할 수 있습니까?
대신에
public void DoSomething(int value){
if (someCondition){
if(someOtherCondition){
if(yetAnotherCondition){
//Finally execute some code
}
}
}
}
하다
public void DoSomething(int value){
if(!(someCondition && someOtherCondition && yetAnotherCondition)){
return;
//Maybe throw exception if all preconditions must be true
}
//All preconditions are safe execute code
}
기회가된다면 Steve McConnell의 Code Complete를 읽어보십시오. 그는이 주제들에 대해 많은 조언을 받았습니다.
http://www.amazon.com/Code-Complete-Practical-Handbook-Construction/dp/0735619670/ref=pd_sim_b_6
"guard 조항"에 대한 자세한 내용은 https://sourcemaking.com/refactoring/replace-nested-conditional-with-guard-clauses를 참조하십시오.
if
s를 뒤집습니다 .
대신에:
if (foo != null)
{
something;
something;
if (x)
{
something;
}
something;
}
else
{
boohoo;
}
나는 쓸 것이다 :
if (foo == null)
{
boohoo;
return;
}
something;
something;
if (x)
{
something;
}
something;
동일하게 적용 if
- else
블록. 경우 else
적은 중첩 / 짧은, 다음을 되돌립니다.
한 곳에서 매개 변수 값 확인
분석법을 입력하자마자 모든 매개 변수에 잘못된 값이 있는지 확인한 다음 안전하다는 것을 계속 확인하십시오. 더 읽기 쉬운 코드를 만들지 만 나중에 조건부 블록을 쌓고 이러한 검사를 서브 루틴 전체에 분산시키는 것도 절약합니다.
If
일부 조건이 충족되지 않아 실행 흐름을 중지시키는 코드 시작 부분에서 @JasonTuran이 지적한 것처럼 보호 절 이라고도 합니다. 그리고 그것은 분명한 이름을 가진 것에 가깝습니다.
깊은 들여 쓰기를 제거해야 할 범주 적 문제로 보지 않습니다 (리팩토링이 모든 것에 대한 진정한 답이라고 생각하지도 않습니다).
일반적으로 중첩 된 if 대신 논리 문을 작성하고 싶습니다.
if (foo && bar && baz)
오히려
if foo
if bar
if baz
들여 쓰기는 실제로 싸울 생각입니다. 내가 배운 것은 먼저 방법을 조각으로 나누고 이상한 조각을 사용하여 한 조각이 실패하면 다음 조각을 모두 건너 뛰는 것입니다. 예를 들면 다음과 같습니다.
대신에 :
{if (networkCardIsOn() == true)
{if (PingToServer() == true)
{if (AccesLogin(login,pass) == true)
{if (nextCondition == true)
...
}
}
}
나는 현재 쓰고있다 :
{vbContinue = true;
if (vbContinue) {
vbContinue = networkCardIsOn();
if (vbContinue == false) {
code to Handle This Error();
}
}
if (vbContinue) {
vbContinue = PingToServer();
if (vbContinue == false) {
code to HandleThisError2();
}
}
if (vbContinue) {
vbContinue = AccesLogin(login,pass);
if (vbContinue == false) {
HandleThisErrorToo();
}
}
...
처음에는 이상하게 보였지만 이것을 사용하기 때문에 유지 관리 비용이 절반으로 나뉘어졌고 하루가 끝나면 뇌가 시원합니다.
실제로,이 "기술"에 의해 도입 된 이점은 코드의 밀도가 낮기 때문에 코드 복잡성이 실제로 분할된다는 것입니다.
코드를 읽는 동안 과거 조건에 대해 아무 것도 기억할 필요가 없습니다. 코드에서 X 지점에 있으면 이전 단계가 통과되어 성공한 것입니다.
또 다른 장점은 중첩 된 모든 "if-else"에서 "탈출 경로 및 조건"이 단순화된다는 것입니다.