Параметры конструктора против параметров метода?
На самом деле это очень простой вопрос, и 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 этого.
Спасибо!
Ответ #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.
- Я полностью согласен с Марком, но важно понимать контекст. Мы не можем спроектировать каждое приложение так, чтобы сделать окончательный вывод о том, что идеальный класс ...
Ответ #2
Ответ на вопрос: Параметры конструктора против параметров метода?
Передайте их методу. Таким образом, вы можете 9X_visual-c# копировать в более чем одно место без необходимости 9X_csharp повторно создавать FileCopier
и выполнять другие операции, для 9X_c#.net которых могут потребоваться другие параметры. В 9X_.cs-file этом случае вы можете сделать методы статическими, поэтому 9X_c#-language создание экземпляров не требуется. Вы заметили, что 9X_c-sharp именно так работает, например, класс C# File
.
- Я пошел с этим подходом. Я решил передать 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 в метод для более понятного интерфейса.
Ответ #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
.
Ответ #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 метода подойдут.
Ответ #6
Ответ на вопрос: Параметры конструктора против параметров метода?
Недавно я обнаружил следующее правило «Если 9X_c#-language параметр используется из-за реализации, поместите 9X_visual-c# его в конструктор, если параметр используется 9X_c#.net из-за интерфейса, тогда поместите его в 9X_c# метод».
Проблема в том, что у вас нет комментариев 9X_csharp над методом копирования:
- Если это «копирование одного файла из места назначения в источник», вам следует добавить параметры источника и места назначения, потому что об этом вы говорите в описании интерфейса.
- если это «при переопределении копировать что-то», добавьте это в конструктор, потому что это понадобится только вашей реализации FileCopier.
Ответ #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 же, это может быть только я.
Ответ #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 требуется функция копирования
Ответ #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 его воссоздаете).
- Преимущество того, что 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...
}
Ответ #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 для выполнения задачи.
-
14
-
59
-
38
-
9
-
17
-
22
-
6
-
11
-
8
-
10
-
8
-
6
-
6
-
5
-
12
-
12
-
11
-
10
-
12
-
27
-
15
-
11
-
7
-
2
-
12
-
2
-
4
-
14
-
2
-
8
-
3
-
63
-
10
-
6
-
12
-
5
-
7
-
10
-
8
-
9
-
295
-
9
-
10
-
21
-
7
-
6
-
7
-
21
-
10
-
7