Объектная оргия
В компьютерном программировании объектная оргия — это ситуация, в которой объекты недостаточно инкапсулированы посредством сокрытия информации , что обеспечивает неограниченный доступ к их внутренностям. Это распространенный сбой (или антишаблон ) в объектно-ориентированном проектировании или объектно-ориентированном программировании , и он может привести к увеличению потребностей и проблем в обслуживании и даже к неподдерживаемой сложности.
Последствия
[ редактировать ]Результатами объектной оргии в основном являются утрата преимуществ инкапсуляции, в том числе:
- Неограниченный доступ затрудняет читателю понимание поведения объекта. Это связано с тем, что прямой доступ к его внутреннему состоянию означает, что любая другая часть системы может манипулировать им, увеличивая объем кода для проверки и создавая возможности для будущих злоупотреблений.
- Из-за сложности рассуждений проектирование по контракту фактически невозможно.
- Если большая часть кода использует отсутствие инкапсуляции, в результате получается трудно поддерживаемый лабиринт взаимодействий, широко известный как « крысиное гнездо» или «код спагетти» .
- Оригинальный дизайн затеняется чрезмерно широкими интерфейсами к объектам.
- Широкие интерфейсы затрудняют повторную реализацию класса, не нарушая остальную часть системы. Это особенно сложно, когда клиенты одного класса разрабатываются другой командой или организацией.
Формы
[ редактировать ]Инкапсуляция может быть ослаблена несколькими способами, в том числе:
- Объявляя внутренние члены общедоступными или предоставляя свободный доступ к данным с помощью общедоступных методов-мутаторов (сеттеров).
- Предоставляя закрытый доступ. Например, см.: Модификаторы доступа Java и уровни доступности в C#. [ 1 ]
- В C++ с помощью некоторых из вышеперечисленных средств и объявления
friend
классы или функции.
Объект также может сделать свои внутренние данные доступными, передав ссылки на них в качестве аргументов методам или конструкторам других классов, которые могут сохранять ссылки.
Напротив, объекты, содержащие ссылки друг на друга, хотя иногда и описываются как форма объектной оргии, сами по себе не нарушают инкапсуляцию.
Причины
[ редактировать ]Члены могут быть объявлены общедоступными, чтобы избежать усилий и синтаксических издержек, связанных с предоставлением подходящих средств доступа им . Это может повысить читаемость класса, но за счет последствий, описанных выше.
В некоторых языках элемент, предназначенный для чтения другими объектами, можно сделать модифицируемым, поскольку в языке нет удобной конструкции для доступа только для чтения.
Оргия объектов может быть симптомом незрелого и анемичного дизайна, когда дизайнер недостаточно проанализировал взаимодействия между объектами. Это также может возникнуть из-за лени или поспешности при реализации проекта, особенно если программист недостаточно общается с дизайнером, или из-за нежелания пересматривать дизайн при возникновении проблем, что также порождает множество других антипаттернов.
Многие программисты рассматривают объекты как анемичные хранилища данных и манипулируют ими, нарушая принципы сокрытия информации , инкапсуляции и проектирования по контрактам .
Решения
[ редактировать ]В общем, инкапсуляция нарушается, потому что этого требует конструкция других классов и требуется ее перепроектирование. Если это не так, может оказаться достаточным перекодировать систему в соответствии с лучшими практиками. Как только интерфейсы будут опубликованы безвозвратно, исправлять их может быть уже слишком поздно.
Ссылки
[ редактировать ]- ^ MSDN: Уровни доступности, Visual Studio .NET 2003. Архивировано 17 апреля 2008 г. на Wayback Machine ).