объектно-ориентированное программирование на php

У меня есть несколько вопросов, касающихся ООП. Я не продвинутый пользователь и столкнулся с проблемой, с которой некоторые уже сталкивались.

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

У меня есть класс Car и User. Пользователь размещает информацию об автомобиле на веб-сайте, возможно, для продажи...

В классе User у меня есть getUser в основном для получения информации о пользователе.

Итак, в классе Car я могу использовать setCar, getCar, saveCar. Чтобы отобразить эти автомобили, у меня может быть метод displayCars(). в displayCars() я могу использовать getCar для получения списка автомобилей. но мне также может понадобиться использовать User::getUser для получения информации о пользователях, которые представили эти автомобили. Так что в некотором смысле displayCars зависит от User::getUser.

Так что мне здесь делать?


person chrizonline    schedule 05.03.2011    source источник
comment
Возможно, у вас есть getCars, который также возвращает идентификатор пользователя того, кто опубликовал автомобиль. Затем вы можете использовать этот идентификатор пользователя и передать его своему методу getUser.   -  person StackOverflowNewbie    schedule 05.03.2011
comment
DisplayCars не должен быть частью класса Car. Он должен находиться в отдельном классе, предназначенном для отображения автомобилей. Этот независимый дисплей может отображать любой класс, реализующий ICar. Таким образом, средство отображения можно повторно использовать для различных реализаций ICar. Отделите код отображения от бизнес-логики (функционала). Программа Google для интерфейса, а не для реализации   -  person Spidy    schedule 05.03.2011
comment
Привет, StackOverflowNewbie, да, у getCars есть идентификатор пользователя, и я использовал его для перехода к User::getUser() для получения информации о пользователе. Но проблема здесь с Car::displayCars(), которая зависит от User::getUser(). Я хотел бы уменьшить сцепление. знак равно   -  person chrizonline    schedule 05.03.2011
comment
Привет Spidy, я рассмотрю вашу идею. Я думаю, что разделение функций отображения уменьшит связь. Однако это подводит меня к другому связанному вопросу. Например: у меня есть класс CarComments, который обрабатывает комментарии, оставленные пользователями для этих автомобилей. Если я вызываю deleteCar(), он также должен вызывать CarComment::deleteComments(). так что есть некоторая зависимость тоже. хм =)   -  person chrizonline    schedule 05.03.2011


Ответы (2)


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

  • Каждый отдельный автомобиль должен быть представлен объектом Car.
  • Пользователи вводят информацию, которая заполняет атрибуты объекта Car.
  • И объект Car, и пользователь, отправивший этот Car, становятся атрибутами объекта CarDBItem.
  • Затем все элементы CarDBItem помещаются в объект CarDB, который управляет всеми автомобилями, введенными любым из пользователей.

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

person J. Taylor    schedule 05.03.2011
comment
Привет jrtayloriv, ​​ткс. это конечно выглядит тяжело =). возможно, мне придется переписать большинство кодов. но стоит подумать о создании более надежного приложения. - person chrizonline; 05.03.2011

Частично ваше замешательство связано с тем, что OO и MVC — это совершенно разные концепции проектирования, и на самом деле они могут противоречить друг другу. Я сталкиваюсь с теми же спорами на работе.

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

ООП говорит, что если вам нужно, чтобы два класса работали одинаково, пусть они наследуют общую функциональность от базового класса, в то время как MVC обычно предпочитает размещать фасад перед классами, которые вызывают другие классы с реальной функциональностью.

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

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

person dj_segfault    schedule 05.03.2011
comment
Привет, dj_segfault, спасибо за информацию. да, у меня тоже есть опыт этого слишком много раз. Ну, я думаю, что эта дискуссия будет возникать время от времени =) - person chrizonline; 05.03.2011