Как передать в метод несколько параметров с помощью одного параметра object?
Услышал такой тезис: "Если у метода более трех параметров, то следует создавать параметр "object", то есть объект, который принимает все эти аргументы как свои поля".
Программировать я начал учиться недавно (2 месяца), и было бы очень интересно узнать, как провернуть такой фокус. Подскажите, пожалуйста, кто в теме. Заранее спасибо!
Ответы (2 шт):
Все данные, которые использует метод для работы, образно можно назвать контекстом выполнения. Сюда входят:
- Обращения к публичным полям и свойствам
- Аргументы
Если вдруг аргументов стало много, задумайтесь о том, а стоило ли всё передавать как аргументы. То что никогда не изменяется, может стать константами. То что не изменяется на время какой-то большой операции можно вынести поля, а сам метод в отдельный класс.
public class FileParser
{
private readonly string _path;
public string[] lines { get; private set; }
public FileParser(string path)
{
_path = path;
}
public void Load()
{
lines = File.ReadAllLines(_path);
}
public void Save()
{
File.WriteAllLines(_path, lines);
}
}
Получится
var parser = new FileParser("example.txt");
parser.Load();
// ...обработка строк
parser.Save();
Здесь получается, что поле _path это неизменяемый контекст выполнения. Такие данные нет смысла много раз передавать через аргументы. Проще создать класс с полями и постоянные данные держать там. Таким образом можно сократить количество аргументов.
Отвечая прямо на вопрос, скучковать данные в общую группу и передать как один аргумент можно, для этого придется создать класс с полями, заполнить его и передавать его экземпляр как аргумент. Но не уверен, что это было бы удобно во всех случаях.
Например
public class Message
{
public int Id { get; set; }
public string Text { get; set; }
}
Такое удобно использовать например так
var message = chat.ReceiveMessage();
// ...
chat.SendMessage(message);
То есть прием и передача единой структуры данных как одного аргумента.
Немного не согласен с коллегой, в плане не стоит мешать в одну кучу понятия класс и структура, в C# это немного разные вещи. Использование POCO классов (Plain Old CLR Object) в качестве аргументов позволяет делать очень много:
- Вы получаете более лаконичный код не перегруженный большим количеством аргументов в коде вызывающем методы.
- Вы получаете более гибкий инструмент управления перегрузкой, что позволяет более тонко управлять поведением.
- Исчезает проблема с вызовом методов содержащих несколько необязательных аргументов.
- Проще реализовать несколько стратегий поведения при внедрении в контенер зависимостей в случаях когда по факту аргументом метода является указание о выборе некой стратегии выполнения не содержащей фатических данных для обработки.
ПРИМЕР АРГУМЕНТА:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int Age { get; set; }
public bool? IsMarried { get; set; } // не обязательный аргумент
public decimal? Salary { get; set; } // не обязательный аргумент
}
ПРИМЕР ИСПОЛЬЗОВАНИЯ:
public void DisplayPersonInfo(Person person)
{
Console.WriteLine($"Full Name: {person.FirstName} {person.LastName}");
Console.WriteLine($"Age: {person.Age}");
// Вывод информации только если поля установлены
if (person.IsMarried.HasValue)
{
Console.WriteLine($"Is Married: {person.IsMarried.Value}");
}
if (person.Salary.HasValue)
{
Console.WriteLine($"Salary: {person.Salary.Value}");
}
}
Кроме того POCO классы широко используется в WEB фреймворках для инкапсуляции данных передаваемых с фронта в бэк и обратно, например модель привязки ASP.Net. В общем это удобный подход, который нужно брать на вооружение. В разрезе контекстно ориентированного подхода к проектированию, на основе контекстно ориентированной абстракции, в соотвествии с практиками рекомендуемыми "Бандой четырех", с которыми стоит ознакомиться.
Паттерны объектно-ориентированного проектирования ISBN:9785446115952, 5446115953