2009-04-16 3 views
0

Ситуация такова.Как назвать коллекцию интерфейса?

public interface IFoo { } 

public abstract class FooBase : IFoo { } 

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

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

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

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

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

UPDATE

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

ответ

10

Мне нравится FooCollection у вас есть коллекция концептуального объекта «Foo», даже если нет соответствующего класса или интерфейса Foo. Это соответствует IFoo - это интерфейс «Foo», даже если нет класса Foo. SpecialFoo будет особым видом «Foo», хотя нет класса Foo.

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

0

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

0

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

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

Идентификатор, вероятно, идет с IFooCollection.

0

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

7

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

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

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

0

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

0

Как насчет CollectionOfIFoo?

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

Смежные вопросы