2013-05-03 2 views
0

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

это основной класс (наряду с некоторыми основными функциями) вызывается из разных мест, в том числе через завиток

Теперь давайте мою activaton функцию (Одна из основных функций) в классе

activationFunction($data) 
{ 
//use data to generate total, discount etc 

$this->giveAffiliates($total); 
if($this->_error){ return $this->_error;} 

$this->activateOrder($total,$discount,id); 
if($this->_error){ return $this->_error;} 

$this->activatePlan($total,$discount,id); 
if($this->_error){ return $this->_error;} 

//similarily calling various functions which themselves call other functions 

} 

activatePlan() 
{ 

try{ 

//call other functions and do necessary stuff for plan A 

} 
catch(Exception $e) 
{ 

$this->_error.="Error occurred while activating plan A"; 

} 
//for plan B 
try{ 

//call other functions and do necessary stuff for plan B 

} 
catch(Exception $e) 
{ 

$this->_error.="Error occurred while activating plan B"; 

} 

//for other plans similarily 

} 
} 

Теперь вопрос, имеющий if($this->_error){ return $this->_error;} после каждого вызова подфункций. (Total Im имеет около 35 таких похожих строк) Мне это нужно, поскольку мне нужно отправить сообщение об ошибке пользователю и остановить мой код от дальнейшего использования. Но это делает мой код длинным и неэффективным. Как я могу уменьшить все эти возвращения, но показать пользователю ошибку, когда одна из вспомогательных функций не работает, и попытаться сохранить структуру кода как есть. Я должен вызывать различные подфункции из каждой основной функции (это я не могу изменить, в ней будет только один класс и различные функции), и ошибки в основном должны быть пойманы на каждом уровне и возвращены (очень мало простых ошибок не возвращается, и код разрешен для продолжения работы). Должен также иметь в виду, что позже могут быть добавлены различные другие функции, и он должен быть достаточно гибким, чтобы обрабатывать все это позже.

+0

Я не думаю, что эффективность выполнения кода действительно проблема. Достаточно удобство и удобочитаемость кода. –

+0

Уверенность в обслуживании/читаемость кода, безусловно, проблема, если не главная проблема – user1913849

ответ

2

Вы говорите: «это делает мой код длинным и неэффективным». Что именно вы имеете в виду «неэффективно»? Вы говорите, что ваш код медленный?

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

+0

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

+1

«кажется неправильным с моей стороны», почему ? Как вы думаете, это занимает много времени? Держу пари, что нет. Вам нужно измерить, чтобы знать. Вы делаете много догадок («наверняка сделайте это медленно», «кажется неправильным», «Я уверен, что такой код не будет назван эффективным»), но вам нужно использовать инструмент, чтобы рассказать вам, правильны ли ваши догадки , В противном случае вы теряете время, ускоряя работу, которая на самом деле не медленная. –

+0

Хорошо также проверит его с помощью инструмента также – user1913849

0

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

Так что скажите, что каждая функция выдает исключение из условия ошибки. Затем вы можете сделать что-то вроде этого:

activationFunction($data) 
{ 
    //use data to generate total, discount etc 
    try { 
    $this->giveAffiliates($total); 
    $this->activateOrder($total,$discount,id); 
    $this->activatePlan($total,$discount,id); 
    } catch (Exception $e) { 
    // throw the exception up the call chain 
    throw $e; 
    } 
} 
+0

Но скажем, в функции activPlan: Мой план. Обновление не выдало ошибок, но мой план B дал ошибки, как я могу определить, что Plan B дал ошибку обновления, а не Plan A it может быть нелегко определить, что дало ошибку, особенно если одна и та же таблица обновляется с очень небольшим количеством различий. – user1913849

+0

@ user1913849 Вот и все, в каком сообщении вы хотите поместить исключение.Вы можете быть так же специфичны, как вы хотите, в вызываемой функции, которая бросает исключение относительно того, что вызвало исключение. Вы также можете создавать свои собственные типы исключений, которые наследуются от базового исключения (это действительно хорошая практика). Поэтому скажите, что у вас возникла проблема с подключением к DB, вы можете выбросить DBException), или если у вас возникла проблема с чтением/записью в файловую систему, вы можете выбросить исключение IOException. Вы можете обработать пойманные исключения по-разному на основе их класса, если хотите. –

+0

Я не могу использовать «throw $ e;» поскольку он дает различные ошибки, когда я вызываю этот класс из разных мест и через curl, который делает все вещи и возвращает данные в json формате. Я должен хранить его в переменной и затем возвращать эту переменную. Также как в конкретном сообщении, которое возвращается конкретный код запускается из файла вызывающего абонента после того, как сообщение возвращается – user1913849

Смежные вопросы