Правильно ли использовать наследование вместо псевдонимов имен в c #? - PullRequest
5 голосов
/ 29 сентября 2008

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

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

вместо:

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

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

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

Ответы [ 9 ]

11 голосов
/ 29 сентября 2008

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

List<Customer> customerList = new List<Customer>();
6 голосов
/ 29 сентября 2008

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

List<Customer> 

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

CustomerList

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

4 голосов
/ 29 сентября 2008

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

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

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

3 голосов
/ 31 июля 2013

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

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

3 голосов
/ 29 сентября 2008

На самом деле вы не должны использовать либо. Правильный подход в соответствии с руководящими указаниями по разработке структуры заключается в использовании или наследовании от System.Collections.ObjectModel.Collection в открытых API-интерфейсах (список следует использовать только для внутренней реализации).

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

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

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

1 голос
/ 29 сентября 2008

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

1 голос
/ 29 сентября 2008

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

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

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

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

1 голос
/ 29 сентября 2008

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

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

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

1 голос
/ 29 сентября 2008

Это один из тех вопросов "Это зависит".

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

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

...