Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
1

Разница между двумя кусочкам кода выполняющими одно и то же

14.10.2018, 08:32. Просмотров 1561. Ответов 18
Метки нет (Все метки)

Здравствуйте. Интересует такой вопрос. Есть 2 кусочка кода, которые делают одно и то же, для решения некой абстрактной задачи:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Controller{
    public function index(Service $service){
        $item = $service->get(new Api);
    }
}
class Service{
    public function get(Api $api){
        // Получаем по апи данные о неком объекте и создаем инстанс своего объекта
        $data = $api->findData();
        return new Item($data);
    }
}
class Item{
    protected $data;
    public function __construct($data){
        $this->data = $data;
    }
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Controller{
    public function index(Service $service){
        $item = new Item(Api $api);
        $item->findData();
    }
}
class Item{
    protected $source;
    protected $data;
    public function __construct(Api $api){
        $this->source = $api;
    }
    public function findData(){
        $this->data = $this->source->findData();
    }
}
Я так понимаю первый кусочек более похож на процедурный код, а второй на оопешный, правильно? И правильнее использовать второй кусочек?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2018, 08:32
Ответы с готовыми решениями:

Какая разница между двумя строками кода?
Какая разница между: public string field; и public string field {set;get;} Я как бы...

Объявление указателей: есть ли разница между двумя примерами кода
Постоянно(в том числе и на данном форуме) встречаюсь с таким: int* f; или int * f; объявлением...

Делегаты. Разница между двумя двумя выражениями
Объясните, пожалуйста есть ли разница между двумя двумя выражениями. obja.activate += new...

Разница между двумя датами
Всем привет! Есть ComboBox в котором храняться значения "День" "Неделя" "Месяц" "Год". Мы вводим...

Разница между двумя числами.
Подскажите как организовать. Например: числа -7 и 5(разница 12), 1 и 3(разница 2), -1 и -10(разница...

18
Jewbacabra
Эксперт PHP
3558 / 2956 / 1315
Регистрация: 24.04.2014
Сообщений: 8,990
14.10.2018, 09:57 2
2 код не будет работать
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 10:16  [ТС] 3
Ну я не пытался указать прям точно рабочий код. Я лишь пытался передать суть. В первом варианте мы получаем данные для объекта и создаем объект. А во втором случае создаем объект, и из него заполняем его данными. Либо оба эти варианта не особо хороши?
0
tarasalk
1221 / 730 / 292
Регистрация: 13.06.2013
Сообщений: 2,578
14.10.2018, 10:22 4
Лучший ответ Сообщение было отмечено MadHatter как решение

Решение

Мне 1-й вариант больше нравится.Только Api передавать в конструктор, а сервис назвать репозиторием.
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 11:06  [ТС] 5
tarasalk, спасибо. Но в данном случае сервис не хранит никаких данных. Корректно ли называть его репозиторием?
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
14.10.2018, 11:13 6
Лучший ответ Сообщение было отмечено MadHatter как решение

Решение

Мне первый вариант тоже больше нравится. Потому что:
1) Item -- отдельная сущность, которая выполняет только свою условную обязанность.
2) Во втором варианте данные устанавливаются только при вызове findData извне. Что будет, если забыли вызывать? Да и в принципе неверно накладывать обязанность вызова findData на того, кто создаёт объект класса.

P.S. Зависимость "Api" в Service, я надеюсь,-- интерфейс, а не реализация? Иначе какой смысл требовать его извне, если можно в своём конструкторе создать объект...
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 11:40  [ТС] 7
Para bellum, спасибо. Да, это конечно был бы интерфейс. Апи я назвал для того чтобы было понятно что выполняет данный класс.
Я тоже выбрал первый. Но потом стали возникать некоторые сомнения. Но теперь все понял. Интересует еще один вопрос. К примеру мы все таки выбрали второй вариант. Апи реализовал интерфейс и все хорошо, например:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
interface ISerchable{
    public function findData(int $id);
}
class Api implements ISearchable{
    public function findData(int $id){
        // Совершаем запрос.
    }
}
class Item{
    protected $source;
    protected $data;
    public function __construct(ISearchable $source){
        $this->source = $source;
    }
    public function findData(){
        $this->data = $this->source->findData();
    }
}
Но потом нам понадобилось добавить еще один источник данных, например бд. И для поиска в бд нужно использовать не только id. А например еще идентификатор категории. Таким образом мы не сможем реализовать данный инерфейс для для класса бд. Как быть в данной ситуации?
0
tarasalk
1221 / 730 / 292
Регистрация: 13.06.2013
Сообщений: 2,578
14.10.2018, 11:57 8
Цитата Сообщение от MadHatter Посмотреть сообщение
Но в данном случае сервис не хранит никаких данных. Корректно ли называть его репозиторием?
Суть репозитория как раз в том, чтобы не зависеть от того как именно хранятся данные. АПИ, БД, даже просто массивчик - это уже деталь реализации.
Цитата Сообщение от MadHatter Посмотреть сообщение
А например еще идентификатор категории
PHP
1
2
3
interface ISerchable{
    public function findData(int $id, int $category_id = null);
}
А если интерфейсы совершенно не совместимы, то тут явно архитектурная ошибка и надо либо менять архитектуру, либо лепить костыли.
1
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 12:42  [ТС] 9
tarasalk, интерфейс примерно где-то так и будет отличаться. Просто получится что второй параметр будет не обязателен, а в случае с бд он обязателен.
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
14.10.2018, 12:52 10
Цитата Сообщение от MadHatter Посмотреть сообщение
И для поиска в бд нужно использовать не только id. А например еще идентификатор категории.
При замене одной реализации на другую (например с Redis на MySQL), код, использующий переданную реализацию (клиентский код это называется) не должен меняться.
А если реализация требует изменения клиентского кода, то имеет место ошибка проектирования.
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 13:04  [ТС] 11
Para bellum, вот я пытаюсь понять как избежать данной ошибки проектирования. Когда для другого источника нужна дополнительная переменная. Как тут можно поступить?
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
14.10.2018, 13:15 12
Опишите поподробнее обе реализации, почему между ними отличие возникает?
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 13:28  [ТС] 13
Para bellum, делаю сайт для совместных закупок. Информация о товарах берется с сайта поставщика по апи.
Есть так называемые группы - совокупность товаров в заказе. При поиске товара в базе необходим артикул и идентификатор группы(ведь товар может быть в разных группах), а при поиске по апи достаточно только артикула. Потому я и не могу просто подсунуть интерфейс ведь может оказаться что необходим идентификатор группы, а его не будет.
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
14.10.2018, 13:39 14
Хорошо.
1) Откуда берётся тот ID группы при поиске? Пользователь в форме указывает что-то вроде "искать по группе"?
2) Почему у вас в БД товары к группам прикреплены, а на том сайте нет?
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 13:51  [ТС] 15
Para bellum, 1. id группы берется по ссылке когда пользователь кликает на кнопку добавить товар, например /item/create/163.
2. Потому что тот сайт просто отдает информацию о своих товарах. Он не имеет вообще никакого отношения к тому, как я храню информацию.
Группа это просто моя классификация.
Например мной создана группа №163. В данную группу пользователи добавляют артикулы товаров с того сайта и желаемое количество. Далее, когда люди решили что они уже выбрали все что хотели, то все товары из данной группы отправляются на сайт поставщика и он осуществляюет доставку всех этих товаров.
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
14.10.2018, 17:08 16
Ещё вопрос: при каких обстоятельствах возможно переключение с базы на API и обратно?
Если к API производится запрос для получения информации о товаре, то зачем может понадобиться запрос к базе? Что-то типа кеша (чтобы к API не обращаться лишний раз) или что?
Если что-то типа кеша, то зачем к группе привязывать?
0
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 17:21  [ТС] 17
На данный момент я обошел данную проблему и сделал все гораздо проще. Но вопросы остались. Это было примерно так: когда пользователь нажимает кнопку добавить товар, то происходит поиск в базе, добавлял ли кто-то данный товар в текущую группу, если никто не добавлял, то данные берутся по апи. Реализация планировалась примерно такой, но естественно при такой реализации я толком не мог придумать как реализовать интерфейс и как дать гарантию что все будет работать стабильно.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
class {
    protected $source;
    public function __construct(ISearchable $source){
        $this->source = $source;
    }
    public function get(int $group, int $article, ISearchable $reserve){
        $result = $this->source->find($group, $article);
        if(!$result){
             $result = $reserve->find($article);
        }
        return $result;
    }
}
0
Para bellum
Эксперт PHP
4187 / 3114 / 1010
Регистрация: 06.01.2011
Сообщений: 9,091
14.10.2018, 17:45 18
Цитата Сообщение от MadHatter Посмотреть сообщение
когда пользователь нажимает кнопку добавить товар, то происходит поиск в базе, добавлял ли кто-то данный товар в текущую группу, если никто не добавлял, то данные берутся по апи
Я так и предполагал.
Вот вы делаете запрос к API, пишете данные о товаре в свою базу. Товар от привязки к группе как-то меняется? Нет.
Таким образом, зачем далее ограничивать поиск какой-то группой?

К группе привязывать нужно, но с помощью связи многие-ко-многим. А поиск производить по отдельной таблице "товары" и неважно, с какими группами данный товар связан.
1
MadHatter
116 / 115 / 43
Регистрация: 15.06.2013
Сообщений: 834
14.10.2018, 19:12  [ТС] 19
Para bellum, ну определенная логика в том, чтобы отвязаться от группы есть. Но при таком подходе может произойти такая ситуация что товар на сайте поставщика может пропасть, а данный артикул могут присвоить другому товару. По крайней мере вероятность такая имеется. Там просто внутренние артикулы, чисто для их сайта, а оригинальные они скрывают. Но у товара есть еще айдишник, который, по идее, уникален. И можно было попробовать привязаться к нему. Ну, по крайней мере, на определенные мысли на будущее вы меня натолкнули. Спасибо.
0
14.10.2018, 19:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2018, 19:12

Разница между двумя датами
Вообщем проблема такая получаю 1 дату start = System.currentTimeMillis() через некоторое время...

Разница между двумя время
Добрый вечер ребята, мне нужно помощь . ест база Accеss три поля. Программа пишу на Делфи {Время...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru