2009-12-24 2 views
3

난 애플 리케이션의 나머지 부분을 퍼시스턴스 기술에서 추상화하는 데이터 액세스 레이어가 있습니다. 현재 구현은 SQL 서버이지만 변경 될 수 있습니다. 어쨌든, 나는이 주 데이터 액세스 클래스가 크고 커지면서 테이블이 커질수록 (현재 약 40 개의 테이블이 늘어남) 찾습니다. 이 데이터 액세스 계층의 인터페이스는거기에 큰 데이터 액세스 레이어를 리팩터링 할 필요가있다

public interface IOrderRepository 
{ 
     Customer[] GetCustomerForOrder(int orderID); 
     Order[] GetCustomerOrders(int customerID); 
     Product[] GetProductList(int orderID); 
     Order[] GetallCustomersOrders(int customerID); 
     etc . . . 
} 

이 뒤에 구현에 데이터를 얻을 수도 있습니다 질문입니다 입력 컬렉션

이 의지의 결과를 해당 쿼리를 실행하고 반환 기본 SQL 저장 발동 계속 성장하고 성장하십시오. 그것의 꽤 유지할 수있는 하나의 책임의 진정한 휴식은 아니지만 클래스는 지금 코드의 2000 라인 이상입니다.

그래서 확실한 클래스 크기 (실제 개념 결합이 없음)로 인해 문제는 어떤 차원 또는 수준의 추상화로 분해되어야합니까?

답변

2

절대적으로 리펙터입니다. 2000 라인은 엄청납니다.

반환 유형별로 분류하여 시작하겠습니다. 따라서 제품에 액세스하기위한 하나의 클래스, 주문에 대한 클래스, 고객에 대한 클래스 등을 얻을 수 있습니다.

각 클래스에 대해 선택한 열 집합이 동일해야하므로 SQL 값을 개체로 추출 할 때 단일 변수/메서드로 리팩토링 될 수 있습니다.

또한 로깅 및 예외 처리를 포함하여 실제 저장 프로 시저를 호출하면 별도의 클래스로 이동할 수 있으며 그렇게해야합니다.

동의어는 단일 책임을 위반하는 행위입니다.당신의 설명에 따르면 클래스는 현재 다음과 같은 책임이 있습니다

  • 테이블을 조회하는 SQL 문을 생성 (약 40 배) 저장 프로 시저 호출의 결과를 수화
  • 호출하는 저장 프로 시저

그리고 을 가정하고 - 로깅 -

1

크기 때문에 그냥 고려해야한다고 생각합니다. 당신이 그것을 무너 뜨릴 수있는 차원이 항상 있습니다. 분석은 코드를 관리하기 쉽기 때문에 차원을 너무 복잡하게 선택하지 마십시오. 간단하게 유지하여 주어진 함수가 발견 될 클래스/인터페이스를 쉽게 추측 할 수 있습니다.

1

이것은 어려운 문제입니다. 우선 여러 파일과 클래스로 나누고 두 번째로 기술 개체에서 비즈니스 개체를 분할합니다. 데이터베이스 인터페이스 (자신이 작성한)에 따라 비즈니스 오브젝트를 작성할 수 있습니다. 그리고 나서 DB를 변경하면 미래에 기술 객체를 대체하는 것이 필요합니다.

슬프게도 데이터 스키마 증가에서 벗어날 수는 없지만 더 많은 저장 프로 시저, 더 많은 테이블 및 더 많은 비즈니스 개체를 얻을 수 있습니다. 그러나 새 테이블을 추가하는 대신 변경하는 것이 가장 좋았던 레벨을 시도해보십시오.

리소스로 항목을 서로 연결하는 워크 플로를 만드는 것이 좋습니다. 이 말은 물리적 인 종속성을 만드는 것이 아니라 데이터 계층의 모든 세 가지 유형의 항목을 관련시킬 수있는 문서를 만드는 것입니다. 예를 들어, 비즈니스 객체의 주석에 주석을 넣어서 저장 프로 시저 및 테이블을 지정할 수 있습니다 그것은에 달려있다. SQL Server의 테이블에서도 저장 프로 시저에 대해이 작업을 수행 할 수 있습니다 (스키마에는 테이블에 대한 설명 필드가 있음). 이 팁은 큰 그림을 계속 볼 수 있도록 도와줍니다.

+2

가 '시도하지 마십시오 예외 처리를 [..] 다소 변경 t han은 새 테이블을 추가합니다. ' 많은 테이블이 문제가되지 않습니다. 필요한 경우 하나 만드십시오. –

+0

나는 상식을 버리라고 제안하지 않는다. 다음 두 가지 점을 고려하자. 첫째, 데이터 모델의 명확성과 성능을 위해 정규화 십자군이 나쁠 수있다. 둘째, 많은 프로그래머가 단일 데이터 구조 (테이블)로 우아하게 통합 될 수있는 유형의 새 테이블을 작성하는 것을 보았습니다. –

0

귀하의 언어가 그들을 수용 할 경우 일반 DAO를 고려하십시오. 또한 예제를 통해 쿼리를 호출하여 필요한 호출 수를 줄일 수 있습니다.

관련 문제