Как назвать коллекцию интерфейса? - PullRequest
0 голосов
/ 16 апреля 2009

Ситуация следующая.

public interface IFoo { }

public abstract class FooBase : IFoo { }

Теперь мне нужен набор IFoo с некоторыми дополнительными методами.

public class IFooCollection : List<IFoo>
{
   public void UsefullMethod() { }
}

Проблема в том, что IFooCollection выглядит как интерфейс, а это класс. Возможны следующие варианты.

  1. Держите это IFooCollection - мне это не нравится, потому что это похоже на интерфейс.
  2. Назовите это FooCollection - Мне это не нравится, потому что это не коллекция foos.
  3. Преврати его в FooBaseCollection, потому что все реализации IFoo происходят от FooBase - мне это не нравится, потому что это не может быть правдой вечно.
  4. Ни в коем случае не создавайте класс, а предоставляйте методы расширения для IList<IFoo>, потому что есть только методы, заполненные от руки - мне это не нравится, потому что вы меняете код, потому что вы не можете найти имя для класса ... да, это противно.
  5. Что-то, о чем я не думал или забыл записать - надеюсь, мне понравится!

Так что бы вы сделали? Есть ли соглашение об именах, которое я пропустил? Мы в основном используем эти Стандарты Microsoft .NET Library .

UPDATE

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

Ответы [ 7 ]

10 голосов
/ 16 апреля 2009

Мне нравится FooCollection, у вас есть коллекция концептуального объекта "Foo", даже если нет фактического класса или интерфейса Foo. Это в соответствии с IFoo является интерфейсом "Foo", даже если нет класса Foo. SpecialFoo будет особенным видом "Foo", даже если нет класса Foo.

Я определенно согласен с тем, что IFooCollection неверно из-за подразумеваемого интерфейса.

7 голосов
/ 16 апреля 2009

FooCollection - с Foo это не очевидно, поскольку Foo не имеет смысла, поэтому его сложно осмыслить. Попробуйте это с «реальным» именем класса / интерфейса, и это будет иметь больше смысла - например,

public class ErrorHandlerCollection : List<IErrorHandler>
{
  public void PublishErrors(){//...}
}

Это имеет смысл, потому что ErrorHandlerCollection представляет собой набор обработчиков ошибок. Все, что реализует IErrorHandler, является обработчиком ошибок, поэтому все, что в ErrorHandlerCollection, будет обработчиком ошибок.

0 голосов
/ 17 апреля 2009

Как насчет CollectionOfIFoo?

Лично мне не нравится соглашение о добавлении префиксов интерфейсов к «I» - это в основном форма плохого вида венгерской нотации, и это пример того, почему это плохо.

0 голосов
/ 16 апреля 2009

IMO # 2 - это правильное наименование, хотя я бы также предложил FooList, поскольку вы производите от List.

0 голосов
/ 16 апреля 2009

Лично мне нравится идея использования методов расширения. Если вы беспокоитесь о том, что люди могут легко найти методы расширения, просто поместите их в статический класс в том же файле кода, что и интерфейс IFoo. Или создайте класс «IFooExtensions» в отдельном файле в том же пространстве имен, чтобы было легко определить, когда люди смотрят на «IFoo»

0 голосов
/ 16 апреля 2009

Вы действительно определили большинство вариантов.

Единственное, о чем я мог подумать, это CollectionOfIFoo, но это не соответствует соглашениям.

Id, вероятно, идет с IFooCollection.

0 голосов
/ 16 апреля 2009

Мне на самом деле нравится # 4 больше, чем создание собственного типа коллекции, потому что в конечном итоге пользователи захотят вставить свои объекты, реализующие IFoo, в свои собственные списки и другие коллекции. Таким образом, эти коллекции будут работать как положено.

...