The Object Orgy Anti-Pattern in OOP

Lecture



In computer programming, an object orgy is a situation in which objects are not sufficiently encapsulated through information hiding, allowing unrestricted access to their internals. This is a common failure (or anti-pattern) in object-oriented design or object-oriented programming, and it can lead to increased maintenance needs and problems, and even to unmanageable complexity.

"Object orgy" is a programming term describing a typical anti-pattern. In an object orgy, objects are insufficiently encapsulated and allow unrestricted access to their internal properties. As a result, the code becomes difficult to read, because it becomes unclear what the object is actually for. The class's interface loses its meaning. And changing such a class in the future becomes practically impossible, because one cannot be sure that some part of the application is not accessing the property directly.

Most often this looks like declaring properties as public rather than protected or private. It is often caused by "immature programming" - when a programmer starts writing a class without fully knowing what the class will do.

How to fight it? Design and finalize the class interface before writing the code.

Consequences

The result of an object orgy is mainly the loss of the benefits of encapsulation, including:

  • Unrestricted access prevents the reader from reasoning about the object's behavior. This is because direct access to its internal state means that any other part of the system can manipulate it, increasing the amount of code that needs to be checked and creating opportunities for future misuse.
  • As a consequence of this difficulty in reasoning, design by contract becomes practically impossible.
  • If most of the code takes advantage of the lack of encapsulation, the result is a hard-to-maintain maze of interactions, widely known as a “ rat's nest” or spaghetti code.
  • The original design is obscured by excessively broad interfaces to the objects.
  • Broad interfaces make it difficult to reimplement a class without breaking the rest of the system. This is especially difficult when the clients of a class are developed by a different team or a different organization.

Forms

Encapsulation can be weakened in several ways, including:

  • By declaring internal members public, or by providing free access to data through public mutator methods (setters or getters).
  • By granting privileged access. For example, see: Java access modifiers and accessibility levels in C #
  • In C ++ through some of the means listed above and by declaring friendclasses or functions.

An object can also make its internal data accessible by passing references to it as arguments to methods or constructors of other classes, which may retain those references.

In contrast, objects that hold references to each other, although sometimes described as a form of object orgy, do not by themselves violate encapsulation.

Causes

Members may be declared public to avoid the extra effort or syntactic overhead associated with providing them with proper accessors. This can improve the readability of the class, but at the cost of the consequences described above.

In some languages, a member intended to be read by other objects may be made mutable, because the language lacks a convenient construct for read-only access.

An object orgy can be a symptom of coding an immature, anemic design, where the designer has not sufficiently analyzed the interactions between objects. It can also arise from laziness or haste in implementing the design, especially when the programmer does not communicate enough with the designer, or from a reluctance to revise the design when problems arise, which also encourages many other anti-patterns.

Many programmers treat objects as anemic data stores and manipulate them, violating the principles of information hiding, encapsulation, and design by contract.

Solutions

As a rule, encapsulation is violated because the design of other classes requires it, and rework is needed. If that is not the case, it may be enough to recode the system in accordance with best practices. Once interfaces have been published irrevocably, it may already be too late to fix them.

Comments

Blok 12-03-2021
Объект - это никак не массив. Объект - это экземпляр класса. А класс, что ещё более очевидно, - это никак не массив. Класс есть бизнес-логика участка памяти. :) Сугубо физически.


Сугубо физически это область памяти, в которой хранятся ссылки на переменные и функции, которые принято называть свойствами и методами :))
А бизнес-логика -- это вообще маркетинговый термин какой-то, не имеющий отношения к тому, что происходит в реальных программах. Только его пихают теперь где попало, в чем я лично не вижу никакого смысла
Agentt 12-03-2021
Да, и кстати.. ActiveRecord != запись в базе данных. Это просто ее абстрактное представление. И после смерти объекта запись продолжает существовать и далее.


ActiveRecord это популярный шаблон проектирования, а не абстрактное представление. Как-нибудь я сделаю. пост на эту тему. Не сейчас.


ActiveRecord это бледная калька с Ruby. Очень вредная, к слову. :) Но приходится с ней жить.


Если предложите что-то более подходящая я буду безмерно рад :)


SQL выучить это не западло :)) Честно-честно. К чему плодить уровни абстракции?


Видимо, у нас с Вами разные понятия об ActiveRecord :)
Филипп 12-03-2021
К слову, а что делать с magic methods? :)


Да не нужно скрывать код! :) protected не для этого. Сейчас я вижу, что вы уловили главную мысль анти-шаблона. И вообще анти-шаблонов - это проблема неквалифицированных программистов, но никак не языка программирования или подходов к программированию как таковых. :) Конечно, если есть 100% уверенность в том, что public свойства не используются извне - нет необходимости делать их protected. Но пока они не protected - до ста процентов уверенность никак не дотянет :) По крайней мере у меня.
Менять интерфейс - грех :) За это тоже можно "получить по голове".

magic methods очень полезная вещь. И делать с ними можно много всего интересного и полезного. когда-нибудь я сделаю пост о них (magic methods)
Serty 12-03-2021
Никем это не запрещено :) Нет конституции ООП, которая бы это запрещала. Более того, сокрытие ради сокрытия считалось всегда плохой практикой.
Сокрытие имеет целью удобство программиста, который будет потом работать с классом, дабы предоставить ему только то, что нужно, скрывая внутреннее представление объекта.

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


Публичные члены всегда считались плохой практикой, именно по причине объектной оргии.
Да, вы правды - цель protected и private декларации - удобство программиста. Но никак не для сокрытия. Интересно как это можно сокрыть код класса от программиста? Удобство заключается в том, что программист может спокойно изменять класс, если требуется, в пределах интерфейса, не беспокоясь о том, что приложение будет работать неправильно. Вы всё ещё никак не улавливаете основной мысли. :)

А по поводу поиска... :) Моё мнение - программист, который ищет точки обращения к публичным свойствам класса при помощи нехитрой операции поиска должен быть немедленно уволен.


Вот именно потому, что код скрыть нельзя, особенно в PHP, все эти protected и прочие прелести теряют смысл. Ибо изобретательный программист влезет в код и сменит одну строчку... ну потом получит по голове от менеджера, конечно, но это будет потом :)

Мысль-то я уловил. Я просто не вижу в этом проблемы. Интерфейс в общем-то тоже не Библия и даже не Бхагават-гита. Его тоже можно менять.

А поиск для того и придумали, чтобы им пользоваться. А программист обязан быть параноиком, предполагая, что все, что может быть использовано неправильно, будет именно так и использовано.
И использование protected -- не панацея. Панацея -- это использование программистов, которые понимают, что изменение свойств объекта извне -- есть зло. А обращение к тому, что не предполагает внешнего использования -- зло вдвойне.
И тогда хоть все методы и свойства будут public -- проблем это не вызовет.
Dori 12-03-2021
С точки зрения ООП никто не запрещает приложению менять ресурсы объекта. Это не есть очень хорошо, но тем не менее имеет право на жизнь.
Тем более в PHP, где все объекты живут секунды три-четыре, нет смысла использовать мега-паттерны с навешиванием на каждое свойство гетеров, сетеров и черта в ступе.

объекты это и есть массив.. только с напиханными в него методами. Сугубо физически :)
ReplyParentThread

С точки зрения ООП приложению КТЕГАРИЧЕСКИ ЗАПРЕЩЕНО менять внутренние ресурсы объекта напрямую.

Нет никакой связи между этим анти-шаблоном и временем жизни объектов. Но даже если на то пошло, то в подавляющем большинстве случаев в PHP используют паттерн ActiveRecord, и можно сказать, что объект "живёт" пока существует запись в базе данных, а это может быть не год и не два. Но никак не секунды.
Геттеры и сеттеры не решают проблемы "Объектной оргии", они лишь переводит её в новый вид. Вы не улавливаете главной идеи анти-шаблона "Объектная оргия" -
Стас 12-03-2021
Не так всё просто. Если свойство неоправданно задекларировано как public, то скорее всего весь класс реализован неверно с точки зрения ООП. То есть внутренними ресурсами объекта оперирует приложение, меняя его критичные свойства без его ведома. Тогда хочется сделать вывод, что объект - это скорее просто массив со значениями, а не экземпляр класса. Если просто поменять public на protected то приложение, скорее всего перестанет работать.
Nikita 12-03-2021
Ага, было непонятно, зачем класс, а поменяли с public на protected и сразу стало понятно, зачем этот класс придуман!
:)
Антон 12-03-2021
вот теперь я врубился точно, почему следует избегать public "И изменить такой класс в будущем становится практически невозможно, потому что нельзя быть уверенным, что какая-то часть приложения не обращается напрямую к свойству"... вернее понял, что не столько избегать, сколько в чем смысл public and protected, потому что в учебниках можно встретить лишь описание: public-можно обращаться извне, protected-нельзя или объяснения в таком же роде...

А вообще - это только через опыт - "опыт, сын ошибок трудных"...

To leave a comment

If you have any suggestion, idea, thanks or comment, feel free to write. We really value feedback and are glad to hear your opinion.
To reply

Lectures and tutorial on "Object oriented programming"

Terms: Object oriented programming