2009-05-08 6 views
6

여기에 SomethingManager 함정을 피하려고 ...이 CRUD 클래스의 이름은 무엇입니까?

관리자가 시스템에서 사용자를 만들 수있는 사용자 편집기를 작성하려고합니다. 아주 기본적인 기능 - 기존 사용자 목록을보고 새 사용자를 만들고 기존 사용자를 업데이트하고 사용자를 삭제합니다.

이 기본 CRUD 작업을 처리하기 위해 "비즈니스"클래스를 작성하기로 결정했습니다. 사용하여 다시 (즉, SaveUser() 메소드 내부

public interface ISomeUsefulName 
{ 
    IList<User> FetchUsers(); 
    User FetchUser(int userId); 
    bool SaveUser(User user); 
    bool DeleteUser(int userId); 
} 

예를 들어, 내가 (다른 클래스를 사용하여) 데이터의 유효성을 검사 할 후 실제로 데이터베이스에 데이터를 저장 :이 인터페이스가 어떻게 보이는지 아마 다른 클래스).

제 질문은 무엇입니까? 이 클래스가 너무 많이하고 그래서 여러 클래스로 나눠해야합니까?

답변

6

명명 어렵다.귀하의 경우에는

내가 같은 것을 할 수 있습니다 :

구현의 책임은 지속성의 지정 계약을 충당하기 위해
  • 입니다
  • 공격을 받고는 "사람"

음성없이 생각한다 - 지속성이 사용자에 대해 수행되고 관련 이름이 IUserRepository 일 수 있습니다 - 방법은 CRUD 에 대한 것보다 많지 않습니다 - IUserRepository가 사용자 용이므로,

public interface IRepository<TYPE, KEY>{ 
    IList<TYPE> GetAll(KEY key); 
    TYPE GetById(KEY key); 
    void Save(TYPE obj); 
    void Update(TYPE obj); 
    void Delete(Key key); 
} 

어려운가요 : 그것은 브레이크

매직은 여기에 일반적인 사용 방법은 ... 바로이 작업을 수행하기 때문에 UserSave, UserUpdate을하지가 필요합니까? 맞춤 설정을 어떻게해야합니까?

public interface IUserRepository : IRepository<User, int> 
{ 
    IList<User> GetAllMyFavorites(ICriteria crit); 
    IList<Events> GetHistoryByUser(User user); 
} 

는 IoC 컨테이너를 사용하여 코드에서 쉽게

public UserController { 
    private _userRepository = null; 
    private _eventsRepository = null; 

    public UserController(IUserRepository userRepository, 
    IRepository<Events,int> eventsRepository) 
    // if you are doing here just CRUD use the generic signature 
    { 
    _userRepository = userRepository; 
    _eventsRepository = eventsRepository; 
    } 

    public MarkItAsGoldPartener(int userId){ 
    var user = userRepository.GetById(userId); 
    user.PartnerType = PartnerTypes.Gold; 
    userRepository.Save(user); // the user in member name is useless 
    eventsRepository.Save(new Event(){Message = "The user" + UserId + "is golden" }); 
    } 
} 

행운을 빕니다 :)

+0

+1 좋은 답변입니다. 너는 내가 생각했던 것보다 더 잘 생각했다. –

2

내 선호 IUserStorage 또는 IUserStore

+0

+1 for IUserStore –

1

왜 그냥 IUserCRUD 것입니까? CRUD는 10 가지 의미를 '관리'하지 않아도됩니다.

+0

... 물론 " crud "는 다른 의미가 없습니다. ;-) –

1

"사용자"(또는 "AuthorizedUsers"또는 "CollectionOfUsers")라고하는 것은 어떻습니까?

+0

그건 내 표입니다. –

3

IUserRepository - Repository 패턴과 동일.

+0

http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/10/08/the-repository-pattern.aspx 지울 수있는 또 다른 링크입니다. – scottm

5

저는 ChrisW의 전화를 "사용자"라고 부릅니다.

거의 모든 메서드 이름에 동일한 문자열을 넣을 때마다 메서드 이름에서 제거하고 클래스 이름을 넣어야합니다.

+0

+1을 입력하면 메소드 이름에서 명사 (즉, 클래스 이름)가 삭제됩니다. – ChrisW

+0

그는 이미 User 클래스를 가지고 있습니다. 사용자가이 기능을 사용자 클래스 (반드시 나쁜 아이디어는 아님)로 마이그레이션하라는 제안을하지 않는다면, 조금은 그렇지 않을 것입니다 ... "collision-y"? :-) –

+0

@McWafflestix : 그러면 "UserManagement"또는 "UserIO"가 될 수 있습니다. 그 이름을 메소드와 클래스가 속한 클래스로 가져와야합니다. –

2

IUserRepository 또는 IUserServices.

2

이름을 지정하는 데 문제가 있다는 사실은 잘못되었다는 거대한 붉은 깃발이어야합니다.

단일 책임 원칙 (및 인터페이스 분리 원칙)이 여기에 적용됩니다. 필요한 다양한 작업으로 분해하십시오.

public interface IUserList 
{ 
    IList<User> FetchUsers(); 
} 

public interface IUser 
{ 
    User FetchUser(int userId); 
} 

public interface IUserStore 
{ 
    bool SaveUser(User user); 
    bool DeleteUser(int userId); 
} 

그런 다음 하나의 이름 만 실제로 적용되기 때문에 이름을 지정하는 것이 훨씬 간단합니다. 나를 믿어 라. 만약 당신이 디자이너라면, 개발자들은 물건을 이해하고 사용하기 쉽도록 만들기 위해 당신을 사랑할 것이다.

+0

IUser는 나쁜 선택이라고 생각합니다. IUser를 구현하기 위해 User 클래스를 사용해야합니다. IUserList와 동일합니다. 그러나 IUserStore는 나쁘지는 않지만 네 가지 방법을 모두 포함해야합니다. –

2

일반 인터페이스가 될 수 있습니다.

ICrud<T> { } 

또는 IUserStore에서 영감을 얻었습니다. SRP : 존중하지 않고 회원의 이름은 종종 잘못 사용되는 경우

IStore<T> { } 
0

내가 UserActions로 가고 싶어 할 수 있습니다. 이것은 원하는 기능 세트를 설명합니다. 콜렉션을 호출하는 함정을 피할 수 있습니다 (실제로 아무것도 수집하지 않고 단순히 콜렉션을 검색하기 때문에).

하지만이 클래스를 처음부터 다시 생각해 보겠습니다. 당신이 넣으려고하는 것은 지속 관리자입니다. 이러한 방식으로 유지하기를 원하는 다른 유형의 객체가 있습니까? 기본 클래스로 파생 될 수있는 일반적인 기능을 추출 할 수 있습니까? 아마도 "PersistenceManager"클래스 또는 일부입니까? 그렇다면 절대적으로 필요한 경우 (그리고 확실하지 않을 수도 있습니다) 사용자 개체 만 작동하는 "UserPersistenceManager"을 파생시킬 수 있습니다. (당신이 필요한 모든 것을 수행 할 수 있기 때문에 필요하지 않을 수도 있습니다 .).

관련 문제