В данной статье поговорим о новых возможностях, которые были добавлены относительно недавно в .Net 4. А именно, об именованных и необязательных (опциональных) параметрах методов, а так же разбавим статью обсуждением об удобочитаемости исходного кода.
Думаю каждый программист сталкивался (если не сталкивались, то столкнется обязательно) и не раз с вызовами методов, в качестве аргументов которым передаются какие-то загадочные числа, строки и т.д. Пример такого кода:
-
int value = someMethodWithParams(3, true);
Что обозначает первый аргумент равный 3 и второй — true. Не понятно совсем. Какие-то магические значения. Ладно если код писали вы чисто для себя и никто его не увидит ( хотя к такому стилю программирования не надо себя приучать), но дело даже не в этом…Через несколько месяцев вы не сразу вспомните что к чему. А если вы пишете в команде разработчиков? Другому программисту совсем непонятно, что здесь написано и он в любом случае полезет в определение метода, чтобы разобраться как всё устроено.
В общем проблема ясна. Теперь посмотрим, как можно избавиться от подобного кода.
Именованные константы
Во-первых, можно вместо загадочных параметров добавить в код именованные константы.
Приведенный выше код тогда может принять следующий вид:
-
-
const int countOfSortElements = 3;
-
const bool ascending = true;
-
//…int value = someMethodWithParams(countOfSortElements , ascending);
-
Вот теперь код стал немного понятнее. Наши константы, вернее их имена, поясняют их назначение. Допустим наш метод сортирует последовательность элементов и мы ему передаем в качестве первого параметра — количество сортируемых элементов, в качестве второго — в каком порядке сортировать (по возрастанию, убыванию).
Такой подход подходит конечно не во всех случаях. И основным его недостатком является то, что приходится определять новые переменный и исходный код увеличивается за счет этого.
Перечисления
Данный подход стоит использовать не во всех случаях, а только лишь при ограниченном числе значений. Допустим второй аргумент в нашем примере мы можем заменить перечислением, а вот первый заменять не имеет смысла, поскольку число элементов для сортировки у нас может быть от нуля и до бесконечности по большому счету. Посмотрим на следующий пример с перечислениями.
-
-
enum SortOrder {Ascending = true, Descending = false;}
-
const int countOfSortElements = 3;
-
//…
-
int value = someMethodWithParams(countOfSortElements , SortOrder.Ascending);
-
Используя перечисления, читабельность нашего кода еще немного увеличилась. Это конечно должно нас радовать, но всё равно данный подход можно использовать не во всех случаях. Ну и наконец перейдем к еще одному способу, который является непосредственно темой данной статьи.
Именованные параметры
Перед тем как говорить о именованных параметрах, быстренько взглянем на необязательные параметры, т.к. это впринципе две пересекающиеся вещи.
В языке программирования C# 4 появилась возможность использовать необязательные параметры в методах, индексаторах и конструкторах. Они служат для указания того, что определенное значение является значением по умолчанию. Рассмотрим код:
-
public int someMethodWithParams(int countOfSortElements , bool sortOrder = true){ //.. }
Параметр sortOrder имеет значение по умолчанию true и вследствие этого является необязательным параметром. Этот метод можно вызвать несколькими способами, либо передавая второй параметр:
-
-
const int countOfSortElements = 5;
-
const bool ascending = true;
-
int value = someMethodWithParams(countOfSortElements, ascending );
-
Либо не передавать второй аргумент и будет использоваться значение по умолчанию равное true:
-
-
const int countOfSortElements = 5;
-
int value = someMethodWithParams(countOfSortElements);
-
В принципе ничего сложного, единственное замечание. Необязательные параметры должны идти после обычных параметров. Это первое. А второе, если допустим у нас в методе три параметра, а второй и третий из них являются необязательными, то мы не сможем вызвать метод передав только первый и третий параметр. Вот в этом случае нам и помогут именованные параметры. Концепция именованных параметров позволяет указывать имена параметра в методе. Рассмотрим случай с тремя параметрами в методе:
-
-
void someMethod(int arg1, double arg2 = 3.4, bool arg3 = false){ //.. }
-
//…
-
someMethod(12, arg3: true);
-
Пользуясь именованными параметрами мы можем опустить второй необязательный параметр. А теперь вернемся к коду из начала статьи:
-
int value = someMethodWithParams(countOfSortElementsArg: 3, sortOrderArg: true);
Код стал читабельнее, и при этом мы не вводили новые переменные-константы и перечисления. Я не хочу сказать о том, чтобы вы теперь везде использовали в исходниках именованные параметры для того, чтобы ваш код стал более читабелен, но вы должны знать о данной возможности и уметь ей пользоваться.
И напоследок еще один примерчик, для демонстрации того, что именованные параметры можно использовать любым способом, показанным ниже:
-
-
public void someMethod(int x = 0, bool y = 0){ // ….}
-
//….
-
someMethod();
-
someMethod(x: 5);
-
someMethod(y: 10);
-
someMethod(x: 3, y: 2);
-
someMethod(y: 1, x: 2);
-
На этом всё об именованных, необязательных параметрах в C# 4 и читабельности кода . Надеюсь из статьи вы подчерпнули новые, полезные знания.