문제

피하려고합니다 뭔가 관리자 여기에 함정 ...

관리자가 시스템에서 사용자를 생성 할 수있는 사용자 편집기를 작성하겠다고 가정 해 봅시다. 매우 기본적인 기능 - 기존 사용자 목록을보고, 새 사용자를 만들고, 기존 사용자를 업데이트하고, 사용자를 삭제합니다.

또한 이러한 기본 CRUD 운영을 처리하기 위해 "비즈니스"클래스를 작성하기로 결정했다고 가정 해 봅시다. 이것은 아마도 인터페이스의 모습 일 것입니다.

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

예를 들어 SaveUser () 메소드 내에서 데이터를 검증 한 다음 실제로 데이터를 데이터베이스에 저장합니다 (다시 다른 클래스 사용).

내 질문은이 수업의 이름을 어떻게 지정해야합니까? 이 클래스가 너무 많은 일을하고 있으므로 여러 클래스로 나누어야합니까?

도움이 되었습니까?

해결책

SRP를 존중하지 않으면 이름 지정이 어렵지만 멤버 이름은 종종 오용됩니다.

귀하의 경우에는 다음과 같이 할 것입니다.

  • 구현의 책임은 지정된 지속성 계약을 다루는 것입니다.
  • "누가"가 불타고 있습니다

음성이없는 생각 - 사용자를 위해 지속성이 이루어지고 관련 이름은 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);
}

그거 어렵 니 ? 맞춤형으로 무엇을해야합니까?

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" });
  }
} 

행운을 빕니다 :)

다른 팁

나는 그냥 "사용자"를 지명하라는 Chrisw의 전화를 두 번째로하고 있습니다.

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

iuserrepository-에서와 같이 저장소 무늬.

내가 선호하는 것은 iuserstorage 또는 iuserstore입니다

iuserrepository 또는 iuserservices.

당신이 이것을 명명하는 데 어려움을 겪고 있다는 사실은 그것이 잘못된 거대한 붉은 깃발이어야합니다.

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

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

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

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

그리고 이제 하나의 이름 만 실제로 적용되기 때문에 이름을 지정하는 것이 훨씬 간단 해집니다. 당신이 디자이너라면, 당신의 개발자들은 당신을 이해하고 사용하기에 간단하게 만들기 위해 당신을 사랑할 것입니다.

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

ICrud<T> { }

또는 Iuserstore에서 영감을 얻었습니다.

IStore<T> { }

왜 Iusercrud가 아닌가? Crud는 10 번의 의미를 '관리'하기로 결정했습니다.

"사용자"(또는 "공인 사용자"또는 "CollectionOfusers")라고 부르는 것은 어떻습니까?

나는 함께 갈 것이다 UserActions. 이것은 당신이하고 싶은 기능 세트를 설명합니다. 그것은 그것을 컬렉션이라고 부르는 함정을 피합니다 (실제로 아무것도 수집하지 않기 때문에 컬렉션을 검색합니다).

그러나 나는 또한이 수업을이 형식으로 처음으로 생각하는 것을 다시 생각합니다. 당신이 자리 잡으려고하는 것은 끈기있는 관리자 인 것 같습니다. 이런 식으로 지속하려는 다른 유형의 객체가 있습니까? 그런 다음 기본 클래스로 파생 될 수있는 공통 기능을 추출 할 수 있습니까? 아마도 "PersistenceManager"클래스 나 서점? 그러면 절대적으로 필요하다면 (그리고 그것이 확실하지 않다면), 당신은 A를 도출 할 수 있습니다."UserPersistenceManager"그것은 사용자 객체만으로 작동 할 것입니다. PersistenceManager; 그래도 특정 구현 만 말할 수 있습니다.)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top