В приведенном ниже классе только второй конструктор принимает объект ForumThread. В противном случае устанавливается значение null.
IncrementViewCount()
, LockForumThread()
и другие методы зависят от значения _ft
, отличного от нуля.
Без извлечения нулевой проверки в новый частный метод, есть ли какой-нибудь более простой повторный факторинг, который я могу сделать, или лучший дизайн для защиты от использования неправильного конструктора с этими зависимыми методами?
private readonly IThread _forumLogic;
private readonly ForumThread _ft;
public ThreadLogic(IThread forumLogic)
: this(forumLogic, null)
{
}
public ThreadLogic(IThread forumLogic, ForumThread ft)
{
_forumLogic = forumLogic;
_ft = ft;
}
public void Create(ForumThread ft)
{
_forumLogic.SaveThread(ft);
}
public void IncrementViewCount()
{
if (_ft == null)
throw new NoNullAllowedException("_ft ForumThread is null; this must be set in the constructor");
lock (_ft)
{
_ft.ViewCount = _ft.ViewCount + 1;
_forumLogic.SaveThread(_ft);
}
}
public void LockForumThread()
{
if (_ft == null)
throw new NoNullAllowedException("_ft ForumThread is null; this must be set in the constructor");
_ft.ThreadLocked = true;
_forumLogic.SaveThread(_ft);
}
2 ответа
Если вы реализуете свойство для ForumThread, вы можете выбросить исключение из get, если оно имеет значение null. Это может создать метод в базовом IL, но это не новый частный метод в вашем классе (плюс - что не так с новым методом?)
Почему бы не создать подкласс ThreadLogic и не предоставить дополнительный конструктор и зависимые методы только в подклассе? В качестве альтернативы, если у вас уже есть какая-то иерархия, вы можете использовать шаблон делегирования и декоратора для добавления новых функций. В обоих случаях вы можете проверить null в одном месте: конструктор
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.