2010-03-26 3 views
1

오늘이 코드를 발견하고이를 최적화 할 수있는 방법이 무엇인지 궁금합니다.코드 퀴즈 : 여러 개의 중첩 루프에 대한 코드 최적화

분명히 모델은 유산으로 변하기 쉽지만 의견을 얻는 데 관심이 있습니다.

일부 이름이 바뀌었고 일부 핵심 논리가 흐리게 표시되어 보호되지 않습니다.

코드 매니아가 포인트를 염려하지 않고 답변 할 수 있도록 위키를 만듭니다.

+0

LINQ를 사용할 수 있습니까? – SLaks

+0

아니요, 이전 .net 버전 –

+0

성능 최적화 또는 가독성 최적화를 찾으십니까? –

답변

1

데이터에 매우 의존적입니다. 이를 "일반적인"데이터 세트로 프로파일 링하고 병목 현상을 식별 한 다음 프로파일 데이터를 기반으로 적절한 최적화를 고려해야합니다.

+0

코드 우아함을 찾고 중첩을 제거합니다. –

+0

나는 하나의 루프 (foreach) 만 보았을 것이다 - 아마도 네 스팅 (nesting) 이외의 다른 것을 의미 할까? –

+0

C#의 &&와 || 사실을 이용하여 제거 할 수있는 중첩 조건이 많이 있습니다. 연산자는 실제로 VB에서 AndAlso 및 OrElse와 유사한 바로 가기 논리 연산자입니다. 성능을 향상 시키지는 않지만 코드를 쉽게 따라 할 수 있습니다. 코드 가독성의 중요성은 종종 과소 평가됩니다. –

2
if (testPayment.Customer.Name != customer.Name){continue;} 

처음에는 필요하지 않아도됩니다. 특정 주문에 대한 모든 대가가 같은 고객과 관련되어 있습니까?

내가이 payment_id를 전달하면이 특정 기능이 마음에 들지 않습니다. 그런 다음 특정 지불이나 null을 얻을 것으로 예상됩니다. 당신이 Payment 클래스에 구성원을 추가 할 수 있습니다

+2

앱의 특성에 따라 다릅니다. 나는 비즈니스 애플 리케이션을 보았습니다. 주문에는 여러 가지 지불 고객이 있으며, 각 고객은 각자의 빚을 지니고 있습니다. 이름이 PK가 아닌 경우 이름을 비교해도 문제가 발생할 수 있습니다. –

+0

+1,하지만 우리가 이미 본 코드를 보면 나는 그것이 거의 없다고 생각합니다. 당신은 그것을 지적하는 것이 맞습니다 ... –

+0

나는 애플 리케이션 주위에 점점 ... 끝내야 할 많은 것들이 있습니다. 나는 사소한 것들을 게시 할 몇 가지 기회를 얻을 것이라고 생각합니다. –

1

가하는 didRefund 부울을 추가 ... 당신은 많은 코드를 재 설계에 대해 생각해야처럼

나에게 소리, 나는 그것을이 특정 기능을 잘 넘어 간다 생각 RefundPayment 문자열이 "refund"로 설정 될 때마다 true로 설정됩니다. 이렇게하면 문자열 비교를 피할 수 있습니다. 루프 전에

이 같은 finalPayment를 초기화하는 경우 :

finalPayment = new Payment; 
finalPayment.Value = -1.0e12 

는 다음 루프에서 널 테스트를 방지 할 수 있습니다.

1

첫 번째 테스트 (if (payment.RefundPayment == null)가) 중복 (고객의 아무도 억 부정적인 달러 지불을하지 않습니다 가정). String.Compare을 사용한 두 번째 테스트는 null 문자열과 함께 작동합니다. foreach 루프에서이 비교를 사용하는 두 번째 장소에서이 "최적화"를 사용할 수 있습니다.

1

조건 중 하나를 두 번 반복 했으므로 조건 중 하나를 자신의 기능으로 이동할 수 있습니다 (반대 테스트). 조건을 함께 섞어 첫 번째 조건에서 전체 루프를 감쌀 수도 있습니다. 그렇게하면 함수에 대한 하나의 종료점 만 있습니다. 그게 다루기 힘들지 않다면, foreach-loop을 하나의 함수로 싸서 그냥 그렇게 부르면됩니다.

private static boolean IsRefundPayment(Payment payment) { 
    return payment.RefundPayment != null && String.Compare(payment.RefundPayment, "refund", true) == 0; 
} 

private static Payment FindPayment(Order order, Customer customer, int paymentId) { 
    Payment payment = Order.Payments.FindById(paymentId); 
    if (payment == null || IsRefundPayment(payment)) { 
     foreach (Payment testpayment in Order.payments) { 
      if (testPayment.Customer.Name == customer.Name && !testPayment.Cancelled && !IsRefundPayment(payment) 
       && (testPayment.Value > payment.Value)) { 
       payment = testPayment; 
      } 
     } 
    } 
    return payment; 
} 
+0

최종 결제를 생략하고 결제 수단에 직접 문의하십시오. 그런 다음 최종 if뿐만 아니라 선언을 잃게됩니다. – Einar