|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Хочу в классе хранить коллекцию. Раньше всегда выбирал конкретный тип - список, словарь и т. п. А сейчас вдруг задумался - может, лучше указывать что-нибудь универсальное, типа IEnumerable? Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add. В связи с этим возникла догадка, что я неправильно использую интерфейс. Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных. А интерфейсные типы использовать, например, в параметрах функций для их, функций, большей универсальности. И вообще, интерфейс IEnumerable нужен не для редактирования элементов, а для их чтения через какой-нибудь foreach. Т. е., если где-то в функции идёт последовательная обработка элементов коллекции, то IEnumerable как раз подойдёт в качестве типа параметра. Правильно я рассуждаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 08:13 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Местами близко к правде, но в целом ахинея. Прочитай какую-нибудь теорию по ООП, где рассказывается про назначение классов и интерфейсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 08:51 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных IEnumerable<T> не рассматривал? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 09:18 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Antonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 09:19 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Нужен Add используйте соответствующий интерфейс. http://msdn.microsoft.com/ru-ru/library/63ywd54z.aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 09:45 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320, Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 10:04 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
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.
А какой смысл этого кода? Ведь одно из назначений интерфейса - обобщение. Т. е. чтобы я не менял код, скажем, функции (а у вас что геттер, что Add - функции) при изменении типа коллекции, с которой работает эта функция. А у вас если я у поля HarvestedFoods заменю тип списка на какую-нибудь другую коллекцию, где нет Add, то мне придётся и код функции Add менять. Поэтому я и говорил, что если функция использует коллекцию так, что эта функциональность покрывается интерфейсом, то надо использовать интерфейс, а если не покрывается, то использование интерфейса бессмыслено. Т. е. если я в функции перебираю элементы через foreach, то можно использовать IEnumerable, т. к. все коллекции, реализующие IEnumerable, реализуют и foreach. А если я в функции добавляю элементы по одному через Add, то тут либо другой интерфейс (ICollection, как мне правильно подсказали), либо конкретный тип коллеции, который эту функциональность реализует. Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 10:56 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320Ведь одно из назначений интерфейса - обобщение. Тебе посоветовали что-то прочитать, а не выдумывать бредни. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 11:13 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.Термин инкапсуляция Вам о чём-нибудь говорит? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 11:21 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
skyANAuser7320Наверное, в вашем примере правильнее было бы заменить IEnumerable на ICollection, но тогда смысла в отдельной функции Add нет.Термин инкапсуляция Вам о чём-нибудь говорит? Вы пытаетесь скрыть реализацию добавления элемента в поле-коллекцию класса? Тогда понятно. Только всё равно, не совсем удачная реализация - если заменять тип коллеции, то и реализацию тоже придётся менять. И имеет ли смысл такая мелочная инкапсуляция? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 11:36 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320skyANAпропущено... Термин инкапсуляция Вам о чём-нибудь говорит? Вы пытаетесь скрыть реализацию добавления элемента в поле-коллекцию класса?Нет.user7320Только всё равно, не совсем удачная реализация - если заменять тип коллеции, то и реализацию тоже придётся менять.Зато ничего не надо менять в 100500 местах внешнего кода, где используется класс Hamster.user7320И имеет ли смысл такая мелочная инкапсуляция?Прочитайте комментарии в методе Add. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 11:51 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320, "данные хранить лучше не в интерфейсных типах, а в конкретных" - хранится они все равно будут в конкретных. Лучше чтоб наружу класса конкретные реализации не торчали. Если что, юзайте ICollection<T>, его достаточно в подавляющем большинстве случаев. Я предпочитаю по-дефолту отдавать иэнумерабл и менять интерфейс на более конкретный в случае необходимости, причем если перфоманс проблема в этом куске кода заведомо быть не может - использую линку. (Например метод вернул иэнумерабл, я знаю что внутри лист, а мне нужен каунт, если вопроса производительности в данном месте не стоит - оставлю инумерабл и воспользуюсь екстеншнметодом, предвосхещу - каст делать точно не надо). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 12:28 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
SolYUtoruser7320, Надо различать реализацию и интерфейс класса. Внутри класса надо работать с тем, что удобнее: словарь, список и т.д. А вот принимать на вход и отдавать на выход можно и интерфейсами. +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.03.2013, 22:20 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320Хочу в классе хранить коллекцию. Раньше всегда выбирал конкретный тип - список, словарь и т. п. А сейчас вдруг задумался - может, лучше указывать что-нибудь универсальное, типа IEnumerable? Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add. В связи с этим возникла догадка, что я неправильно использую интерфейс. Т. е. получается, что данные хранить лучше не в интерфейсных типах, а в конкретных. А интерфейсные типы использовать, например, в параметрах функций для их, функций, большей универсальности. И вообще, интерфейс IEnumerable нужен не для редактирования элементов, а для их чтения через какой-нибудь foreach. Т. е., если где-то в функции идёт последовательная обработка элементов коллекции, то IEnumerable как раз подойдёт в качестве типа параметра. Правильно я рассуждаю?Однозначного ответа нет. Всё зависит от задачи и настроения. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 07:08 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user 7320 Ну, выбрал IEnumerable. В конструкторе присваиваю переменной этой коллекции экземпляр списка. Но столкнулся с тем, что теперь при обращении к этой коллекции, когда я, например, хочу заполнить её элементами через последовательное добавление этих элементов (как Add в списке), я должен привести её к конкретному типу. Т. е. если хочу добавлять элементы через Add, то надо приводить к списку и затем вызывать Add. Основное назначение интерфейсов описание сигнатур и поддержка отношения композиции. Поэтому фраза в этом контексте не корректна, для вызова соответствующего метода экземпляра списка (на пример Add) достаточно проверить поддерживает ли класс реализацию интерфейса ( на пример IEnumerable). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.03.2013, 11:21 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
skyANAAntonariy...в целом ахинея. Прочитай какую-нибудь теорию по ООП...+1 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Тогда вот ещё такой вопрос по этому коду и вообще. В методах класса лучше использовать геттеры и сеттеры для полей-данных класса, или сами эти поля-данные? Ну, т. е. конкретно в этом примере понятно, что по смыслу надо использовать harvestedFoods вместо HarvestedFoods. А вообще? Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:15 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
И ещё вопрос по коду Скайана. Будет лучше или хуже, если вместо Код: c# 1.
сделать Код: c# 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:35 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
1. Локальные проперти - это маразм. 2. Зачем тебе в реализации понижаться до IEnumerable? Ещё не понял разницу между реализацией и интерфейсами? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 12:54 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
user7320, что касается моего примера, то вполне очевидно, что Вы не можете использовать свойство HarvestedFoods вместо переменной harvestedFoods, также Вы не можете изменить тип переменной harvestedFoods на IEnumerable<Food>. На IList<Food> и даже на ICollection<Food> можете, а вот на IEnumerable<Food>. Почему? Предлагаю Вам самостоятельно ответить на этот вопрос. Пример-то проще некуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:01 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
МСУ1. Локальные проперти - это маразм.ТС не про локальные спрашивал, а:user7320Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов? Отвечу. Есть. Геттер или сеттер может содержать какую-то логику. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 13:09 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Grigory_RОсновное назначение интерфейсов описание сигнатур и поддержка отношения композиции.Композиция классов не получится? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 17:14 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
skyANAМСУ1. Локальные проперти - это маразм.ТС не про локальные спрашивал, а:user7320Есть ли смысл использовать геттеры и сеттеры внутри класса, или они только для внешних клиентов? Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.А если логика не нужна? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 17:16 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Алексей КskyANAпропущено... ТС не про локальные спрашивал, а:пропущено... Отвечу. Есть. Геттер или сеттер может содержать какую-то логику.А если логика не нужна? на проперти можно поставить точку останова, на филде нет ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 17:35 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
если есть проперти то доступ к полю даже изнутри класса только через него ... |
|||
:
Нравится:
Не нравится:
|
|||
15.03.2013, 17:56 |
|
Какие лучше иметь данные-коллекции в классах - конкретные или интерфейсы?
|
|||
---|---|---|---|
#18+
Denis.если есть проперти то доступ к полю даже изнутри класса только через него Это утверждение или рекомендация? Если первое, то это неправда. А если второе, то почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2013, 15:49 |
|
|
start [/forum/topic.php?fid=20&msg=38182949&tid=1404986]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 156ms |
0 / 0 |