Что здесь лучше использовать? Простое наследование, интерфейсы, или вообще абстрактный класс?
В общем в моей доске объявлений есть куча мест где выводится некий Список объявлений, а именно:
- Класс свежие объявления на Главной
- Класс мои объявления в личном кабинете
- Класс мои избранные объявления (чужие объявления которые я добавил в Избранное)
- Класс объявления по категориям (отображает список объявлений определенной категории)
Так вот, у всех этих классов есть одна общая вещь - все они являются Списками, и эти списки по сути отображают одинаковые карточки объявлений (если судить по полям: картинка, заголовок, цена), но списки эти выводятся исходя из разных условий, то есть каждый список будет иметь индивидуальный набор элементов.
Что здесь лучше использовать? Наследовать все эти классы от абстрактного класса AdvertsList? Или может делать интерфейс с методом getAdvertsList и каждый класс по-своему его реализует (на своих условиях)?
Антон Р., например метод делает запрос и сохраняет в свойство, потом например вызывается другой метод, который работает уже со свойством. То есть чтоб несколько раз не тянуть данные с базы, один раз взяли и сохранили в свойстве, ну и методы типо сортировки или первый или последний элемент.
Как тогда мне задавать условия вывода разных списков? Например в методе getNewAdverts на Главной будет один SQL запрос, а в методе getMyAdverts в личном кабинете другой запрос к базе.
Максим Федоров, не совсем еще понимаю что такое DTO, но честно говоря первое что приходит на ум для решения задачи это как раз абстрактный класс:
<?php
abstract class AdvList {
abstract function getAdvertsList();
}
class favoriteAdverts extends AdvList {
public function getAdvertsList(){
// Вывести все избранные.
}
}
class myAdverts extends AdvList {
public function getAdvertsList(){
// Вывести все мои.
}
}
class newAdverts extends AdvList {
public function getAdvertsList(){
// Вывести все новые.
}
}
class categoryAdverts extends AdvList {
public function getAdvertsList(){
// Вывести все по категории.
}
}
// К примеру такая ДТОшка
namespace Dto\Advert;
class Advert
{
public function __construct(
string $name,
string $description,
string $image
);
}
namespace Advert;
class AdvertRepository
{
/** Dto\Advert[]|AdvertCollection */
public function getNewAdverts(): array;
/** Dto\Advert[]|AdvertCollection */
public function getFavoriteAdverts(): array;
/** Dto\Advert[]|AdvertCollection */
public function getUserAdverts(): array;
}
выложи в отдельной теме код, ты оч много вопросов задаешь, явно видно, что стараешься, но упорно клонишь куда-то не туда в архитектуре... надо посмотреть что ты делаешь, может помогут заранее избавить тебя от плохой архитектуры.
И фаулера главу "источники данных" ты не читал, да?
Фаулера 1-2 главу прочитал, но параллельно еще читаю Зандстру + вебинары Елисеева, возможно что-то упускаю конечно.
В плане кода у меня там сейчас полный позор и каша - смесь процедурки, кусков mvc, подключаемых функций, ну и немного классов.
Честно говоря с написанием классов самая засада, потому что отовсюду слышится про архитектуру и что надо сразу "правильно" всё писать, в результате много времени уходит на обдумывание и сомнения "а правильно ли я тут делаю?", но скорее всего сейчас надо делать "как делается", а потом уже улучшать и обтачивать архитектуру.
Ну и до кучи я установил Yii у себя на хостинге, пытаюсь там что-то понять.