Статические методы хороши для масштабируемости?

Хороши ли статические методы и классы для масштабируемости? Я думаю, что статический класс/метод улучшает масштабируемость приложения, а методы экземпляра не сильно масштабируются. Так является ли хорошей практикой программирования писать статические методы везде, где это возможно?


person Silent Warrior    schedule 16.08.2009    source источник
comment
Что заставляет вас думать, что статические методы улучшают масштабируемость или что методы экземпляра плохо масштабируются?   -  person Rex M    schedule 16.08.2009
comment
Все, что не имеет состояния, хорошо масштабируется. Итак, если класс util содержит все статические методы без статического состояния, то он хорошо масштабируется. Я могу быть не прав. Любите исправляться.   -  person Silent Warrior    schedule 16.08.2009
comment
Я не думаю, что вопрос должен был быть отклонен. Меня беспокоило использование памяти методами экземпляра, когда я впервые изучал OO/Java и помню, как много искал по этой самой проблеме, и ответ ОП на мой ответ, похоже, вызывает аналогичную озабоченность здесь, стоящую за вопросом. (Даже если нет, здесь есть и другие хорошие ответы о статических и методах экземпляра.)   -  person Anon    schedule 16.08.2009
comment
@Анон: Я согласен с тобой.   -  person Silent Warrior    schedule 16.08.2009


Ответы (8)


Это зависит от того, ПОЧЕМУ метод является статическим. Если он статичен, потому что ему действительно не нужен контекст, то он, вероятно, будет очень хорошо масштабироваться по сравнению с чем-то аналогичной сложности, который не является статичным, потому что требует контекста.

Однако, если он статичен только потому, что вы не можете сохранить необходимый контекст и все равно должны передать его, или из-за какой-то искусственной цели иметь больше статических методов, то я подозреваю, что он на самом деле будет масштабироваться МЕНЬШЕ, чем сопоставимый метод как не- статический.

На самом деле я думаю, что ASP Classic доказал это.

person RBarryYoung    schedule 16.08.2009
comment
@RBarry Young: здесь я предполагаю, что статический метод не имеет никакого контекста, и это единственная причина думать, что статический метод хорошо масштабируется. - person Silent Warrior; 16.08.2009
comment
Ни не имеет, ни нуждается контекст (между этими двумя вещами есть разница). Например, SIN() не имеет контекста и не нуждается в нем, он должен масштабироваться так же хорошо, как и все остальное. С другой стороны, манипулирование файлами обычно имеет и нуждается в контексте (рассматриваемом файле), реализуя его без какого-либо контекста (с использованием дескриптора файла или номера канала, как мы должны были это сделать до ОО) никоим образом не улучшит его масштабирование и вполне может сделать его хуже масштабируемым. - person RBarryYoung; 16.08.2009

Хороши ли статические методы и классы для масштабируемости?

Одно мало связано с другим.

Я думаю, что статический класс/метод улучшает масштабируемость приложения, а методы экземпляра не сильно масштабируются.

Неправильный. Почему ты так думаешь?

Так является ли хорошей практикой программирования писать статические методы везде, где это возможно?

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

person Michael Borgwardt    schedule 16.08.2009
comment
почему статические методы отказываются от преимуществ сопровождения объектно-ориентированного программирования?? - person zpesk; 17.08.2009
comment
@zPesk: ну, для начала, они явно НЕ объектно-ориентированы. - person Stephen C; 17.08.2009
comment
Потому что весь смысл ООП заключается в том, чтобы инкапсулировать логику с данными, с которыми она работает, для создания объектов. Поля экземпляра — это данные, методы экземпляра — логика. Это позволяет вам скрыть детали реализации и думать о взаимодействии объектов на более высоком, более абстрактном уровне. Статические методы и поля — это, по сути, способ процедурного (не объектно-ориентированного) программирования. - person Michael Borgwardt; 17.08.2009
comment
Почему он ошибается? Найдите время, чтобы объяснить свои собственные точки зрения. ОП еще мало знает об ООП, зачем вообще спрашивать? Просто объясни это вместо этого. - person RabbitBones22; 14.03.2019
comment
@RabbitBones22: Невозможно сказать, почему ОП ошибается, если он не указал причину, чтобы полагать, что методы экземпляра мало масштабируются. Это просто неправда, тут нечего объяснять. - person Michael Borgwardt; 14.03.2019

Есть три проблемы, которые следует учитывать при использовании статических методов:

  1. Вы можете создать узкое место, если ваш статический метод имеет большую критическую область. Самым большим, конечно, является объявление всего метода синхронизированным. Если он может выполняться только по одному, то это потенциальная проблема;
  2. Является ли то, что он делает, по-прежнему согласованным, если вы используете один и тот же метод на разных виртуальных машинах и на разных машинах? и
  3. Любой метод, основанный на статических методах, имеет проблемы с модульным тестированием.

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

person cletus    schedule 16.08.2009
comment
Я не слышал № 3 раньше. Не могли бы вы уточнить? -- спасибо - person RBarryYoung; 16.08.2009
comment
Хотя один автономный статический метод очень легко тестировать, все, что использует его, нельзя отделить от него. И если у всех вас есть статические методы, вызывающие друг друга на 5 (или 10, или более...) уровней в глубину, вы вообще не можете изолировать (и, следовательно, тестировать изолированно) части логики приложения. - person Michael Borgwardt; 18.08.2009

Никакие статические методы не масштабируются лучше. На самом деле стиль программирования (императивный или объектно-ориентированный) на самом деле не имеет никакого значения для масштабирования. Есть два основных аспекта масштабирования, и то, что нужно сделать для улучшения масштаба, зависит от того, что мы имеем в виду:

1 Масштабирование по количеству запросов, обрабатываемых в секунду

Этот тип масштабирования обычно заключается в добавлении большего количества компьютеров в кластер для повышения общей пропускной способности системы. Повышение масштабирования часто заключается в первоначальном уменьшении количества общих ресурсов, используемых за счет использования кешей, а затем в разделении доступа к данным на сегменты.

2 Масштабирование данных

Это когда система получает все больше и больше данных с течением времени, а операции по доступу к данным (поиск, фильтрация и т. д.) становятся медленнее, поскольку алгоритмы сложнее, чем O(1). В этом случае обычной стратегией является увеличение количества точек чтения и записи и использование параллельных алгоритмов, таких как Map/Reduce.

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

person Paul Keeble    schedule 16.08.2009

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

Редактирование для добавления:

Если вам интересно, как метод экземпляра может быть фактически разделен между экземплярами: это потому, что каждый вызов метода экземпляра неявно передает ссылку на объект экземпляра в метод. Обычно это называется «неявным this». Другими словами, когда вы определяете или вызываете метод экземпляра с двумя параметрами, такими как myMethod(a, b), вы можете думать о нем как о myMethod(this, a, b) , и Java позаботится об этом параметре за вас, и вам не придется явно определять или передавать его.

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

Для объяснения того, что происходит на уровне байт-кода Java, вот ссылка: http://www.artima.com/underthehood/invocationP.html (см. материал вокруг: «Objectref — это неявный указатель this, который передается любому методу экземпляра».)

person Anon    schedule 16.08.2009
comment
@Anon: Все, что ты считаешь правильным. Я думаю, что нестатический объект требует выделения памяти для каждого атрибута, связанного с экземпляром. Я могу быть не прав. Но просто хочу знать, что другие думают о том же. - person Silent Warrior; 16.08.2009
comment
То, что вы думаете, правильно для переменных экземпляра, но не имеет смысла для методов экземпляра, которые одинаковы для каждого экземпляра, которые нужно копировать для каждого. Все, что вам нужно, это указатель на тот же метод. См. обсуждение, например, по этой ссылке: developer.com/java/other /article.php/1025601 - person Anon; 16.08.2009
comment
(Каждый экземпляр знает свой класс и может таким образом добраться до общего метода, поэтому все, что вам нужно, это указатель, который может вводить в заблуждение. Но см. ссылку для цитаты о методах экземпляра, которые фактически используются совместно.) - person Anon; 16.08.2009

Какую форму масштабируемости вы имеете в виду? Масштабируемость, возможность сопровождения и расширения кода в больших и малых проектах? Тогда использование только статических методов причиняет боль. Вы имеете в виду производительность? Если методы-экземпляры медленнее (во что я не верю в этой общности), то это не значит, что они не масштабируются. Если им требуется в два раза больше времени, чем статическим методам, им также потребуется в два раза больше времени, если вы вызовете их все 10000 раз. Выбор правильных алгоритмов и представления данных гораздо больше определяет масштабируемость производительности.

Наконец, если вы считаете, что статические методы — это то, что нужно, вам не следует использовать объектно-ориентированный язык, такой как Java. Попробуйте C или Pascal или классические Basic-диалекты.

person Mnementh    schedule 16.08.2009

Я думаю, вы лаете не на то дерево:

В реальном мире масштабируемость (или ее отсутствие) обычно проистекает из уместности алгоритмов и эффективности операций, выполняемых с хранилищами данных (подумайте: хорошие SQL-запросы).

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

person DarkSquid    schedule 17.08.2009

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

person Chris Kessel    schedule 17.08.2009
comment
ОП явно не совсем понимает ОО ... возможно, поэтому он и задал вопрос. - person yalestar; 18.08.2009
comment
@Chris Kessel: метод экземпляра не занимает дополнительного места, но переменная экземпляра занимает место для каждого экземпляра. - person Silent Warrior; 18.08.2009
comment
Stackoverflow не кажется подходящим местом для базового понимания объектно-ориентированного программирования. Есть множество сайтов и книг для изучения ООП. Если ОП думает, что ему нужно использовать статику (глобальные значения) для всего, ему явно нужно остановиться и сначала изучить ООП. Я понимаю, почему он задал вопрос. Я проголосовал против, потому что StackOverflow кажется неподходящим местом для изучения того, что ему нужно изучить. - person Chris Kessel; 18.08.2009