Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы? / 25 сообщений из 61, страница 1 из 3
13.03.2013, 08:13
    #38182427
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Хочу в классе хранить коллекцию. Раньше всегда выбирал конкретный тип - список, словарь и т. п. А сейчас вдруг задумался - может, лучше указывать что-нибудь универсальное, типа IEnumerable?

Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add.

В связи с этим возникла догадка, что я неправильно использую интерфейс. Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных. А интерфейсные типы использовать, например, в параметрах функций для их, функций, большей универсальности. И вообще, интерфейс IEnumerable нужен не для редактирования элементов, а для их чтения через какой-нибудь foreach. Т. е., если где-то в функции идёт последовательная обработка элементов коллекции, то IEnumerable как раз подойдёт в качестве типа параметра. Правильно я рассуждаю?
...
Рейтинг: 0 / 0
13.03.2013, 08:51
    #38182459
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Местами близко к правде, но в целом ахинея. Прочитай какую-нибудь теорию по ООП, где рассказывается про назначение классов и интерфейсов.
...
Рейтинг: 0 / 0
13.03.2013, 09:18
    #38182491
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных
IEnumerable<T> не рассматривал?
...
Рейтинг: 0 / 0
13.03.2013, 09:19
    #38182492
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Antonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Food
{
    // ...
}

public class Hamster
{
    private List<Food> harvestedFoods = new List<Food>();

    public IEnumerable<Food> HarvestedFoods
    {
        get { return harvestedFoods; }
    }

    public void Add(Food food)
    {
        // Тут хомяк может посолить, поперчить, проверить,
        // а не тухлая-ли еда попалась, перед тем как отложить впрок...
        harvestedFoods.Add(food); 
    }
}
...
Рейтинг: 0 / 0
13.03.2013, 09:45
    #38182521
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Нужен Add используйте соответствующий интерфейс.
http://msdn.microsoft.com/ru-ru/library/63ywd54z.aspx
...
Рейтинг: 0 / 0
13.03.2013, 10:04
    #38182562
SolYUtor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320,

Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами.
...
Рейтинг: 0 / 0
13.03.2013, 10:56
    #38182644
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
SolYUtoruser7320,

Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами.
Ну да, это я и имел ввиду. А "принимать" и "отдавать" можно же только функциями (в которые входят и конструкторы)? Вот я и говорю, что использовать интерфейсы лучше в параметрах функций, а хранить данные - не в интерфейсах, а в конкретных типах.

Изопропилuser7320Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных
IEnumerable<T> не рассматривал?
Так я изначально его и подразумевал. Про конкретику я имел ввиду List<T>, Array<T> и т. п. вместо IEnumerable<T>.

skyANAAntonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Food
{
    // ...
}

public class Hamster
{
    private List<Food> harvestedFoods = new List<Food>();

    public IEnumerable<Food> HarvestedFoods
    {
        get { return harvestedFoods; }
    }

    public void Add(Food food)
    {
        // Тут хомяк может посолить, поперчить, проверить,
        // а не тухлая-ли еда попалась, перед тем как отложить впрок...
        harvestedFoods.Add(food); 
    }
}


А какой смысл этого кода? Ведь одно из назначений интерфейса - обобщение. Т. е. чтобы я не менял код, скажем, функции (а у вас что геттер, что Add - функции) при изменении типа коллекции, с которой работает эта функция. А у вас если я у поля HarvestedFoods заменю тип списка на какую-нибудь другую коллекцию, где нет Add, то мне придётся и код функции Add менять. Поэтому я и говорил, что если функция использует коллекцию так, что эта функциональность покрывается интерфейсом, то надо использовать интерфейс, а если не покрывается, то использование интерфейса бессмыслено. Т. е. если я в функции перебираю элементы через foreach, то можно использовать IEnumerable, т. к. все коллекции, реализующие IEnumerable, реализуют и foreach. А если я в функции добавляю элементы по одному через Add, то тут либо другой интерфейс (ICollection, как мне правильно подсказали), либо конкретный тип коллеции, который эту функциональность реализует.

Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.
...
Рейтинг: 0 / 0
13.03.2013, 11:13
    #38182688
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320Ведь одно из назначений интерфейса - обобщение. Тебе посоветовали что-то прочитать, а не выдумывать бредни.
...
Рейтинг: 0 / 0
13.03.2013, 11:21
    #38182717
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.Термин инкапсуляция Вам о чём-нибудь говорит?
...
Рейтинг: 0 / 0
13.03.2013, 11:36
    #38182746
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
skyANAuser7320Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.Термин инкапсуляция Вам о чём-нибудь говорит?
Вы пытаетесь скрыть реализацию добавления элемента в поле-коллекцию класса? Тогда понятно. Только всё равно, не совсем удачная реализация - если заменять тип коллеции, то и реализацию тоже придётся менять. И имеет ли смысл такая мелочная инкапсуляция?
...
Рейтинг: 0 / 0
13.03.2013, 11:51
    #38182784
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320skyANAпропущено...
Термин инкапсуляция Вам о чём-нибудь говорит?
Вы пытаетесь скрыть реализацию добавления элемента в поле-коллекцию класса?Нет.user7320Только всё равно, не совсем удачная реализация - если заменять тип коллеции, то и реализацию тоже придётся менять.Зато ничего не надо менять в 100500 местах внешнего кода, где используется класс Hamster.user7320И имеет ли смысл такая мелочная инкапсуляция?Прочитайте комментарии в методе Add.
...
Рейтинг: 0 / 0
13.03.2013, 12:28
    #38182882
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320,

"данные хранить лучше не в интерфейсных типах, а в конкретных" - хранится они все равно будут в конкретных.
Лучше чтоб наружу класса конкретные реализации не торчали. Если что, юзайте ICollection<T>, его достаточно в подавляющем большинстве случаев. Я предпочитаю по-дефолту отдавать иэнумерабл и менять интерфейс на более конкретный в случае необходимости, причем если перфоманс проблема в этом куске кода заведомо быть не может - использую линку. (Например метод вернул иэнумерабл, я знаю что внутри лист, а мне нужен каунт, если вопроса производительности в данном месте не стоит - оставлю инумерабл и воспользуюсь екстеншнметодом, предвосхещу - каст делать точно не надо).
...
Рейтинг: 0 / 0
13.03.2013, 22:20
    #38182949
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
SolYUtoruser7320,

Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами.
+1
...
Рейтинг: 0 / 0
14.03.2013, 07:08
    #38183146
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320Хочу в классе хранить коллекцию. Раньше всегда выбирал конкретный тип - список, словарь и т. п. А сейчас вдруг задумался - может, лучше указывать что-нибудь универсальное, типа IEnumerable?

Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add.

В связи с этим возникла догадка, что я неправильно использую интерфейс. Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных. А интерфейсные типы использовать, например, в параметрах функций для их, функций, большей универсальности. И вообще, интерфейс IEnumerable нужен не для редактирования элементов, а для их чтения через какой-нибудь foreach. Т. е., если где-то в функции идёт последовательная обработка элементов коллекции, то IEnumerable как раз подойдёт в качестве типа параметра. Правильно я рассуждаю?Однозначного ответа нет. Всё зависит от задачи и настроения.
...
Рейтинг: 0 / 0
14.03.2013, 11:21
    #38183445
Grigory_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user 7320 Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add.

Основное назначение интерфейсов описание сигнатур и поддержка отношения композиции. Поэтому фраза
в этом контексте не корректна, для вызова соответствующего метода экземпляра списка (на пример Add) достаточно
проверить поддерживает ли класс реализацию интерфейса ( на пример IEnumerable).
...
Рейтинг: 0 / 0
15.03.2013, 12:15
    #38185377
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
skyANAAntonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public class Food
{
    // ...
}

public class Hamster
{
    private List<Food> harvestedFoods = new List<Food>();

    public IEnumerable<Food> HarvestedFoods
    {
        get { return harvestedFoods; }
    }

    public void Add(Food food)
    {
        // Тут хомяк может посолить, поперчить, проверить,
        // а не тухлая-ли еда попалась, перед тем как отложить впрок...
        harvestedFoods.Add(food); 
    }
}


Тогда вот ещё такой вопрос по этому коду и вообще. В методах класса лучше использовать геттеры и сеттеры для полей-данных класса, или сами эти поля-данные? Ну, т. е. конкретно в этом примере понятно, что по смыслу надо использовать harvestedFoods вместо HarvestedFoods. А вообще? Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов?
...
Рейтинг: 0 / 0
15.03.2013, 12:35
    #38185422
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
И ещё вопрос по коду Скайана. Будет лучше или хуже, если вместо

Код: c#
1.
private List<Food> harvestedFoods = new List<Food>();



сделать

Код: c#
1.
private IEnumerable<Food> harvestedFoods = new List<Food>();



?
...
Рейтинг: 0 / 0
15.03.2013, 12:54
    #38185470
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
1. Локальные проперти - это маразм.
2. Зачем тебе в реализации понижаться до IEnumerable? Ещё не понял разницу между реализацией и интерфейсами?
...
Рейтинг: 0 / 0
15.03.2013, 13:01
    #38185486
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
user7320, что касается моего примера, то вполне очевидно, что Вы не можете использовать свойство HarvestedFoods вместо переменной harvestedFoods, также Вы не можете изменить тип переменной harvestedFoods на IEnumerable<Food>.
На IList<Food> и даже на ICollection<Food> можете, а вот на IEnumerable<Food>.
Почему? Предлагаю Вам самостоятельно ответить на этот вопрос. Пример-то проще некуда.
...
Рейтинг: 0 / 0
15.03.2013, 13:09
    #38185499
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
МСУ1. Локальные проперти - это маразм.ТС не про локальные спрашивал, а:user7320Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов?

Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.
...
Рейтинг: 0 / 0
15.03.2013, 17:14
    #38186024
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Grigory_RОсновное назначение интерфейсов описание сигнатур и поддержка отношения композиции.Композиция классов не получится?
...
Рейтинг: 0 / 0
15.03.2013, 17:16
    #38186030
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
skyANAМСУ1. Локальные проперти - это маразм.ТС не про локальные спрашивал, а:user7320Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов?

Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.А если логика не нужна?
...
Рейтинг: 0 / 0
15.03.2013, 17:35
    #38186064
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Алексей КskyANAпропущено...
ТС не про локальные спрашивал, а:пропущено...


Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.А если логика не нужна?

на проперти можно поставить точку останова, на филде нет
...
Рейтинг: 0 / 0
15.03.2013, 17:56
    #38186114
Denis.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
если есть проперти то доступ к полю даже изнутри класса только через него
...
Рейтинг: 0 / 0
18.03.2013, 15:49
    #38188179
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
Denis.если есть проперти то доступ к полю даже изнутри класса только через него
Это утверждение или рекомендация? Если первое, то это неправда. А если второе, то почему?
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы? / 25 сообщений из 61, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]