ООП реализация сомнений

0

Я начал проект сегодня, и после разработки структуры базы данных и того, как будут храниться данные и т.д., Я начал реализацию. Я делаю это на php, но язык здесь не очень уместен, так как мои сомнения более связаны с архитектурой или я думаю, так как я боюсь больше, чем я думал, внедряя материал в ООП на PHP. (Недавно я прыгнул на php, я кодировал в c++ и java раньше).

Итак, я начал с создания моего класса "Пользователь", простого, как это, несколько атрибутов и методов __construct, insert, update и delete. Последние 3, запросы к db.

Тогда это сомнение пришло мне в голову, и я, вероятно, знаю ответ сам, но я просто не узнаю.

Теперь я могу создавать экземпляры и создавать новых пользователей: $user = new User("John", 34) но что, если я хочу отредактировать пользователя "Dave"? Или я хочу показать всех пользователей. Этот метод, например, getAllUsers() который вернет всех пользователей, которые будут реализованы? Потому что он действительно не принадлежит классу User? Если бы это было так, то как я мог бы указать этот метод, если у меня нет экземпляра пользователя?

Я думаю, мне понадобится класс Users или UserCollection, который будет представлять собой коллекцию всех пользователей, с методами "getCertainUser (id) "и "getAllUsers()", которые возвратят определенный Пользователь или все из них, теперь я был бы пользователь, которого я мог бы редактировать, не так ли?

Это, как говорится, мои вопросы, как эта проблема должна быть рассмотрена как способ пойти, я слишком усложняю вещи? Как это должно быть разрешено "правильным способом" в ООП. Временами, с которыми я справлялся с подобными проблемами, я никогда не использовал базу данных, поэтому наличие коллекции пользователей было единственным способом их хранения, но наличие базы данных, в которой хранятся пользователи, кажется излишним, чтобы иметь такую коллекцию пользователей.

Заранее спасибо.

  • 0
    Вы можете создать класс UserRepository который обрабатывает получение и сохранение пользователей в базе данных. В ОО нет правила, согласно которому все функции должны быть в одном объекте. (На самом деле, есть много вещей, которые говорят, что этого не должно быть.)
  • 0
    Я думаю, что это лучше подходит для programmers.stackexchange.com
Показать ещё 2 комментария
Теги:
oop

2 ответа

1

Во-первых, вы поступаете правильно, бросая вызов себе.

Очевидно, что есть много способов делать вещи.

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

Это было бы одним из способов сделать это:

Для обработки моделей и конструкций

Entity/User (Define the properties of a user)
Collection/User (implements ArrayIterator, just a structure)

Для связи с вашим репозиторием (db).

Repository/Mysql/User (implements getAllUsers, saveUser, deleteUser, etc.)

Эти классы должны реализовывать общие интерфейсы или наследовать общие абстрактные классы (если они имеют общую логику).

Для основной операции настойчивости (обновление, удаление, создание) я предпочитаю перемещать их в классе репозитория вместо объекта. Я предпочитаю избегать использования "умных" объектов сущностей. На мой взгляд, это имеет больше смысла. Но есть много людей, которые бы не согласились (и здесь нет правильного или неправильного).

  • 0
    Классический шаблон ActiveRecord против папок с данными
0

У меня есть структура 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. Надеюсь, это поможет вам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню