@AlexandrMa

Как сделать класс управления записями?

Хочу разобраться, каким образом сделать управление записями Книга на моём примере книг.

Видел разные реализации, собрал что-то своё :)

Таблица
CREATE TABLE `books` (
  `id` smallint(5) UNSIGNED NOT NULL,
  `name` varchar(255) NOT NULL,
  `price` smallint(5) NOT NULL
) ENGINE=InnoDB;


Планирую, используя ООП, сделать управление этой таблицей. Интересует больше теория.

Вариант первый

class BookControl
{
  protected $db;
    
  public function initDatabase(PDO $db){
    $this->db = $db;
  }

  public function create(array $data){
    /* Insert in database */
  }

  public function update(array $data){
    /* update/delete in database */
  }

  public function getAll(){
    /* return array all rows */
  }

  public function getById($id){
    /* return one row */
  }
    
}


Вариант второй

class Book
{
  public $id;
  public $name;
  public $price;

  public function __construct(int $id, string $name, int $price){
    $this->id = $id;
    $this->name = $name;
    $this->price = $price;
  }

  public function getId(){
    return $this->id;
  }

  public function getName(){
    return $this->name;
  }

  public function getPrice(){
    return $this->price;
  }

  public function changeName(string $name){
    $this->name = $name;
  }

  public function changePricen(int $price){
    $this->price = $price;
  }
}

class BookControl2
{
  public $book;

  public function initDatabase(PDO $db){
    $this->db = $db;
  }

  public function create(Book $book){
    /* create */
  }

  public function update(Book $book){
    /* update */
  }

  public function get(Book $book){
    /* return book objects */
  }
}


Второй получше реализует принцип ооп, хотя на ДАННОМ примере не совсем понятно его преимущество.

Вразумите пожалуйста, каким образом в дальнейшем грамотней делать. Первый или второй вариант. И самое главное, чтобы другой программист быстрее разобрался и доработал.
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 3
dmitriylanets
@dmitriylanets
веб-разработчик
второй более норм, но есть моменты:
1. это репозиторий, класс который сохраняет сущности в хранилище
поэтому
BookRepository
2. create update сделать приватными и можно заменить на save
public function save(Model $model): void{
   if($model->getId()>0){
      $this->update($model);
   }
   else{
     $this->create($model);
   }
}

3. public function initDatabase(PDO $db) - это контруктор
public function __construct(PDO $db)
4. public function get(Book $book) - что это? public function findById($id): ?Book - более правильно
5. public function getAll() - правильных ход, но если 1млн записей, все вытащите? нужна критерия выборки и коллекция на выходе а не массив
public function getAll(Criteria $criteria): BookCollection

п.с вообще то если ООП то у вас Book должна быть богатой моделью предметной области в данном случае это Rich Model где поведение модели размазано по слоям
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
Вопрос, как всегда, совсем не о том.

Код этих двух "классов управления записями" по сути ведь не отличается друг от друга. Отличается только формат этих записей, в котором класс выдаёт результат работы - либо массив, либо объект.

То есть вопрос на самом деле - в каком формате работать с книгами в коде - в виде массивов или объектов, а не как ими управлять.

И ответ на него очевиден - поскольку в объект можно вкрячить кучу функционала, например метод validateISBN(), то однозначно работать с объектами удобнее.
Ответ написан
Подходы есть разные - ActiveRecord (похоже на 1й вариант), DataMapper и др. Выбираем в зависимости от сложности моделей предметной области и перспектив роста проекта.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы