Почему мы должны называть параметры метода интерфейса? - PullRequest
21 голосов
/ 23 декабря 2011

В C # мы должны назвать параметры метода интерфейса.

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

interface IRenderable
{
    void Render(GameTime);
}

Я бы сказал, что вышесказанное так же читабельно и значимо, как и ниже:

interface IRenderable
{
    void Render(GameTime gameTime);
}

Существует ли какая-либо техническая причина, по которой требуются имена для параметров методов интерфейса?


Стоит отметить, что реализация метода интерфейса может использовать имена, отличающиеся от имен в методе интерфейса.

Ответы [ 5 ]

19 голосов
/ 23 декабря 2011

Одной из возможных причин может быть использование необязательных параметров.

Если бы мы использовали интерфейс, было бы невозможно указать значения именованных параметров. Пример:

interface ITest
{
    void Output(string message, int times = 1, int lineBreaks = 1);
}

class Test : ITest
{

    public void Output(string message, int numTimes, int numLineBreaks)
    {
        for (int i = 0; i < numTimes; ++i)
        {
            Console.Write(message);
            for (int lb = 0; lb < numLineBreaks; ++lb )
                Console.WriteLine();
        }

    }
}

class Program
{
    static void Main(string[] args)
    {
        ITest testInterface = new Test();
        testInterface.Output("ABC", lineBreaks : 3);
    }
}

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

Только к вашему сведению, в зависимости от того, обращаетесь ли вы к методу Output через интерфейс или через класс, определяется, доступны ли параметры по умолчанию и каково их значение.

11 голосов
/ 23 декабря 2011

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

Как вы упомянули, имена параметров не нужны при реализации интерфейса и могут быть легко переопределены.
Однако, когда использует интерфейс , представьте себе трудность, если ни у одного параметра нет значимых имен! Нет смысла, нет подсказок, ничего, кроме шрифта? Тьфу.
Это должно быть основной причиной того, что имя всегда требуется.

3 голосов
/ 23 декабря 2011

Метод именования параметров интерфейса помогает с самостоятельной документацией:

Например ...

interface IRenderable
{
    void Render(TimeSpan gameTime);
}

... говорит больше чем:

interface IRenderable
{
    void Render(TimeSpan);
}
1 голос
/ 23 декабря 2011

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

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

Однако я думаю, что, вероятно, есть 3 основные причины, почему они были необходимы:

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

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

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

Например, попытка реализовать метод интерфейса:

void Foo(string, string, int)

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

0 голосов
/ 23 декабря 2011

Хорошо, эта возможность кажется слишком легкомысленной, но, может быть, когда вы позволяете Visual Studio реализовать интерфейс и заглушку в свойствах и методах, она знает, как назвать параметры?, VS не имеет проблем с общим наименованием элементов управления ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...