Правильно ли использовать наследование вместо псевдонимов имен в С#?

StackOverflow https://stackoverflow.com/questions/147049

  •  02-07-2019
  •  | 
  •  

Вопрос

Другими словами, правильно ли использовать:

public class CustomerList : System.Collections.Generic.List<Customer>
{
    /// supposed to be empty
}

вместо:

using CustomerList = System.Collections.Generic.List<Customer>

Я бы предпочел использовать первый подход, потому что я просто определил CustomerList один раз, и каждый раз, когда мне нужен список клиентов, я всегда использовал один и тот же тип.С другой стороны, использование подхода с псевдонимами имен не только вынуждает меня везде переопределять его, но также может быть присвоен другой псевдоним каждый раз, когда кто-то захочет его использовать (подумайте о большой команде), и, таким образом, заставит код быть менее читабельным.

Обратите внимание, что в этом случае целью никогда не будет расширение класса, а просто создание псевдонима.

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

Решение

Не делай этого.Когда люди читают:

List<Customer> 

они это сразу понимают.Когда они читают:

CustomerList

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

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

ну, если вы не добавляете какую-либо функциональность в базовый класс, нет смысла создавать объект-оболочку.Если вам действительно нужно, я бы выбрал второй вариант, но почему бы просто не создать переменную?

List<Customer> customerList = new List<Customer>();

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

Помимо простого объявления и использования List<Customer>, в конечном итоге вы захотите передать этот список чему-то другому.Избегайте прохождения бетона List<Customer> и вместо этого передать IList<Customer> или ICollection<Customer> поскольку это сделает эти методы более устойчивыми и их будет легче программировать.

Когда-нибудь в будущем, если вам действительно понадобится класс коллекции CustomerList, вы сможете реализовать ICollection<Customer> или IList<Customer> над ним и продолжать передавать его этим методам, не меняя их и даже не зная лучше.

На самом деле вам не следует использовать ни то, ни другое.А правильный подход в соответствии с рекомендациями по проектированию платформы — использовать или наследовать от System.Collections.ObjectModel.Collection<T> в общедоступных API (List<T> следует использовать только для внутренней реализации).

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

ДОСТАВЛЯТЬ ВОЗВРАЩЕНИЕu003CT> от моделей объектов, чтобы обеспечить стандартный API сбора сбора простой ванили.

Вернуть подкласс коллекцииu003CT> от моделей объектов для обеспечения высокоуровневого API сбора.

Использование наследования для псевдонимов/определения типов имеет проблему, требующую переопределения соответствующих конструкторов.

Поскольку делать это повсюду быстро станет неразумно, вероятно, лучше избегать этого ради последовательности.

Это один из тех вопросов типа «это зависит».

Если вам нужен новый класс, который ведет себя как список клиентов в дополнение к другим вашим требованиям, то наследование — это то, что вам нужно.

Если вы просто хотите использовать список клиентов, используйте переменную.

Если вы просто пытаетесь сэкономить на наборе текста, то используйте последнее.Таким образом, вы не столкнетесь с какими-либо странными проблемами наследования.

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

Лично я бы просто использовал List<Customer> и на этом закончим.

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

List<Customer> customerList = new List<Customer>();

Если вам нужно расширить функциональность, обычно вам следует рассмотреть наследование.

Третья возможность заключается в том, что вам нужно значительно изменить функциональность универсальной конструкции списка, и в этом случае вы можете просто наследовать от IEnumerable.Это сделает класс пригодным для использования в перечислимых операциях (таких как «foreach»), но позволит вам полностью определить все поведение класса.

Экономия на наборе текста для одного программиста вполне может стать кошмаром для следующего программиста.Я бы посоветовал просто правильно набрать общий код, как многие здесь говорили.Это более чистое и точное описание назначения вашего кода, и оно поможет программисту, занимающемуся сопровождением.(Кем бы вы могли быть через шесть месяцев и четыре новых проекта!)

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