Задать вопрос
@SergeTkach
OpenCart Forever

Насколько в действительности возрастает нагрузка, если писать код, разбивая все на отдельные действия?

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

=== Вариант 1 ===
Все действия отделены друг от друга
Легко читать
Легко делать отладку, так как всегда можно просто взять и вывести $price на экран
Но для выполнения скрипта (особенно, если таких мест много), требуется больше памяти

foreach ($this->cart->getProducts() as $product) {
              $price = get_product_price_without_sale($product['product_id']); // Значение получено заранее. Оно хранится в памяти и занимает лишнее место
              $data_deal['products'][] = array(
                    'name'     => htmlspecialchars($product['name']),
                    'count' => $product['quantity'],
                    'price'    => $this->currency->format($price, $order_info['currency_code'], $order_info['currency_value'], false)
                );
            }


=== Вариант 2 ===
Труднее читать
Для отладки нужно более внимательно копировать конструкцию, которая покажет, что там у нас получается
Память не занимается промежуточными переменными

foreach ($this->cart->getProducts() as $product) {
              $data_deal['products'][] = array(
                    'name'     => htmlspecialchars($product['name']),
                    'count' => $product['quantity'],

                    'price'    => $this->currency->format(get_product_price_without_sale($product['product_id']), $order_info['currency_code'], $order_info['currency_value'], false)
                );
            }
  • Вопрос задан
  • 417 просмотров
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Программирование
software engineer
Когда вы что-то пишете, нагрузку следует считать не только на железо, но и на разработчике.
В подавляющем большинстве случаев, разработка и поддержка - это те задачи, которые мастшабируются гораздо сложнее, чем железо.
В подавляющем большинстве случаев, железо даже не обязательно масштабировать - его просто хватает.

Поэтому в подавляющем большинстве случаев, читабельность кода - важнее, чем производительность.
А там где производительность будет важна - всегда можно будет сделать перфоманс анализ, выявить ботлнек и сделать рефакторинг - причем при читабельном коде это будет сделать гораздо проще.
Ответ написан
Falseclock
@Falseclock
решаю нестандартные задачи
Вы мыслите в правильном русле.... но все еще далеко от совершенства.

каждое действие должно делаться в одном методе (функции для PHP)

Ваш код должен повторять логику алогритма или блок схемы, и там где присутствуют переменные, все выносить в переменные класса по возможности..

<?php
// хендлер реализаций
class WaybillHandler
{
	protected $debug	= true;

	protected $db		= null;
	protected $socket	= array();
	protected $structure= array();
	protected $doc		= null;
	protected $crmData	= array();
	
	public function __construct($waybill)
	{
		$this->db = DBPool::me()->getLink();
		$this->doc = $waybill;
		
		self::Handler();
	}
	
	private function Handler()
	{
		$db = $this->db;
		
		// Если реализация не привязана к счету, то ничего не делаем
		if ($this->doc['ДокументОснование']['#type'] != 'jcfg:DocumentRef.СчетНаОплатуПокупателю') {
			return;
		}
		
		$this->structure = Utils1c::prepareStructure($this->doc,'waybill');
		
		// Усли реализация поставлена на удаление, то автоматически будет отменена проводка
		// либо мы вручную убрали проводку, а значит мы должны удалить запись из CRM
		if ($this->doc['Posted'] == false) {
			$this->structure['debug'][] = "Реализация не проведена, делаем попытку удаление данных"." (".__LINE__.")";
			self::deleteWaybillFromCRM();
		} else {
			if (self::isRelatedToOurInvoice()) {
				self::findDataFromCRMforWaybill();
				if (count($this->crmData)) {
					self::deleteWaybillDataOnDeleteInERP();
					self::insertMissingWaybillDataToERP();
					self::compareWaybillDataBetweenCRMandERP();
				} else {
					self::insertWaybillDataOnNewRowInERP();
				}
				self::updateStructureFinally();
			} else {
				$this->structure['debug'][] = "Мы не нашли связь между этой реализацией и счетами в CRM"." (".__LINE__.")";
			}
		}
		if (!$this->debug) {
			$this->structure['debug'] = array();
		}
		$this->socket[] = Driver1c::SOCKET_MARKER.json_encode($this->structure, JSON_UNESCAPED_UNICODE);
		
		new WebSocketClient($this->socket);
		
		return;
	}
}
Ответ написан
Ваш ответ на вопрос

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

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