Вопрос

У меня есть метод класса, который возвращает список сотрудников, по которым я могу выполнить итерацию.Каков наилучший способ вернуть список?Обычно я просто возвращаю ArrayList.Однако, как я понимаю, интерфейсы лучше подходят для такого рода действий.Какой интерфейс был бы лучшим для использования?Кроме того, почему лучше возвращать интерфейс, а не реализацию (скажем, объект ArrayList)?Просто мне кажется, что это требует гораздо больше работы.

Это было полезно?

Решение

Лично я бы использовал Список<Employee> для создания списка на серверной части, а затем используйте ИЛист когда ты вернешься.Когда вы используете интерфейсы, это дает вам возможность гибко изменять реализацию без необходимости изменять, кто использует ваш код.Если бы вы хотели придерживаться ArrayList, это было бы нестандартным ИЛист.

Другие советы

@ Джейсон

С таким же успехом вы можете вернуть IList<> потому что массив на самом деле реализует этот интерфейс.

Лучший способ сделать что-то подобное - вернуть, как вы говорите, список, предпочтительно с использованием дженериков, чтобы это был List<Employee>.

Возврат списка, а не ArrayList означает, что если позже вы решите использовать, скажем, LinkedList , вам не придется изменять какой-либо код, кроме того, с чего вы создаете объект для начала (т.е. вызов "new ArrayList())".

Если все, что вы делаете, это перебираете список, вы можете определить метод, который возвращает список как IEnumerable (для .NET).

Возвращая интерфейс, который предоставляет именно ту функциональность, которая вам нужна, если в будущем появится какой-то новый тип коллекции, который лучше / быстрее / лучше подходит для вашего приложения, пока он по-прежнему реализует IEnumerable, вы можете полностью переписать свой метод, используя новый тип внутри него, без изменения какого-либо кода, который его вызывает.

Есть ли какая-то причина, по которой необходимо заказать коллекцию?Почему бы просто не вернуть IEnumerable<Employee>?Это дает необходимый минимум - если позже вам понадобится какая-то другая форма хранения, например, сумка, Набор, Елка или что-то еще, ваш контракт останется в силе.

Я не согласен с предположением, что лучше вернуть интерфейс.Моя причина в том, что вы хотите максимизировать полезность, которую предоставляет данный блок кода.

Имея это в виду, интерфейс работает для принятия элемента в качестве аргумента.Если параметр функции вызывает массив или ArrayList , это единственное, что вы можете передать ему.Если параметр функции вызывает IEnumerable, он примет любой из них, а также ряд других объектов.Это более полезно

Возвращаемое значение, однако, работает наоборот.Когда вы возвращаете IEnumerable , единственное, что вы можете сделать, это перечислить его.Если у вас есть под рукой список и вы возвращаете его, то код, вызывающий вашу функцию, также может легко выполнять ряд других действий, например, получать количество.

Однако я солидарен с теми, кто советует вам отказаться от ArrayList.Дженерики - это так намного лучше.

Интерфейс - это контракт между реализацией и пользователем реализации.

Используя интерфейс, вы позволяете реализации меняться столько, сколько она захочет, до тех пор, пока она поддерживает контракт для пользователей.

Это также позволяет нескольким реализациям использовать один и тот же интерфейс, чтобы пользователи могли повторно использовать код, который взаимодействует с интерфейсом.

Вы говорите не на том языке, о котором говорите, а на каком -то другом .NETish, тогда возвращать IList не сложнее, чем List или даже ArrayList , хотя простое упоминание этого устаревшего класса заставляет меня думать, что вы говорите не о .NET.

Интерфейс - это, по сути, контракт о том, что класс имеет определенные методы или атрибуты;программирование на интерфейсе, а не на прямой реализации, позволяет создавать более динамичный и управляемый код, поскольку вы можете полностью менять реализации местами, пока "контракт" все еще выполняется.

В случае, который вы описываете, передача интерфейса не дает вам особого преимущества, если бы это был я, я бы передал ArrayList с универсальным типом или передал сам массив:Список.Собрать ()

На самом деле вы не должны возвращать список, если это фреймворк, по крайней мере, не задумываясь об этом, рекомендуемый класс для использования - это Collection .Класс List имеет некоторые улучшения производительности за счет проблем с расширяемостью сервера.На самом деле это правило FxCop.

У вас есть основания для этого в эта статья

Возвращаемый тип для вашего метода должен быть IList<Employee>.

Это означает, что вызывающий ваш метод может использовать все, что IList предлагает, но не может использовать вещи, специфичные для ArrayList.Тогда, если вы почувствуете в какой-то момент, что LinkedList или YourCustomSuperDuperList предлагает лучшую производительность или другие преимущества, вы можете безопасно использовать его в своем методе и не обманывать вызывающих его пользователей.

Это примерно 101 интерфейс.;-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top