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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: ООП на практике

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как правильно "разложить" на классы и функции
Wooorker
Отправлено: 02 Декабря, 2014 - 18:00:50
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Пишу класс для актуализации товара магазина 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), наверное, надо разбить на несколько отдельных функций, тексты запросов или даже подготовленные запросы вынести в отдельный класс? Операцию по выполнению всех этих запросов вынести в отдельную функцию? Тогда в новой функции опять заново присваивать имена таблиц БД переменным? Подскажите как сделать красиво.

(Отредактировано автором: 02 Декабря, 2014 - 18:02:06)

 
 Top
Bio man
Отправлено: 02 Декабря, 2014 - 23:59:25
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Есть 1 хорошая традиция, гласящая, что метод должен выполнять одну задачу, а имя метода должно кратко описывать выполняемую методом задачу.
Теперь попробуй назвать метод так, что бы глядя на название ты бы уже, хотя бы, начинал понимать для чего он нужен. Думаю будет не меньше 200 символов. Метод нужно разделить.
В итоге получится большой класс, что уже намекает, что класс нужно разделить.

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

Дам подсказку, работу с бд нужно вынести в отдельный класс/ы, я бы взял для этих целей ActiveRecord из yii2.
 
 Top
Wooorker
Отправлено: 03 Декабря, 2014 - 15:59:37
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Bio man пишет:
То что ты привёл это не класс в стиле ооп, ооп даже близко нет.
Дам подсказку, работу с бд нужно вынести в отдельный класс/ы, я бы взял для этих целей ActiveRecord из yii2.

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

Привёл подробное описание именно для того, чтобы можно было его разложить на функции и классы.
Мне не надо детально всё разделять. Просто напишите или дайте ссылку: вот это вот так обычно делают, это - эдак и т. д.
 
 Top
DeepVarvar Супермодератор
Отправлено: 03 Декабря, 2014 - 16:33:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Wooorker пишет:
вот это вот так обычно делают
Google -> ООП паттерны проектирования
 
 Top
Panoptik
Отправлено: 03 Декабря, 2014 - 17:20:11
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2493
Дата рег-ции: Нояб. 2011  
Откуда: Одесса, Украина


Помог: 131 раз(а)




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

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

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


можно конечно регулировать аргументы методов или конструкторов, но это уже нюансы реализации


-----
Just do it
 
 Top
Wooorker
Отправлено: 03 Декабря, 2014 - 19:28:11
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Panoptik пишет:
по всем канонам ооп вам нужно разделить импортируемые сущности и на каждую сущность создать свой класс

Я это понял. Не понял как в моем случае это реализовать. Ну отделить импорт csv от всего остального не проблема. А с остальным то что делать?
Гугл даёт лишь определения. Без конкретных примеров, связанных с подготовкой запросов, их использованием и прочим, описанным выше, боюсь я ничего не пойму.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB