2012-04-08 2 views
7

Как часто я должен использовать статические методы в целом? Если у меня есть, как:Использование метода static method vs. object

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

или

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 

У меня склонность вызова статического метода класса и передавая объект класса, как и в первом примере?

Какова наилучшая практика в отношении этих двух примеров? Должен ли я уделять внимание какой-либо работе по производительности, дизайну и общей практике? Какой из них я должен использовать в целом и какой из них вы бы выбрали, как в сценариях ежедневного кодирования. Первый пример кажется более простым для чтения (вы передаете все параметры и что-то делаете), во втором вам нужно дважды прочитать, что вы работаете над объектом?

Это не очень большое дело, просто интересно.

ответ

11

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

+1

Согласен. Конечно, всегда есть исключения, но, в общем, если вы обнаружите, что передаете экземпляр класса A статическому методу класса A, вы, вероятно, ошибаетесь. –

+0

Как насчет случаев, когда вы передаете два экземпляра класса A методу, где ни один экземпляр «не владеет» или не имеет приоритета в операции? –

+1

Вы имеете в виду как коммутативную двоичную операцию? Я видел это в обоих направлениях, но, вероятно, по-прежнему будет использовать нестатический метод. – Taymon

0

Если вам нужен объект, я думаю, вы должны сделать вызов как «_class34.DoSomething (параметр1, параметр2, параметр3, параметр)».

, когда вы читаете это как: над объектом _Class34, сделайте что-то с этими параметрами.

2

Нет ответа «чаще».
Все зависит от типа использования.

Суть заключается в следующем: если объект указанного класса используется/используется, вы всегда должны использовать нестатические методы. Однако, если нет одного экземпляра класса, который выполняется/используется, вы всегда должны использовать статические методы.

В вашем примере вы делаете Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4), что не является хорошим подходом, поскольку он удаляет все возможности. Объектно-ориентированное программирование дает вам (например, полиморфизм и т. Д.).

Хорошим примером для сценария, в котором требуется статическая функция, являются фабричные методы, такие как String.Parse - которые начинаются без какого-либо конкретного экземпляра String, но все же подключены к классу строк.

+0

Другим распространенным примером является загрузка объекта из файла, что часто интерпретируется как статическое возвращающее объект, загруженный из файла. – Ricibob

2

Это то, что уже выполняется, каждый метод метода имеет скрытый 1-й аргумент, который передает . Выставляется в синтаксисе метода расширения.

Явно выполнение работы среды выполнения не особенно полезно, синтаксис просто становится более подробным. И болезненно, учитывая имя, которое вы должны придумать. Рассмотрите _this вместо _class34 :)

0

Вся идея объектно-ориентированного программирования состоит в том, что вам не нужно писать somefunction(somestruct), как и в прошлом, но вместо этого вы можете написать somestruct.somefunction(), что делает его более понятным что somefunctionпринадлежит до somestruct.

Конечно, вы можете сделать это любым способом, но помните, что ваш второй пример: путь, причина, по которой были созданы функции-члены.

0

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

Для большинства случаев я добавляю нестационарные обертки для классов, содержащих статические члены, так как иначе я не смог бы их высмеять.

Static Methods are Death to Testability может дать вам лучшее представление об этом.

0

Но по умолчанию я использую методы экземпляра. Я использую статику только тогда, когда она имеет больше смысла, чем методы экземпляра, или когда нет другого пути. Использование статики может усложнить модульное тестирование. Статические методы, которые также используют статические поля, являются потенциальным источником утечек памяти (да, даже в .NET).

Так, например, я использую статику, когда я хочу, чтобы иметь специальный метод создания, чтобы сделать более ясным, что происходит во время создания, например, когда я создаю объект, десериализации из файла:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

Что является более читабельный, чем:

MyClass myObject = new MyClass("serialized.xml"); 

Также я использую статику методу (и член), когда я хочу поделиться классом по всей информации о состоянии между всеми экземплярами.

Конечно, статический член является обязательным, если весь ваш класс статичен.