Улучшить код ООП


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

fileA.php:

include_once dirname(__FILE__) . "/like.class.php";
$like = new Like($db);

if (isset($_POST['add'])):
    $like->addLikes();
elseif (isset($_POST['delete'])):
    $like->unLikes();
else:
    $like->loadLikes();
endif;

like.class.php

  public function loadLikes() {
             $sql = //sql query

                try
                {
                    $imageid = $_POST['imageid'];
                    $imageid = htmlentities($imageid, ENT_QUOTES);

                    $author = $_POST['author'];
                    $author = htmlentities($author, ENT_QUOTES);


                    $query = $this->_db->prepare($sql);
                    $params = array(':imageid' => $imageid, ':author' => $author);
                    $query->execute($params); 

                    $count = $this->countLikes($imageid);

                    if ($query->rowCount() > 0) {

                        while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
                        if ($row['like'] == '1') {
                            $like = (array('like' => true));
                            $response = json_encode(array_merge($count, $like));
                            echo $response;
                            return TRUE;

                        }
                        elseif ($row['like'] == '2')  {
                            $like = (array('unlike' => true));
                            $response = json_encode(array_merge($count, $like));
                            echo $response;
                            return TRUE; 

                        }
                        else {
                            $error = "Invalid";
                            $response = json_encode(array('like' => false, 'text' => $error));
                            echo $response;
                            return FALSE;
                        }
                      }

                    }
                    else {

                        $like = (array('unlike' => true));
                        $response = json_encode(array_merge($count, $like));
                        echo $response;
                        return FALSE; 
                    }

                }
                catch(PDOException $ex)
                {
                    echo json_encode(array('like' => false, 'text' => $ex));
                    return FALSE;
                }

        }



    public function addLikes() {
             $sql = //sql query

                try
                {
                    $imageid = $_POST['imageid'];
                    $imageid = htmlentities($imageid, ENT_QUOTES);

                    $author = $_POST['author'];
                    $author = htmlentities($author, ENT_QUOTES);


                    $query = $this->_db->prepare($sql);
                    $params = array(':imageid' => $imageid, ':author' => $author);
                    $query->execute($params); 

                    if ($query->rowCount() > 0) {

                        //update like
                        $this->updLikes();      
                    }
                    else {

                        //insert like
                        $this->insertLikes();
                    }

                }
                catch(PDOException $ex)
                {
                    echo json_encode(array('like' => false, 'text' => $ex));
                    return FALSE;
                }

        }

Я написал только два метода, поскольку другие методы в классе все следуют тому же шаблону. Есть в любом случае я могу более эффективно код уменьшения дублирования? Любые другие указатели будут оценены.



551
3
задан 27 мая 2011 в 07:05 Источник Поделиться
Комментарии
1 ответ

Некоторые предложения:


  1. Держите попробовать-блоки мелкие

  2. Всегда проверяйте, если ваш запрос-параметры являются действительными

  3. Если у вас дублируется код, кладете его в частную функцию

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

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

  6. Нет необходимости создавать переменные только в Echo/вернуть их

  7. ложное должно быть написано в нижнем регистре, так как почти все это делают ;)

  8. Старайтесь держать выход-очки (возврата) функция как можно меньше

  9. Не сделали ниже, но в целом направлены на разделение доступа к базе данных, логика приложения (этого класса) и выхода (на улице)

  10. Все исполнение-трактов функция должна возвращать тот же тип данных (как Java/с/... заставляет вас делать)

Например, создать (частные) функции очистки параметров:

private private function getCleanParameters()
{
return array(
':imageid' = htmlentities($_POST['imageid'], ENT_QUOTES),
':author' => htmlentities($htmlentities($author, ENT_QUOTES), ENT_QUOTES)
);
}

Перед привязкой их к SQL-запроса, вы должны проверить их:

private function checkParameters(array $parameters)
{
foreach($parameters as $value)
{
if(empty($value))
{
return false;
}
}
return true;
}

Что бы сделать ваш addLikes способ получить что-то вроде этого:

public function addLikes()
{
$params = $this->getCleanParameters();

if(!$this->checkParameters($params))
{
return false;
}

try
{
// Assuming you're perfroming an 'exists'-check here.
// Could be done at the database-side
$query = $this->_db->prepare($this->_checkSqlQuery)
->execute($params);
($query->rowCount() > 0)
? $this->updLikes()
: $this->insertLikes();
}
catch(PDOException $ex)
{
// Why echo here and not in try?
// Relying on the 'fact' that the called methods will echo something?
// Also, the try-block does not return anything, but the catch-block does.
echo json_encode(array('like' => false, 'text' => $ex));
return false;
}

}

Для loadLikes() метод практически те же правила будут применяться:

public function loadLikes()
{
$params = $this->getCleanParameters();
$reponse = array(
// What's the point of having like & unlike at the same time?
// If you're using unlike as error, better introduce a dedicated field for it
// better always send all fields as json.
'like' => false,
'unlike' => false,
'error' => false
'text' => '',
'count' => 0
);

if(!$this->checkParameters($params))
{
$response['error'] = true;
$response['text'] = 'Invalid Parameters';
echo json_encode($response);
return false;
}

// all your if-statements,... only modifying $response

echo json_encode($reponse);
return $response['error'];
}

5
ответ дан 29 мая 2011 в 01:05 Источник Поделиться