Я начал проект сегодня, и после разработки структуры базы данных и того, как будут храниться данные и т.д., Я начал реализацию. Я делаю это на php, но язык здесь не очень уместен, так как мои сомнения более связаны с архитектурой или я думаю, так как я боюсь больше, чем я думал, внедряя материал в ООП на PHP. (Недавно я прыгнул на php, я кодировал в c++ и java раньше).
Итак, я начал с создания моего класса "Пользователь", простого, как это, несколько атрибутов и методов __construct, insert, update и delete. Последние 3, запросы к db.
Тогда это сомнение пришло мне в голову, и я, вероятно, знаю ответ сам, но я просто не узнаю.
Теперь я могу создавать экземпляры и создавать новых пользователей: $user = new User("John", 34)
но что, если я хочу отредактировать пользователя "Dave"? Или я хочу показать всех пользователей. Этот метод, например, getAllUsers()
который вернет всех пользователей, которые будут реализованы? Потому что он действительно не принадлежит классу User? Если бы это было так, то как я мог бы указать этот метод, если у меня нет экземпляра пользователя?
Я думаю, мне понадобится класс Users или UserCollection, который будет представлять собой коллекцию всех пользователей, с методами "getCertainUser (id) "и "getAllUsers()", которые возвратят определенный Пользователь или все из них, теперь я был бы пользователь, которого я мог бы редактировать, не так ли?
Это, как говорится, мои вопросы, как эта проблема должна быть рассмотрена как способ пойти, я слишком усложняю вещи? Как это должно быть разрешено "правильным способом" в ООП. Временами, с которыми я справлялся с подобными проблемами, я никогда не использовал базу данных, поэтому наличие коллекции пользователей было единственным способом их хранения, но наличие базы данных, в которой хранятся пользователи, кажется излишним, чтобы иметь такую коллекцию пользователей.
Заранее спасибо.
Во-первых, вы поступаете правильно, бросая вызов себе.
Очевидно, что есть много способов делать вещи.
Я очень верю, что попытка сохранить разницу как можно больше и держать классы небольшими и простыми всегда являются двумя хорошими рекомендациями, когда вы хотите написать код, который легко поддерживать и тестировать.
Это было бы одним из способов сделать это:
Для обработки моделей и конструкций
Entity/User (Define the properties of a user)
Collection/User (implements ArrayIterator, just a structure)
Для связи с вашим репозиторием (db).
Repository/Mysql/User (implements getAllUsers, saveUser, deleteUser, etc.)
Эти классы должны реализовывать общие интерфейсы или наследовать общие абстрактные классы (если они имеют общую логику).
Для основной операции настойчивости (обновление, удаление, создание) я предпочитаю перемещать их в классе репозитория вместо объекта. Я предпочитаю избегать использования "умных" объектов сущностей. На мой взгляд, это имеет больше смысла. Но есть много людей, которые бы не согласились (и здесь нет правильного или неправильного).
У меня есть структура Data Model, похожая на вашу, где классы представляют свои таблицы. В случае получения множественного числа "Пользователь" или "Категории" и т.д. У меня есть статический метод внутри класса, который возвращает экземпляры класса. В примере:
class User{
public static function fetchUsersForBusiness(Business $business){
//fetch code here into variable $users from database...
$userObjs = [];
foreach($users as $userData){
$userObjs[] = new User($userData);
}
return $userObjs;
}
}
class Business{
}
Следующий код вернет всех пользователей, которые соответствуют определенным критериям (в данном случае бизнес, с которым они связаны). Затем я возвращаю их как сами объекты.
Я нашел эту модель довольно успешной и использовал ее на множестве языков, включая Java, PHP и Swift. Надеюсь, это поможет вам.
UserRepository
который обрабатывает получение и сохранение пользователей в базе данных. В ОО нет правила, согласно которому все функции должны быть в одном объекте. (На самом деле, есть много вещей, которые говорят, что этого не должно быть.)