Как выбрать между статическими и нестатическими методами в C #?

[Редактировать]

Мой оригинальный вопрос был «Почему выбирать между статическим и нестатичным? Оба делают то же самое ...»

К сожалению, он был отредактирован до специфического для C # вопроса, чего я действительно хотел избежать.

Итак, позвольте мне сделать некоторые дополнения:

Когда я говорю «интерфейс», я имею в виду не интерфейс C # -ключей, а то, что я понимаю, что-то вроде интерфейса С ++: набор четко определенных функций для работы с моим объектом. Говоря об ослаблении моего интерфейса, я имею в виду разные функции (статические / нестатические), которые выполняют одно и то же. Мой интерфейс больше не определен, когда есть разные функции, которые делают одно и то же.

Итак, как написал Боб Дворник, я могу реализовать функцию Validate ()

Document.Validate(myDocumentObject);    

но и

myConcreteDocumentObject.Validate();

Чтобы вернуться к моему Copy () - пример можно реализовать Copy (), как

myConcreteDocument.Copy(toPath);

но и

Document.Copy(myConcreteDocumentObject, toPath)

или же

Document.Copy(fromPath, toPath)

когда я думаю о папке, которая содержит все файлы, принадлежащие моему Документу (в этом случае я не зависим от конкретного экземпляра - но я зависим от других вещей :)).

В общем, я говорю о статических методах, а не о статических классах (извините, если я забыл упомянуть).

Но, как сказал Антон Гоголев, я думаю, что мой класс Document не является хорошим примером и не очень хорошо продуман, поэтому я думаю, что мне придется взглянуть на принцип единой ответственности.

Я мог бы также реализовать какой-то класс ManagerClass, который работает с моим DocumentClass:

Например:

myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);

или же

myDocumentManagerObject.Copy(myConcreteDocumentObject, toPath);

но если я обращаюсь к подходу 1), я склонен создавать объекты, которые выполняют свои задачи самостоятельно, а не другие объекты (DocumentManager), которые делают что-тос участием мой DocumentObject.

(Я надеюсь, что это не пойдет на религиозную дискуссию об ООП;).)

[/РЕДАКТИРОВАТЬ]

Старая версия:

Поначалу кажется, что это очень простой вопрос, например, «когда использовать статические методы, а когда нет», но с этим я время от времени сталкиваюсь (и мне сложно описать реальную проблему; возможно, это просто получить причины, почему (не) использовать 1) или почему (не) использовать 2)).

(Хотя я использую синтаксис C #, это не проблема C #)

В ООП существует два подхода (среди прочих) к работе с объектами:

1) Если я хочу, чтобы мой объект что-то сделал, я просто говорю ему сделать это:

myConcreteObject.DoSomething();

Это как разговаривать с объектом.

2) Или, если вы поклонник статических методов:

ObjectClass.JustDoIt();

В некотором смысле, я думаю, что статические функции просто «чувствуют» себя лучше. Поэтому я склонен использовать статические методы очень часто (быть независимым от конкретного экземпляра - независимость всегда полезна).

Итак, при разработке класса мне часто приходится решать, использовать ли мне подход 1) или подход 2):

Представьте, что у вас есть класс «Документ», который должен обозначать документ, который должен быть сохранен в базе данных:

Документ

состоит из одного или нескольких файлов изображений из файловой системы (они становятся страницами одного документа)имеет что-то вроде библиографии - поля, в которые пользователь может добавлять информацию о документе, которая сохраняется в дополнительном файлеи должен иметь некоторые операции, такие как Copy (), AddPage (), RemovePage () и т. д.

Теперь я столкнулся с несколькими способами создания этого класса:

//----- 1) non static approach/talking to objects -----
Document newDocument = new Document();

// Copy document to x (another database, for example)
newDocument.Copy(toPath);

Мне нравится это: я говорю документу скопировать себя в базу данных x, и объект делает это сам. Приятно.

//----- 2) static approach ----------------------------
Document.Copy(myDocumentObject, toPath);

Почему нет? Также хорошо, чувствует себя очень удобно ...

Итак, какой из них реализовать? Обе? Или поместить статический подход в своего рода вспомогательный класс? Или выбрать подход 1) и придерживаться его, чтобы не ослабить интерфейс моего Document-класса?

Размышляя об обоих подходах, я прихожу к выводу, что (теоретически) можно реализовать любую функцию как статическую функцию:

Class.Function(aConcreteClassObject, parameters);

но тоже нестатично:

aConcreteObject.DoSomething(parameters);

Чтобы привести пример из реальной жизни:

[EDIT (Добавлен параметр из пути "Извините, я забыл")]

//----- 2) static approach ----------------------------
File.Copy(fromPath, toPath);    // .Net-Framework-like

[/РЕДАКТИРОВАТЬ]

но и:

//----- 1) non static approach ------------------------
ExampeFileClass fileObject = new ExampleFileClass();
fileObject.Copy(toPath);

или даже (вид OOP-Overkill):

//----- 1) non static approach, too -------------------
fileObject.ToPath = @"C:\Test\file.txt";     // property of fileObject
fileObject.Copy();                           // copy to toPath

Итак, почему (не) использовать 1) или почему (не) использовать 2)?

(Я бы не стал слишком концентрироваться на примере класса Document, так как это более общий вопрос о хорошем дизайне класса.)

Ответы на вопрос(11)

Ваш ответ на вопрос