[C#] DIP/ISP и коллекции
От: Аноним  
Дата: 22.06.11 09:28
Оценка:
Здравствуйте, уважаемые коллеги!
Делаю рефакторинг нектороых частей проекта в соответствии с 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

Кто с этим сталкивался? как лучше вы решаете данную задачу?
Спасибо.
Re: [C#] DIP/ISP и коллекции
От: Аноним  
Дата: 22.06.11 09:53
Оценка:
Не очень понятно, в чем проблема.

У вас фактически коллекция IDataColumn. Почему не убрать все упоминания о конкретной реализации, DataColumn?
Или в конструкторе DataColumn делается deep copy из интерфейса, для обеспечения целостности внутреннего состояния?
Или вы наоборот, хотите подчеркнуть что DataColumnGroup это конкретная реализация для типа DataColumn, и хранить IDataColumn
там некорректно, и добавляете cast в качестве проверки?
Re: [C#] DIP/ISP и коллекции
От: dorofeevilya Россия  
Дата: 22.06.11 09:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, уважаемые коллеги!

А>Делаю рефакторинг нектороых частей проекта в соответствии с 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> и вставлять в него непосредственно элементы, приходящие из аргументов соотв. метода?
Re[2]: [C#] DIP/ISP и коллекции
От: Аноним  
Дата: 22.06.11 10:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Не очень понятно, в чем проблема.


А>У вас фактически коллекция IDataColumn. Почему не убрать все упоминания о конкретной реализации, DataColumn?

А>Или в конструкторе DataColumn делается deep copy из интерфейса, для обеспечения целостности внутреннего состояния?
Да, именно так.
Re[2]: [C#] DIP/ISP и коллекции
От: Аноним  
Дата: 22.06.11 10:11
Оценка:
Здравствуйте, dorofeevilya, Вы писали:

D>Сначала объясни, в чем смысл

D>
D>new DataColumn(dataColumn)
D>
?

поэтому:
А>в конструкторе DataColumn делается deep copy из интерфейса, для обеспечения целостности внутреннего состояния

А вообще, видимо, просто буду хранить список ссылок как на IDataColumn. Тут ещё кусок кода переделали -- много чего на свои места встало.

Спасибо, кто ответил!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.