2009-11-04 3 views
0

저는 항상 하나의 클래스로 객체를 참조하는 코딩을하고 있습니다. 그 클래스의 컬렉션을 얻으려는 경우 방금 Get()을 사용하여 목록으로 반환했습니다.단일 클래스 및 클래스 컬렉션

public abstract class Customer 
{ 
    private Int32 customerID; 
    private String customerName; 

    public abstract List<Customer> Get(); 
    public abstract bool Add(); 
    public abstract bool Update(); 
    public abstract bool Delete(); 
} 

이제 ... 나는 이것을 받아들이 기 위해 다른 클래스를 만들어야한다고 다른 이에 대한 의견을 받았습니다. 나는 또한 이것을 ORM (Object Relation Mapping)에서 특히 보았지만 그다지 그렇지 않은가?

그래서 이런 식으로 뭔가있을 것이다 :

public abstract class CustomerCollection 
{  
    public abstract List<Customer> Get(); 
    public abstract bool Add(); 
    public abstract bool Update(); 
    public abstract bool Delete(); 
} 

당신의 생각은 이것에 대해 무엇입니까?

감사

+3

전혀 디자인을 이해하지 못합니다. 고객이 다른 고객의 컨테이너입니까? 아니면, 다른 방법으로 두 가지 다른 고객에게'Get() '을 호출하면 두 가지 결과를 얻을 수 있습니까? 그렇지 않다면 왜 처음에'Get()'을 호출하기 위해'Customer'의 인스턴스가 필요합니까? –

+0

목록을 반환하는 Get() 메서드는 인스턴스 메서드가 아닌 정적 메서드 여야합니다 (고객이 IMHO 인 고객 클래스에 있다고 가정). 메소드 이름은 Get() 대신 GetAll() 인 경우 더 명확 할 수 있습니다. –

답변

0

방법 이름 가져 오기()는 모호 - 더 나을 Customer.AsList 같은 것을(). 또는 고객이 필요로 할 때 고객을 포함하는 새 List를 작성하는 대신,이를 작성하는 방법을 사용하십시오.

5

과 같은 기본 제공 컬렉션을 사용하거나 자신의 CustomerList 클래스를 만드는 것이 더 좋은지 묻는 것처럼 들립니다. 이 질문과는 별도로, 귀하의 단일 Customer 클래스가 좋은 OO 디자인을 따르는 지 확인하는 것이 중요합니다 (그리고 귀하의 Get() 방법은 이상하게 보입니다). 따로, 나의 접근 방식은

설정은 항상 수집에 내장 된 내장 된 콜렉션을 클래스을하지 인터페이스을 사용합니다. 예를 들어 Customer의 콜렉션을 반환하는 함수는 루프를 반복하거나 계산하거나 임의의 순서로 선택해야하는지 여부에 따라 IEnumerable<Customer>, ICollection<Customer> 또는 IList<Customer>을 반환해야합니다.

그러면 초기 구현에서는 지금처럼 List<Customer>을 반환 할 수 있지만 더 구체적인 기능이 필요한 경우 나중에 다른 컬렉션으로 쉽게 바꿀 수 있습니다.

업데이트 :

: 기본 구현은 단지 빈 서브 클래스

public interface ICustomerList : IList<Customer> { } 

될 것입니다 : 당신이 나중에 확장하는 생각에 정말 관심이 있다면, 당신은 또한 인터페이스를 만들 수 있습니다

public class CustomerList : List<Customer>, ICustomerList { } 

그리고 모든 수업을 ICustomerList (실제로는 CustomerList 개의 인스턴스를 반환합니다.)을 반환하십시오. 다음 버전에서는 ICustomerList 인터페이스를 확장하여 현재 목록을 소비하는 코드를 손상시키지 않고 새로운 메소드를 추가 할 수 있습니다.

이 방법은 테스트하지 않았습니다. YMMV.

결론은 새로운 기능을 추가하지 않는 한 새로운 클래스를 만들지 말아야한다는 것입니다. 결론 : 당신이 지원하고자하는 최소한의 기능을 노출하는 인터페이스를 항상 반환하십시오.

+0

안녕 다니엘. 인터페이스를 사용하여 귀하의 접근 방식을 좋아해요. 인터페이스에 관한 클래스를 기반으로 세부적인 예를 들어 주시겠습니까? – dcpartners

+0

답변을 확장했습니다. 그게 도움이 되니? 아니면 .NET 제네릭 컬렉션 인터페이스에 대해 묻고 있습니까? –

+0

고마워요. 그래서 ICustomerList를 사용하여 CustomerList 클래스를 가질 필요가 있습니까? 그런데 Get() 메서드가 어디에 위치합니까? 나는 어떻게 그때까지 또는 CustomerList의 생성자를 통해 모든 컬렉션을 유사하게 만들 수 있습니까?!?! – dcpartners

1

컨테이너/콜렉션 수업을 사용할 때는 개인적인 취향의 문제라고 생각합니다.개인적으로 CRUD 메서드를 다른 모델 클래스의 특정 컨테이너/컬렉션 클래스와 분리 할 수있는 방식을 좋아합니다. 고객 모델 클래스에 이러한 메서드를 추가하지 않는 것이 더 나을 것입니다.

관련 문제