9

ここでSomethingManagerトラップを回避しようとしています...

管理者がシステムでユーザーを作成できるようにするユーザーエディターを作成するとします。かなり基本的な機能-既存のユーザーのリストを表示し、新しいユーザーを作成し、既存のユーザーを更新し、ユーザーを削除します。

また、これらの基本的なCRUD操作を処理するための「ビジネス」クラスを作成することにしたとしましょう。これはおそらくインターフェースがどのように見えるかです:

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

たとえば、SaveUser()メソッド内では、(別のクラスを使用して)データを検証してから、実際に(別のクラスを使用して)データベースにデータを保存します。

私の質問は、このクラスに何という名前を付けるべきかということです。このクラスはやりすぎなので、複数のクラスに分割する必要がありますか?

4

10 に答える 10

10

SRPが尊重されない場合、命名は困難です:)しかし、メンバーの命名はしばしば誤用されます。

あなたの場合、私はこのようなことをします:

  • 実装の責任は、特定の永続性の契約をカバーすることです
  • 「誰」が攻撃を受けている

音声なしで考える-永続性はユーザーに対して行われ、関連する名前はIUserRepositoryにすることができます-メソッドはCRUD以上ではありません-IUserRepositoryはユーザー向けであるため、UserSave、UserUpdateを使用する必要はありません。マナー

魔法はここにあります...これを行うだけです:

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

幸運を :)

于 2009-05-08T19:41:14.370 に答える
5

ChrisWの呼び出しを「ユーザー」という名前にするだけです。

ほぼすべてのメソッドの名前に同じ文字列を入れていることに気付いたときはいつでも、それをメソッド名から削除してクラス名に入れる必要があります。

于 2009-05-08T18:42:45.073 に答える
3

IUserRepository-リポジトリパターンの場合と同様。

于 2009-05-08T18:42:08.973 に答える
3

IUserRepositoryまたはIUserServices。

于 2009-05-08T18:46:45.297 に答える
2

私の好みはIUserStorageまたはIUserStoreです

于 2009-05-08T18:36:54.807 に答える
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);
}

そして、実際に適用される名前は1つだけなので、名前を付けるのがはるかに簡単になります。私を信じてください。あなたがデザイナーなら、あなたの開発者は物事を簡単に理解して使用できるようにするためにあなたを愛してくれるでしょう。

于 2009-05-08T19:01:11.847 に答える
2

汎用インターフェースになる可能性があります。

ICrud<T> { }

またはIUserStoreに触発されました。

IStore<T> { }
于 2009-05-08T19:08:26.510 に答える
1

なぜIUserCRUDだけではないのですか?CRUDには、「管理」とは対照的に、10の意味はありません。

于 2009-05-08T18:38:08.703 に答える
1

それを「Users」(または「AuthorizedUsers」または「CollectionOfUsers」)と呼んではどうでしょうか。

于 2009-05-08T18:38:34.507 に答える
0

私は一緒に行きUserActionsます。これは、実行したい一連の機能について説明しています。コレクションと呼ぶという罠を回避します(実際には何も収集しないため、コレクションを取得するだけです)。

しかし、そもそもこのクラスをこの形にすることも考え直したいと思います。配置しようとしているのは永続性マネージャーのようです。この方法で永続化したい他のタイプのオブジェクトはありますか?基本クラスに派生できる一般的な機能を抽出できますか?おそらく" PersistenceManager"クラスか何か?次に、それが絶対に必要な場合(そして、それが必要かどうかはわかりません)、UserPersistenceManagerユーザーオブジェクトのみを操作する""を導出できます。(必要なすべてを実行できる可能性があるため、必要ない場合もあると思いますPersistenceManager。ただし、特定の実装のみがそれを伝えることができます。)

于 2009-05-08T21:24:27.073 に答える