Интерфейс и частичные классы - PullRequest
2 голосов
/ 10 апреля 2010

Согласно правилу SA1201 в StyleCop элементы в классе должны появляться в правильном порядке.
Порядок следующий:

 Fields  
 Constructors  
 Finalizers (Destructors)  
 Delegates  
 Events  
 Enums  
 Interfaces  
 Properties  
 Indexers  
 Methods  
 Structs  
 Classes 

Все в порядке, кроме части Интерфейсы, потому что Интерфейс может содержать методы, события, свойства и т. Д ...
Если мы хотим строго соблюдать это правило, у нас не будет всех членов интерфейса в одном месте, что часто очень полезно. Согласно справке StyleCop эту проблему можно решить, разбив класс на частичные классы.

Пример:

/// <summary>
/// Represents a customer of the system.
/// </summary>
public partial class Customer
{
    // Contains the main functionality of the class.
}

/// <content>
/// Implements the ICollection class.
/// </content>
public partial class Customer : ICollection
{
    public int Count 
    { 
        get { return this.count; }
    }

    public bool IsSynchronized 
    { 
        get { return false; }
    }

    public object SyncRoot 
    { 
        get { return null; }
    }

    public void CopyTo(Array array, int index)
    {
        throw new NotImplementedException();
    }
}

Есть ли другие хорошие решения этой проблемы?

Ответы [ 3 ]

3 голосов
/ 10 апреля 2010

Полагаю (*), что явные реализации интерфейса должны быть сгруппированы вместе (ниже событий), и правило применяется только к неявным реализациям интерфейса. Я думаю, что правило имеет некоторый смысл, потому что если вы реализуете интерфейс неявно , он становится частью открытого интерфейса класса, поэтому члены интерфейса логически также являются частью класса ( и поэтому вы не должны отделять их от остальной части класса).

С другой стороны, если вы используете явные реализации , вы говорите, что хотите реализовать интерфейс, не делая его частью класса. В этом случае имеет смысл хранить его отдельно от остальных членов.

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

Тем не менее, если вы считаете, что лучше сгруппировать элементы интерфейса вместе, то я, вероятно, предпочел бы просто игнорировать правило StyleCop вместо использования частичных классов (что кажется мне безумным обходным решением). В конце концов, StyleCop дает вам только совет ...

(*) Если мое предположение неверно, то я, вероятно, просто проигнорирую правило: -).

1 голос
/ 10 апреля 2010

Лично я не вижу огромной ценности в этом типе правил, но это только я. Но он звучит , как будто речь идет о вложенных типах (он говорит "интерфейсы", а не "реализации интерфейса"), т.е.

class Foo {
    //...
    public interface IBar {...}
    //...
}

(так как другое сравнение - перечисления)

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

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

0 голосов
/ 10 апреля 2010

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

...