2014-06-18 2 views
-2

디자인 관련 질문에 도움이 필요하며 조언이 필요합니다.재사용 가능한 Java 구성 요소를 설계하는 최선의 방법

저는 Java 구성 요소를 작성하고 있지만 다른 여러 응용 프로그램에서 사용할 수 있도록 일반 구성으로 만들 필요가 있습니다. Java 프로젝트 용 jar 파일을 만들었지 만 재사용 할 수있는 가장 좋은 방법은 확실치 않습니다. 인터페이스 (API)를 작성해야합니까? 아니면 다른 응용 프로그램이 구성 요소와 상호 작용하는 데 사용할 수있는 Java Bean을 설계해야합니까?

메인 클래스의 필드/매개 변수를 설정하고 메인 클래스에서 호출되는 개별 클래스에서 수행되는 특정 순서로 특정 작업을 수행해야하는 특정 정보/데이터가 필요합니다. 따라서 API (인터페이스)를 작성하는 것이 올바른 접근법인지 또는 내 애플리케이션에 Java Bean을 작성한 다음 해당 JavaBean을 인수로 전달하는 생성자를 가질 것인지 여부를 확신하지 못합니다. 그런 다음 어떻게하면 내 구성 요소를 사용하려고하는 다른 사용자에게 내 구성 요소와 상호 작용할 수있는 방법을 알릴 수 있습니까?

나는 내 코드의 일부 조각을 추가 한 :

 public class OrderDetailBean { 

     private String foreName; 
     private String surName; 
     private String address1; 
     private String address2; 
     private String address3; 
     private String postcode; 
     private String cityname; 
     private String state; 
     private String countryCode; 
     private String telephoneNumber; 
     private String emailaddress; 

     /** 
     * Getter/Setters for all these fields 
     */ 
    } 

public class ComponentClient { 

    private static OrderDetailBean orderBean; 

    /** 
    * Default Constructor 
    */ 
    public ComponentClient() { 

    } 

    /** 
    * Constructor with OrderBean parameter 
    */ 
    public ComponentClient (OrderDetailBean orderBean) { 
     setOrderBean(orderBean); 
    } 

    /*****Set the Order Bean *******/ 
    private void setOrderBean(OrderDetailBean orderBean) { 
     if (orderBean.equals(null)) { 
      this.orderBean = orderBean; 
     } else { 
      setOrderBean(); 
     } 
    } 

    private void setOrderBean() { 
     // Set the bean Fields: Only for testing purposes 
     orderBean.setForeName("John"); 
     orderBean.setSurName("Smith"); 
     orderBean.setAddress1("Address1!"); 
     orderBean.setAddress2("Address2"); 
     orderBean.setAddress3("Address3"); 
     orderBean.setPostcode("NE20 9FA");  
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { // Calls to other classes } 
    } 

정말 어떻게 내 목표를 달성하기 위해하시기 바랍니다 어떤 조언을 부탁드립니다. 비슷한 일을 다른 도서관에서

감사

답변

0

API가 무국적 주체인지 여부에 대한 유명한 질문과 같습니다. 당신이 문서를 통해 그들에게 ... '어떻게 API 사용자가 알고있는 것'에 관한 경우 ...

는 (1) 상태 ComponentClient가 필드로 'orderBean을'유지 (코드에서 보여 ). 의미 : (a) API 사용자에게 생성자 또는 설정자를 통해 매개 변수를 전달하도록 지정합니다. 그리고 그들이 한 일을 다시 확인하십시오. no-args 생성자를 취소하여 (이 아이디어가 마음에 들지 않음) 또는 Factory 메소드를 통과하도록 강요하거나 비즈니스 메소드의 시작 부분에 체크를 추가합니다. 그들은 동시 주문이있는 경우 는 (C) ComponentClient 만 시간에 하나 개의 명령을 처리 할 수 ​​있는지를 경고하는 것을 잊지 마십시오, 그들은 ComponentClient

의 여러 인스턴스를 필요

(2) ComponentClient받을 것 'orderBean'로 자사의 비즈니스 방식에 대한 매개 변수, 예. "public void placeOrder (orderBean)"입니다. 동일한 ComponentClient 인스턴스가 여러 동시 주문을 처리 할 수 ​​있다는 점이 장점입니다. 단점 : ComponentClient가 호출간에 로컬 '임시'계산을 캐시하는 것이 더 어려울 것입니다. 예 : 'placeOrder (order)'를 실행하고 나중에 'chargeForOrder (order)'를 정확히 동일한 순서로 실행하면됩니다. 캐시 할 수는 있지만 더 조심스럽게 - 동시성을 허용합니다.

두 가지 방법 모두 업계에서 나타납니다. 개인적으로는 무국적 인 접근 방식을 선호합니다. 또한 IT/웹 응용 프로그램의 최신 트렌드이기도합니다. 가장 중요한 것은로드 균형 조정 & 장애 조치 (failover)가 발생할 때입니다.

편집 : 코드 예제 (차이가 orderBean이 필드 또는의 processOrder에 대한 매개 변수인지,이다) :

// stateful: 
public class ComponentClient{ 
    private OrderBean order; 
    public ComponentClient(OrderBean order){this.order=order;} 
    public void processOrder() {... } // handle payment, invoice etc for this.order 
} 
// stateless: 
public class ComponentClient{ 
    public ComponentClient(){} 
    public void processOrder(OrderBean order) {... } // handle payment, invoice etc for parameter order 
} 
+0

그것은 매우 도움이되지만 (제발 나의 변명을 용서해주십시오) 조금 더 정교하고 제발 컨셉을 설명해 주시겠습니까? 감사합니다 –

+0

물론, 난 그냥 내 대답에 위의 코드 예제를 추가했습니다. 내가 말한대로 두 코드가 모두 합법적이지만 일반적으로 후자의 방식 (무국적자)을 선호합니다. 장기적으로 유지하기가 훨씬 쉽습니다. –

0

봐, 당신은 그들로부터 좋아하는 것을 가지고 그렇게.

빈은 아마도 지나치게 복잡하게 만들지 만 여러분이 묻는 질문은 너무 광범위하게 적절하게 대답 할 수 없습니다.

가장 중요한 것은 깨끗하고 직관적 인 API를 사용하고 모든 메소드와 메소드를 올바르게 javadoc하는 것입니다.

+0

내가 질문 구체적인 답변을 얻을 매우 광범위하지만, 심지어 일반 권합니다 동의가 감사하겠습니다. 위의 질문을 편집하여 코드를 추가했습니다. 덕분에 –

관련 문제