2012-06-11 2 views
2

나는 Drupal CMS에서 데이터를 검색하는 Java 클래스가 있습니다. 결국 드루팔 (Drupal)에는 자바와 캐시에 필요한 많은 콘텐츠 유형이 있습니다. Drupal이 작동하는 방식 때문에 각 컨텐츠 유형은 별도의 데이터베이스보기입니다.일반 데이터베이스 메서드

나는 서비스 레이어에 의해 호출되는 다음 메소드를 가지고 있으며, 특정 객체 유형을 반환한다. 그러나 내 두려움은 각 콘텐츠 유형에 대한 이러한 방법의 확산입니다.

누군가가 더 일반적인 방법을 제안 할 수 있습니까? 데이터베이스 메소드는 두 번째 코드 샘플에 나와 있습니다. 나는 그것을 일반화시킬 수 있는지, 그리고 그것이 가치가 있는지 여부를 모른다. 어쩌면 첫 번째 메서드에서 한 메서드를 호출 할 수 있고 두 번째 메서드에서 case 문을 사용할 수도 있습니다.

public DeliverySchedule getDeliverySchedule(final String cmsKey) { //  <---- make return type (Del Schedule) generic 

    String cacheKey = TYPEDS + cmsKey; 
    DeliverySchedule cmsInstance = CMSObjectCache.getCachedCMSObject(cacheKey, DeliverySchedule.class); // Make generic 

    // Object not found in cache, go to database. 
    if (cmsInstance == null) { 
     try { 
      cmsInstance = getDeliveryScheduleFromDB(cmsKey); // <---- How can I make this generic so I can avoid DRY? 
      CMSObjectCache.putCachedCMSObject(cacheKey, new CMSObject(DeliverySchedule.class, cmsInstance)); 
      return cmsInstance; 
     } catch (EmptyResultDataAccessException e) { 
      return null; 
     } 
    } else { 
     return cmsInstance; 
    } 
} 

데이터베이스 액세스 방법을 위의 내용 유형에 고유 :

// Called from above 
private List<DeliverySchedule> getDeliverySchedulesFromDB() { 
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
    final String sql = "select * " 
      + "   from cmsutil.delivery_schedules as m " 
      + "   where m.effdate = (select max(mm.effdate) " 
      + "       from cmsutil.delivery_schedules as mm " 
      + "       where mm.cms_key = m.cms_key " 
      + "       and mm.effdate <= current_date)"; 


    List<DeliverySchedule> listcmsObject = jdbcTemplate.query(sql, new DeliveryScheduleMapper()); 
    return jdbcTemplate.query(sql, new DeliveryScheduleMapper()); 
} 

답변

1

일반적으로 각 테이블이나 뷰 (DAO를하고 그것을 구현하는 클래스에 대한 인터페이스에 대한 DAO이있을 것이다). 이렇게하면 특정 테이블 스키마가 변경되면 변경 사항이 하나의 DAO 클래스로 분리됩니다.

각 콘텐츠 형식에 대해 인터페이스를 구현하는 클래스와 단일 인터페이스를 갖도록 콘텐츠 형식을 일반화 할 수 있습니다. 이렇게하면 일반 콘텐츠 형식 계층, 특정 콘텐츠 형식 및 데이터 액세스 계층의 변경 내용을 적용 할 수 있습니다.

잠재적으로 많은 코드가 될 수 있다고 동의하지만 각 구성 요소가 다른 구성 요소와 분리되면 구성 요소를 변경/추가하거나 스키마 변경을 처리 할 때 유연성을 제공합니다. 디커플링과 추상화는 단기간에 고통 스러울 수 있지만 장기적으로 엔지니어링 팀에서 성과를 거두는 경향이 있습니다.

나는 이것들과 같은 질문/토론을 즐긴다. 나는 항상 제안이나 다른 접근법에 열려있다.

0

클래스의 새 인스턴스를 만들려면 클래스 객체의 반사 장치를 사용해야합니다. 그래서 당신이하는 일은 그 인스턴스가 그 클래스의 레코드를 가진 일반 클래스를 사용하는 것입니다. 여러분의 콩이 mybean을 확장한다고 가정 해 봅시다;

그런 종류의 것.

DAO<Foo> fooDao = new Dao<Foo>(Foo.class); 
    List<Foo> l = fooDao.getAList(); 

    List<? extends MyBean> l = someDao.getAList(); 

    static <T extends Mybean> List<T> boink(Class<T> clazz) { 
     DAO<T> tDao = (DAO<T>) daoMap.get(clazz); 
     return tDao.getAList(); 
    } 

    List<Foo> l = boink(Foo.class);