Есть ли существенная механическая разница между этими имитациями моделирования параметров по умолчанию? - PullRequest
1 голос
/ 28 мая 2010

В C # 4.0 появилась очень интересная и полезная вещь, позволяющая использовать параметры по умолчанию в методах. Но C # 3.0 нет. Поэтому, если я хочу смоделировать «параметры по умолчанию», мне нужно создать два таких метода, один с этими аргументами и один без этих аргументов. Есть два способа сделать это.

Версия A - вызов другого метода

public string CutBetween(string str, string left, string right, bool inclusive)
{
    return str.CutAfter(left, inclusive).CutBefore(right, inclusive);
}

public string CutBetween(string str, string left, string right)
{
    return CutBetween(str, left, right, false);
}

Версия B - Копировать тело метода

public string CutBetween(string str, string left, string right, bool inclusive)
{
    return str.CutAfter(left, inclusive).CutBefore(right, inclusive);
}

public string CutBetween(string str, string left, string right)
{
    return str.CutAfter(left, false).CutBefore(right, false);
}

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

Ответы [ 3 ]

4 голосов
/ 28 мая 2010

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

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

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

1 голос
/ 28 мая 2010

Там не будет никакой разницы в поведении, нет - но версия B не очевидно просто применение по умолчанию. Вам нужно внимательно прочитать код, чтобы убедиться, что нет тонких различий. Я думаю, что лучше направлять любые значения по умолчанию через один «мастер» метод, содержащий реальную логику. Это также облегчает изменение логики позже - вам нужно сделать это только в одном месте.

1 голос
/ 28 мая 2010

Одно отличие состоит в том, что если сигнатура CutAfter или CutBefore по какой-либо причине изменяется в первой версии, вам нужно обновить только одну строку, тогда как во второй версии вам нужно обновить столько строк, сколько у вас есть методов.

...