Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ООП на практике
Форумы портала PHP.SU » » Объектно-ориентированное программирование » ООП на практике

Страниц (1): [1]
 

1. Wooorker - 02 Декабря, 2014 - 18:00:50 - перейти к сообщению
Пишу класс для актуализации товара магазина joomshopping.
В ООП не силён.
Поэтому сделал класс для подключения к базе, класс для обработки изображений и класс где собственно и происходит актуализация.
Вот его схема
1. функция function __construct, где вызываем родительскую функцию подключения к БД.
2. функция function _loadCSV($flnamecsv), где:
2.1. создаём таблицу $priceTable для импорта данных из прайса
2.2. парсим csv в ранее созданную таблицу $priceTable
2.3. получаем массив $results с теми записями из $priceTable, которых ещё нет в магазине
2.4. вставляем новые записи из $priceTable в магазин
2.5. снимаем с публикации те записи, которых нет в $priceTable
2.6. публикуем новые записи и обновляем цену у всех товаров
2.7. вставляем имена файлов изображений в соответствующую таблицу
2.8. подготавливаем все необходимые в дальнейшей работе запросы
2.8.1 выборка категории с заданными наименованиями и родительской категорией
2.8.2 определяем максимальный order для конкретной родительской категории
2.8.3 определяем id для соответствующего кода товара
2.8.4 вставляем в таблицу с категориями запись с заданными именами файла изображения, родительского id, очередного order, наименованием категории
2.8.5 в таблицу соотношения товара и категории делаем соответствующую запись
2.8.6 определяем id производителя
2.8.7 определяем максимальный order для производителя
2.8.8 вставляем в таблицу с производителями запись с соответствющими наименованием и очередным order
2.8.9 меняем в таблице с товаром id производителя на определённый в запросах ранее
2.9. для каждого элемента массива $results делаем цикл, в котором в перечисленные ранее запросы передаём параметры и выполняем соответствующие операции, а также загружаем файл изображения, делаем для него превьюшку и средних размеров изображение. Для этого вызываем функцию _downloadImage
3. функция _downloadImage($sourceName, $targetName, $quality, $width, $height)
Эта функция работает с классом обработки изображения
4. функция buildReport()
Она вызывает функцию function _loadCSV($flnamecsv) и пишет в итоге, что операция завершена.
-------------------------------- -------------------------------
Очевидно, что функцию function _loadCSV($flnamecsv), наверное, надо разбить на несколько отдельных функций, тексты запросов или даже подготовленные запросы вынести в отдельный класс? Операцию по выполнению всех этих запросов вынести в отдельную функцию? Тогда в новой функции опять заново присваивать имена таблиц БД переменным? Подскажите как сделать красиво.
2. Bio man - 02 Декабря, 2014 - 23:59:25 - перейти к сообщению
Есть 1 хорошая традиция, гласящая, что метод должен выполнять одну задачу, а имя метода должно кратко описывать выполняемую методом задачу.
Теперь попробуй назвать метод так, что бы глядя на название ты бы уже, хотя бы, начинал понимать для чего он нужен. Думаю будет не меньше 200 символов. Метод нужно разделить.
В итоге получится большой класс, что уже намекает, что класс нужно разделить.

Выдели сущности, следуй базовым принципам ооп. То что ты привёл это не класс в стиле ооп, ооп даже близко нет.

Дам подсказку, работу с бд нужно вынести в отдельный класс/ы, я бы взял для этих целей ActiveRecord из yii2.
3. Wooorker - 03 Декабря, 2014 - 15:59:37 - перейти к сообщению
Bio man пишет:
То что ты привёл это не класс в стиле ооп, ооп даже близко нет.
Дам подсказку, работу с бд нужно вынести в отдельный класс/ы, я бы взял для этих целей ActiveRecord из yii2.

Поэтому и спрашиваю как это должно выглядеть.
yii2 - даже не представляю что это такое.

Привёл подробное описание именно для того, чтобы можно было его разложить на функции и классы.
Мне не надо детально всё разделять. Просто напишите или дайте ссылку: вот это вот так обычно делают, это - эдак и т. д.
4. DeepVarvar - 03 Декабря, 2014 - 16:33:06 - перейти к сообщению
Wooorker пишет:
вот это вот так обычно делают
Google -> ООП паттерны проектирования
5. Panoptik - 03 Декабря, 2014 - 17:20:11 - перейти к сообщению
по всем канонам ооп вам нужно разделить импортируемые сущности и на каждую сущность создать свой класс. в идеале все классы должны реализовать интерфейс или наследовать абстрактный класс с методом импорт, в который передаются данные или ссылка на источник данных.
в абстрактном классе можно описать имортер и всякие хелперы которым будут делегироваться определенные стандартные для всех сущностей задачи. например источник с базой данных или что-то еще

собственно ополся просто делаете

PHP:
скопировать код в буфер обмена
  1. $orderImport = new OrderImport();
  2. $orderImport->import('order.csv');
  3. $productImport = new ProductImport();
  4. $productImport->import('product.csv');


можно конечно регулировать аргументы методов или конструкторов, но это уже нюансы реализации
6. Wooorker - 03 Декабря, 2014 - 19:28:11 - перейти к сообщению
Panoptik пишет:
по всем канонам ооп вам нужно разделить импортируемые сущности и на каждую сущность создать свой класс

Я это понял. Не понял как в моем случае это реализовать. Ну отделить импорт csv от всего остального не проблема. А с остальным то что делать?
Гугл даёт лишь определения. Без конкретных примеров, связанных с подготовкой запросов, их использованием и прочим, описанным выше, боюсь я ничего не пойму.

 

Powered by ExBB FM 1.0 RC1