2009-05-19 4 views
0

나는 2 개의 테이블을 가지고 있는데, 예를 들어 ClientOrder와 Products Table이 그 것이다. Linq를 사용하여, 나는 클라이언트 순서로 1. 검색을 실행하려는 모든 쿼리를 작성 할 수 있었다 클라이언트 이름 2. 검색 제품 이름 제품 ID 4. 검색여기에 어떤 디자인 패턴이 제안 되었습니까?

I 3. 검색 위의 각 쿼리에 대한 메서드를 만들려고합니다. ? 여기에 어떤 패턴이 적절합니까? 팩토리 패턴은 각 개체가 동일한 데이터 컨텍스트를 사용한다는 것을 알고 있으므로 청구서에 맞지 않는 것처럼 보입니다.

4 가지 정적 메서드로 정적 클래스를 만드는 것이 현명합니까?

참고 : 나는

답변

2

당신은 당신이 무엇을 사용해야 디자인 패턴을 모른다면, 당신은 더 나은 하나를 사용하지 않는 것 프로그래밍 세계와 초보자와 5 개월입니다! 이 아주 간단한 경우 나는 desing 패턴이 제공 할 수있는 유용한 추가를 생각할 수 없다. 아마도 네 가지 쿼리와 그 결과를 제어하는 ​​함수를 어떻게 구현할 수 있는지 알고 싶을 것입니다.

+0

바스, 내가 정적 메서드/클래스를 구현할 수 있습니다. 커뮤니티에서 어떤 패턴을 사용해야하며 왜 사용해야하는지 더 잘 이해하고 싶었습니다. 아마도 나는 프로그래밍 세계와 초보자에게 5 개월이라는 것을 덧붙여 야합니다. –

+0

+1 - '패턴'은이 상황에서 구현하려는 것보다 낫습니다. 원하는 메서드를 사용하여 클래스를 만듭니다. 일단 너무 커지거나 복잡 해지면 리팩터링하십시오. –

0

아마도 메소드를 인스턴스 메소드로 사용하여 간단한 클래스 (아마도 싱글 톤)로 이동하여 데이터 액세스 레이어라고 부릅니다. 필요한 데이터베이스에 대해 인스턴스화하고 LINQ를 적절한 방법으로 함께 사용해야합니다.

1

정적 메서드로 클래스를 확장하는 것이 좋습니다. 다음과 같은 것.

IEnumerable<Client> Client.GetByName(String Name) { } 

IEnumerable<Product> Product.GetByName(String Name) { } 

Product Product.GetById(Guid Id) { } 

난 당신이 법인에 대한 SQL 또는 LINQ에 LINQ를 사용하는 가정, 그래서 당신은 간단하게 생성 된 부분 calsses을 확장 할 수 있습니다. 컬렉션 또는 인스턴스를 반환하고 IEnumerable, IQueryable, IList, List 또는 원하는 것을 선택하는 경우

+0

안녕하세요 @ DanielBrückner! 쿼리 로직을 사용하여 도메인 객체의 구현을 오염시키지 않는 것이 더 좋을 것이라고 생각하지 않습니까? 내 말은, 다른 객체에 질의 처리 책임을 부여하는 것이 합리적이라는 의미입니다. 또한 하위 클래스의 정적 메서드를 재정의 할 수 없으므로 클래스의 확장 성이 제한됩니다. 어떻게 생각해? – nick2083

2

저는 Martin Fowler의 Patterns of Enterprise Application Architecture이 사람들이 데이터베이스 테이블에 대한 액세스를 구조화하는 방법을 학습하는 데 도움이되는 것을 발견했습니다. 이러한 패턴 중 일부는 here입니다.

더 간단한 작업을 위해 4 개의 정적 메서드가있는 단일 클래스가 완벽하게 적합합니다. 그러나 Fowler의 테이블 데이터 게이트웨이 패턴을 고려해야합니다.이 패턴에서는 정적 메서드의 자체 클래스에서 각 테이블에 대한 모든 액세스를 패키지화하고 표준 명명 규칙을 사용합니다. 모든

2

첫째,의는 팩토리 메소드 패턴의 의도를 살펴 보자 :

객체를 생성하기위한 인터페이스를 정의하지만,하자 서브 클래스는 인스턴스화하는 클래스 결정합니다. 팩토리 메서드를 사용하면 클래스에서 하위 클래스에 인스턴스화를 연기 할 수 있습니다.

귀하의 문제에 해당합니까? 도메인 개체를 만드는 것보다 쿼리를 관리하는 방법에 더 많은 관심이 있습니다.

IMHO, 정적 클래스/메서드가 포함 된 구현 대안을 피할 수 있습니다. 정적 클래스에서 상속 할 수 없으므로 모델의 확장 성이 제한됩니다. 정적이 아닌 클래스의 정적 메서드도 마찬가지입니다. 하위 클래스에서는 재정의 할 수 없습니다.

도메인 개체에도 쿼리 메서드를 추가하지 않을 것입니다.OOP를 사용하여 실제 세계를 모델링한다는 것을 명심하십시오. 주문을 다른 주문을 검색하도록 요청하는 것이 합리적입니까?

현실 세계에서 주문을 사용하여 특정 정보 (날짜, 고객 이름 또는 관련 제품)를 가져옵니다. 주문을 찾고 싶을 때, 어디서나 보관하고 찾으십시오 (예 : 파일 캐비닛). 즉, 다른 주문을 검색하기 위해 주문을 사용하지 않습니다.

염두에두고 소프트웨어에서이 상황을 모델링해야합니다. 주문 및 제품을 모델링 한 객체가 이미 있습니다. 누락 된 것은 주문을 저장하고 검색하는 데 사용하는 장소를 모델링 한 객체입니다.

일반적으로 이러한 종류의 개체 (다른 개체를 저장하거나 검색하는 개체)는 저장소라고합니다. 귀하의 경우 ClientOrderRepository라는 이름을 붙일 수 있습니다. 이 개체는 무엇을할까요? 글쎄, 당신은 이미 그것을 언급 : 당신이 필요로하는 네 가지 쿼리를 수행합니다. 의는 인터페이스 가능한 정의를 보자 :

public interface IClientOrderRepository { 
    ClientOrder FindOrderWithIdMatching(int anOrderId); 
    ClientOrder FindOrderWithClientNameMatching(string aClientName); 
    ClientOrder FindOrderWithProductNameMatching(string aProductName); 
    ClientOrder FindOrderWithProductIdMatching(string aProductId); 
} 

당신이, 당신은 싱글 톤 패턴을 사용하여이 인터페이스를 구현하는 클래스의 인스턴스가 필요합니다. 나중에 변경할 수없는 구현 방법 (예 : 정적 방법 1)에 의존하지 마십시오.

마지막으로 문제를 해결하는 특정 패턴을 찾았 으면 개체와 작업을 완료하기 위해 공동 작업하는 방식에 대해 생각하는 것이 좋습니다. 실생활의 은유를 사용하여 실종해야 할 물건이나 책임을 찾을 수 있습니다. 결국, 그것은 객체 지향 패러다임의 본질에 관한 것입니다. 저장소 패턴에 대한 더 깊은 정보에 대한

, 여기 당신이 시작하는 일부 리소스는 다음과 같습니다

+1

다음과 같은 것을 추가하여 유연성을 높일 수도 있습니다 :'IEnumerable Find (조건부 쿼리)'. –

+0

물론, 좋은 조언입니다! @umb은 그가 프로그래밍에있어서 새롭다 고 말했기 때문에 나는 물건을 모으고 싶지 않았습니다. 그래서 나는 개념적인 것에 더 초점을 맞추려고했습니다. – nick2083

관련 문제