Как я могу сделать свои объекты / классы более переносимыми? - PullRequest
1 голос
/ 07 января 2010

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

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

У меня есть класс сеансов, у которого есть метод set , который позволяет мне устанавливать переменные для сеанса php, и у меня есть метод просмотра , который позволяет мне просматривать значение значения, которое уже был установлен с помощью метода set. Пока это звучит нормально, но на каждой странице моего сайта мне нужно получить доступ к данным сеанса или объектам сеанса, которые я должен сказать. Но затем, помимо каждой страницы, использующей объекты сеанса, я также использую их во всех моих классах, которым требуется значение сеанса. Я полагаю, что именно здесь я запутался, потому что теперь все эти другие классы полагаются на сессионный класс.

Любые идеи о том, если это не так, и если да, то каким образом я могу избежать этого, но при этом иметь доступ к данным сеанса в других классах, и при этом мои классы могут быть переносимыми plug-n-play в другое будущее приложения?

Ответы [ 4 ]

1 голос
/ 07 января 2010

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

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

Другим важным моментом является минимизация интерфейсов между компонентами. Если x является подмножеством X и Y зависит от x, то вы не должны передавать X. Это часто место, где есть место для улучшения.

0 голосов
/ 07 января 2010

Как правило, один класс, использующий другой, является чисто базовым ОО и тем, что вам нужно. Использование интерфейсов - это способ изолировать вашу конкретную логику, позволяя другим классам использовать этот компонент единообразным образом. Простой и распространенный способ - использовать Factory или Abstract Factory вместо прямого вызова конструкторов. Вы также должны взглянуть на парадигмы Inversion of Control и Dependency Injection (DI) . Вот простой пример , который может помочь вам в вашей проблеме (но учтите, что автор смешивает фабрики и DI).

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

0 голосов
/ 07 января 2010

Вы можете добавить один уровень абстракции, сделав его WorkingClass> StoringMapper> Session, с WorkingClass, вызывающим только StoringMapper. Таким образом, вы можете легко «отобразить» процесс хранения на любой другой класс, кроме Session (например, DatabaseSession), без каких-либо изменений на WorkingClass.

Я написал некоторый код для него в ответ на другой вопрос: Советы по проектированию фреймворка

0 голосов
/ 07 января 2010

Подумайте о том, что нужно этим другим классам, чтобы функционировать в соответствии с моделью вашего домена. Данные сеанса - это детали реализации, которые не должны влиять на то, как вы проектируете другие классы. Объект сеанса может иметь 100 свойств, но не каждому классу нужны все 100 этих свойств для работы. Им не нужно знать, сохранялись ли эти данные в сеансах, файлах cookie, плоских файлах, базах данных или на спутнике за пределами Земли.

Отличным ресурсом, который я нашел полезным при разработке классов, является эта книга и, в частности, глава 6 "Рабочие классы" для вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...