Почему я вижу так много экземпляров классов без состояния?


18

Я вижу множество инстанцируемых классов в мире C ++ и Java, которые не имеют никакого состояния.

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

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

Я правильно понял? Разве это не ООП, если я не помещаю все в объекты (т.е. в экземпляры классов)? Тогда почему в стандартных библиотеках C ++ и Java так много служебных пространств имен и классов?

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


2
Трудно ответить без количественной оценки "так часто". Не могу сказать, что вижу это очень часто. Подумайте об изменении Q на что-то вроде "как полезны классы без иваров?"
Калеб

@Caleb Я буду искать примеры в проектах с открытым исходным кодом. Я определенно видел это много в магазинах Java, на которые работал.
futlib

@futlib: да, это распространено. stackoverflow.com/questions/4692845/…
Hoàng Long

Считаете ли вы класс, содержащий только, например. EntityManager не содержит состояние?
user470365

Ответы:


22

Я вижу множество инстанцируемых классов в мире C ++ и Java, которые не имеют никакого состояния.

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

  • Состояние есть или может содержаться в суперклассе.

  • Класс реализует некоторый интерфейс и должен быть инстанцируемым, чтобы экземпляры могли передаваться другим объектам.

  • Класс предназначен для подкласса.

  • Удобный способ группировки связанных функций. (Да, могут быть лучшие или другие способы сделать то же самое.)

Я правильно понял? Разве это не ООП, если я не помещаю все в объекты (т.е. в экземпляры классов)?

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


4

Калеб и Роберт Харви уже указали, что такое служебные классы, и некоторые законные причины наличия классов без данных. Эти описания точны, но имеют дело с положительными аспектами.

Я хотел бы просто упомянуть, что злоупотребление служебными классами определенно может быть анти-паттерном ОО (см . Описание c2wiki ). Эта цитата хорошо подводит итог:

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

Если вы утверждаете, что практикуете объектно-ориентированное проектирование, но ваша кодовая база почти полностью состоит из служебных классов, я бы сказал, что вы определенно делаете что-то не так. Сказав это, функциональный подход имеет столько же достоинств, и с ним тоже можно работать. Только не претендуйте на то, что следуете одному, нерешительно реализуя другое.


2

Служебные классы в Java и C ++ используются для поддержки библиотеки методов, которые принимают один или несколько входных параметров и возвращают результат. Им не нужно хранить состояние, если они просто возвращают значение. В этом отношении эти методы можно рассматривать как грубую форму функционального программирования со всеми ее преимуществами (с одной стороны, никаких проблем с параллелизмом).

В любом случае эти классы просто служат для группировки связанных методов в одном контейнере, методах, которые не требуют создания экземпляра объекта для правильной работы. Примером такого класса является класс Math, содержащий функции SINE и COSINE (и другие математические функции).


2

Многие из этих классов взаимодействуют с данными, даже если они явно не содержат их, и должны делать это так, чтобы активным было несколько одновременных экземпляров. Например, сессионный компонент без сохранения состояния, который взаимодействует с хранимой процедурой базы данных, передавая входящие данные в некоторый пакет PL / SQL и передавая результаты обратно вызывающему приложению. Эта вещь должна существовать в нескольких экземплярах, но сама по себе не содержит никаких полей данных.


0

В объектно-ориентированных языках, где классы не являются объектами, вы можете сделать с объектом гораздо больше, чем класс.

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.