Тележка класса отзывы


Я написал класс корзину, это использовать сессии для хранения данных. Код хорошо реализована или может быть лучше? Вы можете переписать мой код, если вы можете.

У каждого элемента есть несколько вариантов с ценой

Каждый вариант может иметь множество дополнительных услуг и без дополнительных услуг

Например:

Пункт 1 -> (ИД Вариант 1)

Пункт 2 -> (параметр с идентификатором 3, вариант id 4)

Идентификатор параметр 4 => (код дополнительно: 1,5,7,8)

<?php
session_start();

class Cart {

 private $cartName;

 public function __construct($cartName)
    {
        $this->cartName = $cartName;
        if (!isset($_SESSION[$this->cartName]))
        {
            $_SESSION[$this->cartName] = array();
        }
 }

   public  function addItem($itemid, $optionid)
     {
        if (array_key_exists($optionid, $_SESSION[$this->cartName]))
         {
            $_SESSION[$this->cartName][$optionid]['quantity']++;
            $_SESSION[$this->cartName]['LastUpdated']  = $optionid;
         }
            else
                {
                    $_SESSION[$this->cartName]['LastUpdated']  = $optionid;
                    $_SESSION[$this->cartName][$optionid] = array();
                    $_SESSION[$this->cartName][$optionid]['quantity'] = 1;
                    $_SESSION[$this->cartName][$optionid]['item_id'] = $itemid;
                    $_SESSION[$this->cartName][$optionid]['extras_id'] = array();
                }
     }

    public function addExtra($optionid,$extraid)
    {
        if (array_key_exists($optionid, $_SESSION[$this->cartName]))
            {
               if (!in_array($extraid, $_SESSION[$this->cartName][$optionid]['extras_id']))
               {
                   $_SESSION[$this->cartName][$optionid]['extras_id'][] = $extraid;
                }
            }
    }

}

$test =  new Cart("shopCart");

$test->addItem(5,2);
$test->addExtra(2,10);
$test->addExtra(2,20);
$test->addExtra(2,30);

$test->addItem(5,4);

echo "<pre>";
print_r($_SESSION);
echo "</pre>";


466
6
задан 11 апреля 2011 в 04:04 Источник Поделиться
Комментарии
2 ответа

Я был программирования PHP, начиная с 1990-х годов, и я более чем счастлив, чтобы помочь другим задуматься о своем коде и расти как программисты. Мне нравится идея этого сайта: я бы убил за это, когда я начал! Это мой первый пост здесь, здесь идет.

array_key_exists() и is_array()

Совершенно необязательно, вы могли бы рассмотреть избегая array_key_exists() в этом случае и, используя более короткий форме теста, как is_array(). Это экономит типизации и должно быть ясно, хотя, возможно, чуть медленнее. Благодаря тому, как работает английский язык, негативное понятие !is_array() , пожалуй, более читаемым, чем !array_key_exists() на каком-то подсознательном уровне... но это казуистики. Как сомнительно полезный бонус, переход на is_array() будет также сделать код самовосстановления в случае, если структура не повреждена и бессмысленный нон-значение массива назначается на должность вы хотите получить доступ, так как код будет потом колошматить не-значение массива в новый массив, как если бы массив ключей не существовало. (Хотя, по идее кодирования этой обороне довольно бесполезно в большинстве случаев и не должны действительно быть огромным фактором.)

Повторение

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

                $_SESSION[$this->cartName][$optionid] = array();
$_SESSION[$this->cartName][$optionid]['quantity'] = 1;
$_SESSION[$this->cartName][$optionid]['item_id'] = $itemid;
$_SESSION[$this->cartName][$optionid]['extras_id'] = array();

Все это может быть легко заменен...

# 1. Create
$cart = array(
'quantity' => 1,
'item_id' => $itemid,
'extras_id' => array()
);

# 2. Assign
$_SESSION[$this->cartName][$optionid] = $cart;

Какой вариант кажется более читабельным для вас? Что бы вы предпочли тип? Читаемость убивает клопов, это хорошая вещь™

Соображения Производительности

Хотя производительности и использования памяти сомнительного интерес для большинства веб-приложений, это хорошо, чтобы быть в курсе, что второе решение фактически создает второй экземпляр $тележку в памяти (один для $телеги, и одна за часть $_SESSION структуры, что в конечном итоге назначен.)

Если представление было действительно проблемой (подсказка: это не так, такие хитрости являются пустой тратой времени программист, который более ценен, чем процессорного времени и памяти почти в каждом случае), то вы могли бы использовать в PHP 'литература' (вроде как 'указателей' на других языках), чтобы сохранить лаконичный синтаксис, но сохранить на память двойного использования. Вообще-то я подзабыл об этой стороне PHP и не проверял этот пример, но предполагаю =& правильная, то мы можем создать решение, больше похоже на это...

# 1. Obtain reference
$cart =& $_SESSION[$this->cartName][$optionid];

# 2. Assign concisely
$cart = array(
'quantity' => 1,
'item_id' => $itemid,
'extras_id' => array()
);

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

Отсутствие документации

Нет замечаний вообще. Код без комментариев-это плохой код, и во многих компаниях вы бы не сошло с рук. Я бы рекомендовал, по крайней мере, добавив следующий минимум:


  • Краткое описание того, что весь блок кода (т. е.: корзина класс). Понятие "предметов" и "параметры" обязательно должны быть изучены.

  • Краткое описание вклада каждой функции (аргументы), переработка и выход (результат)
    В то время как некоторые люди идут за борт писать кучу документации, несколько хорошо размещены и хорошо написанные фрагменты значительно превосходит их вообще нет.

Архитектурный интерес: почему ОО?

Объектно-ориентированной методологии является инструментом для выхода на определенные виды проблем. Однако, это не всегда подходящий инструмент! В этом случае, как вы думаете, что произойдет, если мы оставили его? Конечно, код будет более лаконичным без него.

Я заметил, что другой ответ уже предлагал, в том числе торгового глагол перед тележкой, чтобы придать дополнительную информацию о структуре. Это мне напоминает как на личном опыте, работая с людьми, которые пытаются управлять областью изменения ПО ОО код, и комментарии я читал в Питер Сейбел книгу кодеры за работой , где мы видим некоторое количество опытных программистов обсуждаем ОО с различных точек зрения.

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

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

Комментарии по поводу предыдущих ответов


  • Я бы выступил против, включая путь и имя файла в коде, так как это создает проблему синхронизации при перемещении файлов по файловой системе, и действительно добавляет каких-либо четкое значение. Любой приличный редактор будет давать вам эту информацию при редактировании файла, и любой хороший пересмотра или систем контроля версий (КР/СКВ) также будет расширяться короткие макросы, чтобы относительный путь и имя файла бесплатно.

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

Использование магических чисел

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

$test->addItem(5,2);
$test->addExtra(2,10);
$test->addExtra(2,20);
$test->addExtra(2,30);

$test->addItem(5,4);

24 Часа Вызов


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

4
ответ дан 12 апреля 2011 в 01:04 Источник Поделиться

ОК, медведь со мной здесь, но форматирование воняет.

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

Я отказываюсь даже читать код до форматирования (правильные отступы) был применен. Форматирование является одним из основных аспектов нашей работы, пока (видя, как он не упоминается в качестве цели необходимый комментарий) что-то ты не замечаешь, не можете быть обеспокоены, чтобы исправить копировать+вставить аномалии, или в противном случае рассуждения между этих вопросах, что блокирует любые действия с вашей стороны, чтобы исправить это.

Я, однако, не будет судить строго, так давайте представим, что вам нужна консультация по этому, прежде чем даже думать о переезде на. Это не только надо отформатировать код в удобном для чтения моды, согласованность форматирования, как ожидается, тоже, по сути, в этой роли, последовательность в высшей степени возможно, имеет первостепенное значение как то, что должно быть сделано и как это сделано. Какой отступ дает нам четкое представление о масштабах кодекса в настоящее время мы, глядя На - и без него, или когда он неправильный, такое может быть трудоемким, чтобы определить, вводящую в заблуждение, или раздражает (или любое их сочетание!)

Именно поэтому (где фигурные скобки доступны для этой цели) я думаю, что это дружелюбный подход к начала и окончания выполнения объемов по выделенным линиям; смысл, ничего (кроме нужное количество отступов пробелами) или после скобки. И это не просто вмятины, как: расстояние, соглашениям по именованию, структуре и т. д., Все требуют внимания.

На записке именования: это корзина? Это тележка? О, это корзина...? Доказательство от противного абсурдум в сторону, я хотел бы предложить вам название этого типа (и соответствующего ему файла) явно как ShoppingCart сам для того чтобы сделать ясно, что на самом деле. Файл размер поменьше проблемой в эти дни, то есть даже веб-код говорит сам за себя в большинстве случаев - если размер имеет значение, то я уверен, что вы могли бы найти инструмент для PHP, что minifies' ваш источник релиза, все еще позволяя вам (и другим) для работы на самоочевидный код.

РНР поддерживает составные типы , и, по своей природе и характеру задач, вы начинаете использовать его, но не продлить ее дальнейшего использования (даже, если по другому никак, код-читаемость как было сказано выше.) Например, экземпляр shoppingcartitem мог выставить поля, которые в настоящее время хранятся в стандартный набор (который является подверженным ошибкам способ сделать так же, где техническое обслуживание и расширяемость беспокоит), относящихся к фактический элемент. В ShoppingCartItemExtra класс может делать то же самое для своих свойств. Я дам тебе еще пожевать.

Я просто предполагаю, что вы были в слишком торопилась, чтобы добавить конечную PHP тега (?>).

Я оставлю его там, с размахом-отформатированная версия кода. :)

class Cart
{
public function __construct($cartName)
{
if (!isset($_SESSION[$this->cartName]))
{
}
}

public function addItem($itemid, $optionid)
{
if (array_key_exists($optionid, $_SESSION[$this->cartName]))
{
}
else
{
}
}

public function addExtra($optionid, $extraid)
{
if (array_key_exists($optionid, $_SESSION[$this->cartName]))
{
if (!in_array($extraid, $_SESSION[$this->cartName][$optionid]['extras_id']))
{
}
}
}
}

4
ответ дан 11 апреля 2011 в 07:04 Источник Поделиться