Параметры конструктора против параметров метода?

На самом деле это очень простой вопрос, и 9X_csharp я ожидаю, что ответ будет «обстоятельства 9X_csharp диктуют». Однако мне было интересно, что 9X_visual-c# думают люди о передаче параметров конструктору 9X_visual-c# или методу.

Я попытаюсь задать контекст для 9X_c#.net своего вопроса:

public interface ICopier
{
   void Copy();
}

public class FileCopier : ICopier
{
   String m_source;
   String m_destiniation;

   FileCopier(String source_, String destination_)
   {
        m_source = source_;
        m_destiniation = destiniation_;
   }

   public void Copy()
   {
        File.Copy(m_source, m_destiniation, true);
   }
}

Или FileCopier.Copy() должен 9X_csharp принимать source_ и destination_ в качестве 9X_c#.net параметров метода?

Я хочу, чтобы эти классы 9X_c#.net были как можно более абстрактными.

Я задаю 9X_csharp этот вопрос, поскольку теперь у меня есть 9X_c-sharp другие интерфейсы / классы для удаления, переименования 9X_c# и так далее, и я хочу создать стандарт для 9X_c-sharp этого.

Спасибо!

39
0
11
Общее количество ответов: 11

Ответ #1

Ответ на вопрос: Параметры конструктора против параметров метода?

Это зависит :)

В основном объектная ориентация 9X_c#-language утверждает, что объекты должны инкапсулировать данные и поведение. Когда вы 9X_.cs-file передаете данные в качестве параметров конструктора, вы 9X_.cs-file указываете, что это данные для инкапсуляции.

С 9X_c-sharp другой стороны, когда вы передаете данные 9X_c-sharp в качестве параметров, вы указываете, что 9X_c#-language это данные, которые каким-то образом менее 9X_csharp связаны с объектом. Как только вы начнете 9X_c#.net двигаться к взаимодействию контекста данных (DCI), многие объекты будут 9X_visual-c# все больше и больше инкапсулировать поведение, а 9X_c#.net не данные.

В то же время книга «Чистый код» также 9X_csharp помогает нам ограничить количество параметров 9X_visual-c# метода, чтобы сделать окончательный вывод 9X_csharp о том, что метод без параметров - лучший 9X_.cs-file дизайн из всех.

Поэтому я бы предпочел инкапсулировать 9X_c-sharp данные, передав их в качестве параметров 9X_c#-language конструктора, чтобы иметь простые API. Тогда 9X_csharp он будет очень похож на объект Command.

39
2

  • Я полностью согласен с Марком, но важно понимать контекст. Мы не можем спроектировать каждое приложение так, чтобы сделать окончательный вывод о том, что идеальный класс ...

Ответ #2

Ответ на вопрос: Параметры конструктора против параметров метода?

Передайте их методу. Таким образом, вы можете 9X_visual-c# копировать в более чем одно место без необходимости 9X_csharp повторно создавать FileCopier и выполнять другие операции, для 9X_c#.net которых могут потребоваться другие параметры. В 9X_.cs-file этом случае вы можете сделать методы статическими, поэтому 9X_c#-language создание экземпляров не требуется. Вы заметили, что 9X_c-sharp именно так работает, например, класс C# File.

19
1

  • Я пошел с этим подходом. Я решил передать source_ и destination_ в качестве параметров метода, поскольку эти два бита данных имеют значение только дл ...

Ответ #3

Ответ на вопрос: Параметры конструктора против параметров метода?

Это также зависит от того, является ли приложение 9X_c#.net устаревшим или с сохранением состояния. В архитектуре с отслеживанием состояния, вероятно, я 9X_.cs-file бы выбрал передачу параметров в конструктор, что 9X_c#-language позволило бы мне сохранить этот объект и 9X_c#-language несколько раз вызвать уже инициализированный 9X_c#-language экземпляр. В приложении без сохранения состояния 9X_visual-c# вам придется создавать состояние объекта 9X_c#-language каждый раз, когда вы создаете экземпляр 9X_c# объекта, что в некотором роде избыточно, поэтому 9X_csharp я бы предпочел передачу этих параметров 9X_c-sharp в метод для более понятного интерфейса.

15
0

Ответ #4

Ответ на вопрос: Параметры конструктора против параметров метода?

Вообще говоря, лучше избегать добавления 9X_c#-language в класс ненужного состояния. Это означает, что 9X_c#-language если некоторые элементы данных необходимы 9X_c# только в контексте определенной операции, вы 9X_c# обычно предпочитаете иметь их только как 9X_c#.net локальные переменные в методе и передавать 9X_c#.net их как параметры.

Таким образом, ваш код 9X_c-sharp также будет менее подвержен ошибкам, потому 9X_c# что будет меньше ненужного состояния, которое 9X_c-sharp разделяется между методами, и меньше вероятность 9X_c#.net ошибок.

Вы должны передать параметры конструктору, если 9X_c#-language хотите, чтобы значения никогда не изменялись 9X_c#-language во время использования класса.

Вероятно, нет 9X_.cs-file смысла создавать объект FileCopier, который 9X_c# может копировать только определенный файл, поэтому 9X_visual-c# в вашем случае более подходящим будет метод.

С 9X_c#-language другой стороны, если вам нужно управлять 9X_c#-language состоянием для каждой операции копирования, например 9X_c#.net отслеживание хода выполнения, отслеживание 9X_c#.net ошибок, обратные вызовы завершения и т. д., было 9X_csharp бы разумнее передать параметры в конструктор, но 9X_visual-c# также добавить принудительное исполнение, которое 9X_c-sharp будет предотвратить повторный вызов Copy.

7
0

Ответ #5

Ответ на вопрос: Параметры конструктора против параметров метода?

Старый вопрос, но похоже, что многие люди 9X_csharp отвечают, не принимая во внимание цель абстракции 9X_csharp ICopier. Как заявил Saurabh, создание его копии 9X_.cs-file (String, String) (и соответствующая настройка 9X_c#-language интерфейса) будет означать, что любые другие 9X_c-sharp реализации ICopier будут ограничены использованием 9X_csharp этого метода.

Что делать, если вам нужно 9X_.cs-file расширить его, чтобы создать EmailCopier, который 9X_c-sharp отправляет файл из источника в список электронных 9X_c#-language писем вместо файла назначения? Вы можете 9X_.cs-file написать хакерский метод, который продолжает 9X_c-sharp принимать (String, String):

ICopier copier = new EmailCopier();
copier.copy(sourceFile, "an@email.com,another@email.com");

Или вы можете 9X_csharp поместить всю эту информацию в конструктор, используя 9X_visual-c# соответствующие структуры данных и простую 9X_c#-language команду copy():

ICopier copier = new EmailCopier("sourceFile', aListOfEmails);
copier.copy();

Подводя итог, если реализации 9X_.cs-file интерфейса будут иметь существенно разные 9X_c-sharp параметры, вы должны использовать параметры 9X_csharp конструктора с простой командой. Если все 9X_c# реализации работают с одними и теми же входами, параметры 9X_csharp метода подойдут.

7
0

Ответ #6

Ответ на вопрос: Параметры конструктора против параметров метода?

Недавно я обнаружил следующее правило «Если 9X_c#-language параметр используется из-за реализации, поместите 9X_visual-c# его в конструктор, если параметр используется 9X_c#.net из-за интерфейса, тогда поместите его в 9X_c# метод».

Проблема в том, что у вас нет комментариев 9X_csharp над методом копирования:

  • Если это «копирование одного файла из места назначения в источник», вам следует добавить параметры источника и места назначения, потому что об этом вы говорите в описании интерфейса.
  • если это «при переопределении копировать что-то», добавьте это в конструктор, потому что это понадобится только вашей реализации FileCopier.

6
0

Ответ #7

Ответ на вопрос: Параметры конструктора против параметров метода?

Все дело в использовании;

Какой из них вам 9X_c# легче?

FileCopier f = new FileCopier(sourceFrom,sourceTo);
f.Copy();

или

FileCopier f = new FileCopier();
f.Copy(sourceFrom,sourceTo);

Я предпочитаю второй не только 9X_c# потому, что его легче читать, но и потому, что 9X_c# вам не нужно заново создавать объект после 9X_visual-c# изменения ваших путей. Не рекомендуется 9X_c-sharp устанавливать источники в ctor. Но опять 9X_.cs-file же, это может быть только я.

2
0

Ответ #8

Ответ на вопрос: Параметры конструктора против параметров метода?

Я бы предпочел, чтобы конструктор принимал 9X_.cs-file аргументы, потому что ответственность FileCopier 9X_c-sharp заключается в копировании файла из источника 9X_c-sharp в место назначения, а интерфейс, который 9X_csharp он реализует, может использоваться с другими 9X_c#.net гетерогенными классами, поэтому, если вы 9X_.cs-file предоставите параметры функции Copy(), она 9X_c-sharp станет более конкретным, но в текущем состоянии 9X_.cs-file его можно использовать во многих местах, где 9X_.cs-file требуется функция копирования

2
0

Ответ #9

Ответ на вопрос: Параметры конструктора против параметров метода?

Если есть много других методов, которые 9X_.cs-file работают с исходными и целевыми файлами, которые 9X_c#-language вы нам не показали, FileCopier, вероятно, должен быть 9X_c#.net static class и вообще не сохранять пути к файлам как 9X_c#-language переменные уровня класса. . Скорее, все 9X_c#-language отдельные методы класса должны принимать 9X_c#.net файлы, над которыми нужно работать (и любую 9X_visual-c# другую необходимую информацию или настройки), в 9X_c-sharp качестве параметров. Таким образом, вам 9X_c# не придется создавать экземпляр класса каждый 9X_.cs-file раз, когда вы хотите скопировать файл.

FileCopier fc = new FileCopier(src, dest);
fc.Copy();

против

FileCopier.Copy(src, dest);

Лучшим 9X_visual-c# примером того, о чем я здесь говорю, является 9X_c# System.Math class в .NET Framework. System.IO.File class также работает таким 9X_.cs-file же образом (и возникает вопрос, зачем вы 9X_c-sharp его воссоздаете).

1
3

  • Преимущество того, что FileCopier является нестатическим классом, заключается в том, что подпрограмма, которой нужно будет копировать файлы, сможет принять объект ICopi ...

Ответ #10

Ответ на вопрос: Параметры конструктора против параметров метода?

В отношении вашего контекста лучше передать 9X_c#-language параметр методу, если у вас есть только 9X_csharp метод копирования в вашем классе. Но передача 9X_c#-language их в конструктор может быть полезна, если 9X_c#-language вам нужно выполнить несколько операций с 9X_csharp одним и тем же объектом.

например:

    public class FileCopier : ICopier
    {
       String m_source;
       String m_destiniation;

       FileCopier(String source_, String destination_)
       {
            m_source = source_;
            m_destiniation = destiniation_;
       }

       public void Copy()
       {
            File.Copy(m_source, m_destiniation, true);
       }

       public void DeleteSource()
       {
       }

       public void DeleteCestination()
       {
       }

  etc...
    }

1
0

Ответ #11

Ответ на вопрос: Параметры конструктора против параметров метода?

Странно, что никто не упомянул о вашем интерфейсе 9X_c#.net ICopier.

Просто взглянув на этот интерфейс, я бы 9X_csharp передал аргументы в самом методе. Поскольку 9X_c#-language это контракт, он также должен заставлять 9X_.cs-file объекты, реализующие этот интерфейс, принимать 9X_c# допустимые аргументы для завершения / реализации 9X_csharp задачи.

Если ICopier запрашивает реализацию Copy(), он 9X_c#.net также должен предоставить значения / аргументы, необходимые 9X_.cs-file для выполнения задачи.

1
0