سؤال

تحاول تجنب شيء مدير مصيدة هنا...

لنفترض أنني سأكتب محرر مستخدم والذي سيسمح للمسؤولين بإنشاء مستخدمين في النظام.وظيفة أساسية جدًا - عرض قائمة بالمستخدمين الحاليين، وإنشاء مستخدم جديد، وتحديث مستخدم حالي، وحذف مستخدم.

لنفترض أيضًا أنني قررت كتابة فصل "أعمال" للتعامل مع عمليات CRUD الأساسية هذه.ربما هذا هو الشكل الذي ستبدو عليه الواجهة:

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

داخل طريقة SaveUser()، على سبيل المثال، أود التحقق من صحة البيانات (باستخدام فئة مختلفة) ثم حفظ البيانات فعليًا في قاعدة البيانات (مرة أخرى باستخدام فئة أخرى).

سؤالي هو ماذا يجب أن أسمي هذا الفصل؟هل هذا الفصل يفعل الكثير وبالتالي يجب علي تقسيمه إلى فصول متعددة؟

هل كانت مفيدة؟

المحلول

التسمية أمر صعب إذا لم يتم احترام SRP :) لكن تسمية الأعضاء غالبًا ما يتم إساءة استخدامها.

في حالتك سأفعل شيئًا مثل هذا:

  • مسؤولية التنفيذ هي تغطية عقد الثبات المحدد
  • "من" تحت النار

يفكر بدون صوت - يتم استمرار للمستخدم ويمكن أن يكون الاسم ذي الصلة iuserrepository - الأساليب ليست أكثر من crud - بسبب حقيقة أن iuserrepository هو للمستخدم ، ليس من الضروري أن يكون لديك المستخدمين ، 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 لمجرد تسميته "المستخدم".

وأي وقت تجد نفسك وضع نفس السلسلة في اسم ما يقرب من كل طريقة، يجب إزالته من أسماء أسلوب ووضع في اسم الفئة.

و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> { }

لماذا لا مجرد CRUD العضو؟ CRUD لها، بدلا من 'إدارة' رقم 10 من المعاني.

وماذا عن اصفا اياه بانه "المستخدمين" (أو "AuthorizedUsers" أو "CollectionOfUsers")؟

وكنت اذهب مع UserActions. هذا يصف مجموعة من الوظائف التي ترغب في القيام به؛ أنه يتجنب فخ اصفا إياه بأنه مجموعة (لأنه لم يكن في الواقع جمع أي شيء، ببساطة باسترداد جمع).

ولكن كنت أيضا إعادة النظر في وجود هذه الفئة في هذا الشكل في المقام الأول. يبدو أن ما كنت أحاول أن يضع في مكان هو مدير الثبات؛ هل هناك أي أنواع أخرى من الكائنات التي كنت تريد الذهاب الى لتستمر على هذا النحو؟ يمكنك استخراج أي وظيفة المشتركة التي يمكن بعد ذلك أن تستمد إلى الفئة الأساسية؟ ربما "PersistenceManager" فئة أو سومساك؟ ثم، إذا كان ذلك ضروريا جدا (وأنا غير متأكد من أنه سيكون)، هل يمكن أن تستمد "UserPersistenceManager" التي من شأنها أن تعمل على كائنات المستخدم وحده. (وأعتقد أنه قد لا يكون من الضروري لأنك قد تكون قادرة على أداء كل ما تحتاجه فقط من PersistenceManager، فقط تنفيذ الخاص بك محددة يمكن أن أقول لكم أنه، على الرغم من.)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top