質問
SomethingManager トラップを回避しようとしています...
管理者がシステム内でユーザーを作成できるようにするユーザーエディターを作成します。非常に基本的な機能-既存のユーザーのリストの表示、新しいユーザーの作成、既存のユーザーの更新、ユーザーの削除。
また、<!> quot; business <!> quot;と書くことにしました。これらの基本的なCRUD操作を処理するクラス。これはおそらくインターフェイスがどのように見えるかです:
public interface ISomeUsefulName
{
IList<User> FetchUsers();
User FetchUser(int userId);
bool SaveUser(User user);
bool DeleteUser(int userId);
}
たとえば、SaveUser()メソッド内で、データを検証し(別のクラスを使用)、実際にデータベースにデータを保存します(再び別のクラスを使用します)。
私の質問は、このクラスの名前は何ですか?このクラスはやりすぎているので、複数のクラスに分割する必要がありますか?
解決
SRPが尊重されていない場合、命名は困難です:) しかし、メンバーの命名はしばしば誤用されます。
あなたの場合、私はこのようなことをします:
- 実装の責任は、指定された永続性の契約をカバーすることです
- <!> quot; who <!> quot;燃えている
音声なしで考える -永続化はユーザーに対して行われ、関連する名前は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" });
}
}
幸運:)
他のヒント
ChrisWが<!> quot; User <!> quot;という名前を付けるように呼びかけています。
ほぼすべてのメソッドの名前に同じ文字列を入れていることに気付いたときはいつでも、メソッド名から削除してクラス名に入れる必要があります。
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);
}
そして、実際には1つの名前だけが適用されるため、名前を付けるのがずっと簡単になります。あなたがデザイナーであるなら、開発者は物事を簡単に理解して使用できるようにすることであなたを愛してくれるでしょう。
汎用インターフェースになる可能性があります。
ICrud<T> { }
またはIUserStoreに触発されました。
IStore<T> { }
なぜユーザーCRUDだけではないのですか? CRUDは、「管理」とは対照的に10の意味を持ちません。
それを呼び出す方法は<!> quot; Users <!> quot; (または<!> quot; AuthorizedUsers <!> quot;または<!> quot; CollectionOfUsers <!> quot;)?
UserActions
を使用します。これは、実行したい機能のセットを説明しています。コレクションと呼ぶトラップを回避します(実際には何も収集しないため、単にコレクションを取得します)。
しかし、最初にこの形式でこのクラスを持つことも考え直します。配置しようとしているものが永続マネージャーであるように見えます。この方法で永続化したい他の種類のオブジェクトはありますか?基本クラスに派生できる一般的な機能を抽出できますか?おそらく<!> quot; PersistenceManager
<!> quot;クラスか何か?次に、それが絶対に必要な場合(そしてそれが必要になるかどうかはわかりません)、<!> quot; UserPersistenceManager
<!> quot;を導き出すことができます。それはユーザーオブジェクトだけで動作します。 (必要なものはすべて<=>から実行できるため、必要ないかもしれませんが、特定の実装のみがそれを伝えることができます。)