Как передать в метод несколько параметров с помощью одного параметра object?

Услышал такой тезис: "Если у метода более трех параметров, то следует создавать параметр "object", то есть объект, который принимает все эти аргументы как свои поля".

Программировать я начал учиться недавно (2 месяца), и было бы очень интересно узнать, как провернуть такой фокус. Подскажите, пожалуйста, кто в теме. Заранее спасибо!


Ответы (2 шт):

Автор решения: aepot

Все данные, которые использует метод для работы, образно можно назвать контекстом выполнения. Сюда входят:

  • Обращения к публичным полям и свойствам
  • Аргументы

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

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);

То есть прием и передача единой структуры данных как одного аргумента.

→ Ссылка
Автор решения: Dmitry Ivanov

Немного не согласен с коллегой, в плане не стоит мешать в одну кучу понятия класс и структура, в C# это немного разные вещи. Использование POCO классов (Plain Old CLR Object) в качестве аргументов позволяет делать очень много:

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

ПРИМЕР АРГУМЕНТА:

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

→ Ссылка