Недавно я разбирал спецификации компании, и среди них несколько спорным при продвижении было «количество параметров функции не должно превышать 4». Если задачу можно выполнить, то чем меньше параметров, тем лучше. спорно, но это может вызвать трудности при программировании, и ведутся споры о том, стоит ли оно того. Я считаю, что это стоит сделать, чтобы облегчить задачу людям, использующим функции. Что касается трудностей в программировании, то это часто связано с тем, что мы не знакомы с некоторыми методами уменьшения параметров. Вот несколько кратких описаний для справки:
1. Используйте структуры для инкапсуляции параметров
Пример: Добавить пользователя
Исходное тело функции: AddUser (строка userName, строка пароля, строка адреса, строка телефона, int age)
Рефакторинг: добавьте класс User:
класс Пользователь
{
общественная строка Имя пользователя {получить;
общедоступная строка Пароль {получить;
общественная строка Адрес {получить;
общедоступная строка Телефон {получить;
общественный ИНТ Возраст {получить;
}
Измените AddUser на: AddUser (пользователь-пользователь)
Проблемы: Если добавленный класс нигде не используется, мы часто чувствуем, что оно того не стоит. В настоящее время мы можем рассмотреть возможность использования анонимных классов для инкапсуляции параметров.
2. Используйте атрибуты для замены параметров.
Если метод AddUser в 1 помещен в класс User, то пользовательские параметры в методе AddUser могут быть опущены. Иногда могут быть добавлены некоторые атрибуты, чтобы уменьшить количество параметров в некоторых методах. В объектно-ориентированном проектировании объекты должны нести ответственность за себя, а обязанности должны быть четко определены. Причина, по которой метод имеет слишком много параметров, может заключаться в том, что метод написан там, где его не должно быть. Модель «информационного эксперта», упомянутая в принципе GRASP, во многих случаях может уменьшить количество параметров.
Пример: перенос аккаунта
Оригинальная функция: Перевод (счет с, счет на, десятичные деньги)
Рефакторинг:
код
публичный класс TransferProcess
{
личный аккаунт От;
личный счет Кому;
public TransferProcess(Учетная запись от, Учетная запись на)
{
это.От = от;
this.To = to;
}
общественный недействительный перевод (десятичные деньги)
{
если (деньги<From.Money)
{
From.Money = From.Money - деньги;
To.Money = To.Money + деньги;
//обновляем базу данных
}
еще
{
выдать новое исключение («Баланс превышен»);
}
}
}
Примечание. Шаблон информационного эксперта — это самый основной принцип объектно-ориентированного проектирования. Когда мы проектируем объекты (классы), если класс имеет всю информацию, необходимую для выполнения определенной ответственности, эта ответственность должна быть назначена этому классу для реализации. . В настоящее время этот класс является информационным экспертом, соответствующим этой ответственности.
3. Используйте частные функции
При вызове функции нам часто не нужно много интерактивных параметров, но когда мы предоставляем параметры, нам необходимо предоставить все условия. На данный момент мы можем классифицировать функции, инкапсулировать самые сложные функции как частные и предоставлять доступ к ним. простые функции. Вызовите эти сложные функции для завершения функции. Давайте посмотрим на реализацию метода TextBox в mvc:
код
общедоступная статическая строка TextBox (это HtmlHelper htmlHelper, имя строки, значение объекта, IDictionary<string, object> htmlAttributes) {
return InputHelper(htmlHelper, InputType.Text, name, value, (value == null) /* useViewData */, false /* isChecked */, true /* setId */, true /* isExplicitValue */, htmlAttributes);
}
частная статическая строка InputHelper (это HtmlHelper htmlHelper, InputType inputType, имя строки, значение объекта, bool useViewData, bool isChecked, bool setId, bool isExplicitValue, IDictionary<string, object> htmlAttributes) {
если (String.IsNullOrEmpty(имя)) {
выдать новое ArgumentException(MvcResources.Common_NullOrEmpty, "имя");
}
TagBuilder tagBuilder = новый TagBuilder("вход");
... ...
Но иногда, чтобы предоставить вызывающей стороне максимальную гибкость, мы можем также предоставить перегрузку наиболее сложной функции.
4. ключевое слово параметров
Указывает, что если количество параметров является переменным, используется параметр метода параметра.
использование:
код
static void Main(string[] args)
{
UseParams(1, 2, 3);
}
public static void UseParams (список параметров int[])
{
for (int i = 0; я <list.Length; i++)
{
Console.WriteLine(список[i]);
}
Консоль.WriteLine();
}
Этот метод фактически не уменьшает количество параметров, а лишь упрощает тело функции.
5. Используйте анонимные классы для инкапсуляции параметров
Подготовительные знания: давайте сначала посмотрим на RouteValueDictionary.
код
static void Main(string[] args)
{
RouteValueDictionary r = новый RouteValueDictionary (новый {id=1,name="lfm"});
foreach (элемент var в r)
{
Console.WriteLine("{0}:{1}", item.Key, item.Value);
}
//Консоль.WriteLine();
}
результат:
идентификатор: 1
имя: ЛФМ
RouteValueDictionary может хранить в словаре имена атрибутов и значения атрибутов экземпляров.
Многие места в MVC используют этот метод для передачи параметров.
Например: <%= Html.ActionLink("Подробности", "Подробности", new { id=item.id })%>
В теле метода ActionLink RouteValueDictionary используется для декомпозиции анонимного объекта и последующей сборки его в ссылку.