Этот вопрос вызвал у меня дискуссию, поэтому Euro Micelli уже знает мой ответ, но вот он! :)
Я думаю, что Linq to Objects уже дает отличный ответ на этот вопрос. Используя самый простой интерфейс для последовательности элементов, он может обеспечить максимальную гибкость в отношении того, как реализовать эту последовательность, что позволяет создавать ленивые, повышая производительность без ущерба для производительности (ни в каком реальном смысле).
Это правда, что преждевременная абстракция может иметь стоимость - но в основном это стоимость открытия / изобретения новых абстракций. Но если у вас уже есть совершенно хорошие из них, то вы бы с ума сошли, если бы не воспользовались ими, и это то, что предоставляет вам универсальные интерфейсы сбора.
Есть те, кто скажет вам, что все данные в классе «проще» сделать общедоступными, на тот случай, если вам понадобится доступ к ним. Точно так же Евро посоветовал, что было бы лучше использовать богатый интерфейс для контейнера, такого как IList<T>
(или даже конкретный класс List<T>
), а затем вычистить беспорядок.
Но я думаю, так же, как лучше скрыть члены-данные класса, к которым вы не хотите обращаться, чтобы потом можно было легко модифицировать реализацию этого класса, поэтому вам следует использовать самый простой доступный интерфейс ссылаться на последовательность пунктов. На практике легче начать с разоблачения чего-то простого и простого, а затем «ослабить» его позже, чем начинать с чего-то нездорового и изо всех сил пытаться навести порядок в нем.
Итак, предположим, IEnumerable<T>
будет представлять последовательность. Затем в тех случаях, когда вам нужно Add
или Remove
элементов (но при этом поиск по индексу по-прежнему не требуется), используйте IContainer<T>
, который наследует IEnumerable<T>
и, таким образом, будет идеально совместим с вашим другим кодом.
Таким образом, будет совершенно ясно (только из локальной проверки какого-либо кода), что именно этот код сможет делать с данными.
Небольшие программы требуют меньше абстракций, это правда. Но если они успешны, они, как правило, становятся большими программами. Это намного проще, если они используют простые абстракции.