2012-04-26 3 views
0

코드 재사용, 코드 수정 측면에서 더 나은 접근 방법입니까? 나중에 savePayment 메서드에 새 매개 변수를 추가해야하는 경우 많은 컨트롤러 파일에서 paymentDao.savePayment() 메서드를 변경해야 할 수 있습니다. paymentDao.savePayment(parameterClass)이 더 나은 해결책 인 것처럼 매개 변수 만 전달하는 또 다른 클래스를 만드는 것도 고려해 봤습니까? 아니면 이보다 더 나은 해결책이 있습니까?더 나은 코드 작성 방법

paymentDao.savePayment(fromUserId, toUserId, amount, paymentMethod, note, paymentGateway); 

class PaymentDaoImpl implements PaymentDao{ 
    public void savePayment(long fromUserId, long toUserId, double amount    String paymentMethod, String note, String paymentGateway){ 
      PaymentStdReln paymentStdReln = new PaymentStdReln(); 
      paymentStdReln.setFromUser(fromUserId); 
      paymentStdReln.setToUserId(toUserId); 
      paymentStdRelnDao.save(paymentStdReln); 

      PaymentGateway pg = new PaymentGateway(); 
      pg.setGateway(paymentGateway); 
      paymentGateWayDao.save(pg); 
      ..... 
      //In this way save into many table 
    } 

}

+2

http://codereview.stackexchange.com/ – Quentin

답변

1

나는 단지 몇 가지 일반적인 제안을 줄 수 있습니다

  1. 코드 재사용을 변경

당신은 당신의 savePayment을 변경할 필요가 없습니다 것 같은 디자인해야 각 컨트롤러. 대신 하나의 메소드에서 핵심 기능을 사용하고 다른 특정 유형의 메소드가 상속 또는 구성을 통해이를 재사용하도록하십시오.

private void corePayment(p1, p2, ...); 


public specialPaymentOne(p1, p2, ..., a1, a2, ..) { 
    corePayment(p1, p2, ...) 
    // do extra stuff 

} 

public specialPaymentTwo(p1, p2, ..., b1, b2, ..) { 
    corePayment(p1, p2, ...) 
    // do extra stuff 

} 

등등. 주 및 생성자 일반적으로

  1. 클래스, 클래스는 어떤 상태, 인스턴스 변수가 있어야합니다. 그렇지 않으면 클래스의 존재가 문제가됩니다. 귀하의 경우 아마도 일부 매개 변수가 귀하의 메서드가 실제로 클래스에 속해있을 수 있으며, 클래스 생성자에 전달 될 수 있습니다. 그러면 메서드가 훨씬 간단해질 것입니다. 마찬가지로, 대신

    Class A { 
        method1(v1, v2, v3, x1, x2); 
        method2(v1, v2, v3, y1, y2); 
        method3(v1, v2, v3, z1, z2); 
    
    } 
    

    의 당신은 객체가 정보의 일부 조각없이 작동 할 수없는 경우

    Class A { 
    
        var1; 
        var2; 
        var3; 
        //more 
    
        // Constructor 
        public A(v1, v2, v3, ...) { 
         var1 = v1; 
         va12 = v2; 
         var3 = v3; 
         // 
        } 
        method1(x1, x2); 
        method2(y1, y2); 
        method3(z1, z2); 
    
    } 
    

    3.

    는, 그 정보는에서, 객체에 전달해야 할 수 있습니다 건설 시간. 이 부분적으로 만 초기화 할 때 예를 들어, 대신

    PaymentGateway pg = new PaymentGateway(); 
    pg.setGateway(paymentGateway); 
    

    는,

    이 많은 장점을 가지고
    PaymentGateway pg = new PaymentGateway(paymentGateway); 
    

    가, 다른 사람의 사이에서, 그것은 PaymentGateway데도 사용되지 않습니다 있는지 확인합니다 가지고하는 것이 좋습니다 .

+0

학생용 테이블이 있다고 가정합시다. 학생 표에 하나의 속성을 추가해야하므로 학생 pojo에도 추가해야합니다. 따라서이 경우 학생 학생 = 새 학생(); student.setName (name); student.setAge (12); .. student.setNewAttribute (newAttribute); studentDao.save (학생); 이 경우 컨트롤러 클래스에서 학생 개체를 저장할 때마다 수정해야합니다. 권리? – user510783

+0

문제는 여전히 귀하의 접근 방식과 동일합니다. pojo에 추가 할 새 속성이 있으면이 pojo 클래스가 이미 사용 된 모든 곳에서이 객체를 사용하기 전에 추가 코드 인 student.setNewAttribute (newAttribute)를 추가해야합니다.그러나 대신 생성자를 변경하는 것이 더 좋지 않습니까? 그렇지 않다면 어떤 장소에서 어떻게 인스턴스화 한 후에 student.setNewAttribute (newAttribute) 코드를 추가하는 것을 잊어 버리고 일관성없는 상태에있는 객체를 사용하는 것을 보장 할 수 있습니다. –

관련 문제