Здравствуйте, уважаемые коллеги!
Делаю рефакторинг нектороых частей проекта в соответствии с DIP (Dependecy-Inversion Principle) и ISP. Вот пример:
public interface IDataColumnGroup
{
/// <summary>
/// Название группы
/// </summary>
string GroupName { get; set; }
/// <summary>
/// Возвращает количество колонок в группе
/// </summary>
int Count { get; }
/// <summary>
/// Getter колонки
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
IDataColumn GetDataColumn(int index);
/// <summary>
/// Setter колонки
/// </summary>
/// <param name="index"></param>
/// <param name="dataColumn"></param>
void SetDataColumn(int index, IDataColumn dataColumn);
/// <summary>
/// Вставляет (добавляет) колонку в указанную позицию
/// </summary>
/// <param name="index"></param>
/// <param name="dataColumn"></param>
void InsertDataColumn(int index, IDataColumn dataColumn);
/// <summary>
/// Удаляет колонку из указанной позиции
/// </summary>
/// <param name="index"></param>
void RemoveAtDataColumn(int index);
/// <summary>
/// Очищает список колонок, входящих в данную группу
/// </summary>
void ClearGroup();
}
От этого интерфейса, по идее, должен быть класс DataColumnGroup:
public class DataColumnGroup : IDataColumnGroup
{
#region IDataColumnGroup implementation
public string GroupName { get; set; }
public int Count
{
get { return _columns.Count; }
}
public IDataColumn GetDataColumn(int idx)
{
return (IDataColumn)this[idx];
}
public void SetDataColumn(int idx, IDataColumn dataColumn)
{
this[idx] = new DataColumn(dataColumn);
}
public void InsertDataColumn(int idx, IDataColumn dataColumn)
{
_columns.Insert(idx, new DataColumn(dataColumn));
}
public void RemoveAtDataColumn(int idx)
{
_columns.RemoveAt(idx);
}
public void ClearGroup()
{
_columns.Clear();
}
#endregion IDataColumnGroup implementation
protected List<DataColumn> _columns = new List<DataColumn>();
public DataColumn this[int idx]
{
get
{
return _columns[idx];
}
set
{
_columns[idx] = value;
}
}
}
Выделенное, уж
очень смущает. Тем более, что IDataColumn могут реализовывать множество классов, которые никакими родственными отношениями не связаны с DataColumn.
Пока, единственный вариант — это делать что-то похожее на это:
protected List<IDataColumn> _columns = new List<IDataColumn>();
и, соответственно, где нужно прописывать
(DataColumn)value
Кто с этим сталкивался? как лучше вы решаете данную задачу?
Спасибо.
Не очень понятно, в чем проблема.
У вас фактически коллекция IDataColumn. Почему не убрать все упоминания о конкретной реализации, DataColumn?
Или в конструкторе DataColumn делается deep copy из интерфейса, для обеспечения целостности внутреннего состояния?
Или вы наоборот, хотите подчеркнуть что DataColumnGroup это конкретная реализация для типа DataColumn, и хранить IDataColumn
там некорректно, и добавляете cast в качестве проверки?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, уважаемые коллеги!
А>Делаю рефакторинг нектороых частей проекта в соответствии с DIP (Dependecy-Inversion Principle) и ISP. Вот пример:
А>От этого интерфейса, по идее, должен быть класс DataColumnGroup:
А>А> public class DataColumnGroup : IDataColumnGroup
А> {
А> #region IDataColumnGroup implementation
А> public string GroupName { get; set; }
А> public int Count
А> {
А> get { return _columns.Count; }
А> }
А> public IDataColumn GetDataColumn(int idx)
А> {
А> return (IDataColumn)this[idx];
А> }
А> public void SetDataColumn(int idx, IDataColumn dataColumn)
А> {
А> this[idx] = new DataColumn(dataColumn);
А> }
А> public void InsertDataColumn(int idx, IDataColumn dataColumn)
А> {
А> _columns.Insert(idx, new DataColumn(dataColumn));
А> }
А> public void RemoveAtDataColumn(int idx)
А> {
А> _columns.RemoveAt(idx);
А> }
А> public void ClearGroup()
А> {
А> _columns.Clear();
А> }
А> #endregion IDataColumnGroup implementation
А> protected List<DataColumn> _columns = new List<DataColumn>();
А> public DataColumn this[int idx]
А> {
А> get
А> {
А> return _columns[idx];
А> }
А> set
А> {
А> _columns[idx] = value;
А> }
А> }
А> }
А>
А>Выделенное, уж очень смущает. Тем более, что IDataColumn могут реализовывать множество классов, которые никакими родственными отношениями не связаны с DataColumn.
А>Пока, единственный вариант — это делать что-то похожее на это:
А>А>protected List<IDataColumn> _columns = new List<IDataColumn>();
А>
А>и, соответственно, где нужно прописывать (DataColumn)value
А>Кто с этим сталкивался? как лучше вы решаете данную задачу?
А>Спасибо.
Сначала объясни, в чем смысл
new DataColumn(dataColumn)
?
Почему нельзя использовать List<IDataColumn> и вставлять в него непосредственно элементы, приходящие из аргументов соотв. метода?
Здравствуйте, dorofeevilya, Вы писали:
D>Сначала объясни, в чем смысл
D>D>new DataColumn(dataColumn)
D>
?
поэтому:
А>в конструкторе DataColumn делается deep copy из интерфейса, для обеспечения целостности внутреннего состояния
А вообще, видимо, просто буду хранить список ссылок как на IDataColumn. Тут ещё кусок кода переделали -- много чего на свои места встало.
Спасибо, кто ответил!