Рассмотрим инкапсуляцию коллекции атрибутов внутри YourCustomClass. Это защитит ваши атрибуты от случайного изменения и переместит атрибуты, заполняющие логику, к данным, которым они принадлежат.
Преимущества:
- Вы можете в любое время изменить реализацию заполнения атрибутов, не меняя клиентов (условия, сбор предикатов и т. Д.).
- Гораздо более чистый клиент
- Более простое обслуживание
Таким образом, даже при использовании по умолчанию реализация будет выглядеть следующим образом:
dc.SetStaus(string statusFlag)
И вся грязная работа будет выполняться внутри dc (кстати, я советую использовать enum CD вместо констант, но это зависит от вас):
public void SetStatus(string statusFlag)
{
if (_xmlAttributes == null)
_xmlAttributes = new Dictionary<CD, string>();
_xmlAttributes.Add(CD.CD_1, statusFlag);
_xmlAttributes.Add(CD.CD_2, statusFlag);
_xmlAttributes.Add(CD.CD_3, statusFlag);
if (_primaryZone != null)
_xmlAttributes.Add(CD.CD_4, statusFlag);
if (_mgr1 != null)
_xmlAttributes.Add(CD.CD_10, statusFlag);
if (_mgr2 != null)
_xmlAttributes.Add(CD.CD_11, statusFlag);
if (_mgr3 != null)
_xmlAttributes.Add(CD.CD_5, statusFlag);
if (_producer != null)
_xmlAttributes.Add(CD.CD_6, statusFlag);
if (_countTest > 0)
_xmlAttributes.Add(CD.CD_7, statusFlag);
if (_list1 != null && _list1.Count > 0)
_xmlAttributes.Add(CD.CD_8, statusFlag);
if (_list2 != null && _list2.Count > 0)
_xmlAttributes.Add(CD.CD_9, statusFlag);
}
После этого вы можете легко изменить реализацию:
private Dictionary<CD, Func<bool>> _statusSetConditions;
public MyCustomType()
{
_statusSetConditions = new Dictionary<CD, Func<bool>>();
_statusSetConditions.Add(CD.CD_1, () => true);
_statusSetConditions.Add(CD.CD_2, () => true);
_statusSetConditions.Add(CD.CD_3, () => true);
_statusSetConditions.Add(CD.CD_4, () => _primaryZone != null);
...
_statusSetConditions.Add(CD.CD_11, () => _mgr2 != null);
}
public void SetStatus(string statusFlag)
{
if (_xmlAttributes == null)
_xmlAttributes = new Dictionary<CD, string>();
foreach (CD cd in Enum.GetValues(typeof(CD)))
AddStatusAttribute(cd, statusFlag);
}
private void AddStatusAttribute(CD cd, string statusFlag)
{
Func<bool> condition;
if (!_statusSetConditions.TryGetValue(cd, out condition))
return; // or throw exception
if (condition())
_xmlAttributes.Add(cd, statusFlag);
}
А клиент все еще просто вызывает dc.SetStatus (statusFlag);
Возможно, после инкапсуляции этой логики установки статуса, вы просто сохраните статус в поле YourCustomClass.