Структура проекта кажется мне избыточной

mus

Новичок
Структура проекта кажется мне избыточной

Предположим я собираюсь сделать проект со следующими пунктами меню

* Покупка
- добавление
- просмотр (тут будет удаление и редактирование)
- статситика
* Продажа
- добавление
- просмотр
- статистика
* Товары
- добавление
- просмотр
- статистика
* Города
- добавление
- просмотр
* Заказчики
- добавление
- просмотр
- статистика
*

Я специально выписал каждый пункт меню. Просто меня тревожит вопрос. Как быть со всей этой иерахией? Она же все время повторяется!
Проблема состоит в том, что на мой взгляд нужно избавлять от этой избыточности в программном коде и каким-то образом избежать повторений.
А именно, демонстрирую пару веток одного тестового проекта, который я недоделал, поэтому на синтаксис можно не обращать внимания, заострая его на семантике приложения
PHP:
if(!empty($_GET['mode'])) {
                      //Выводим категории
                      $category = $news->getCategory();
                      $right = "./news/".$_GET['mode'].".tpl";
                      $smarty->assign("right",$right);
                      for($i=0;$i<count($category);$i++) {
                              $obj = new makeLink("category_id",$category[$i]->category_id);
                              $category[$i]->url = $obj->purl;
                      }
                      switch($_GET['mode']) {
                              case "add":
                                    $operation = "добавление";
                                    break;
                              case "edit":
                                    $operation = "редактирование";
                                    break;
                              case "delete":
                                    $operation = "удаление";
                                    break;
                      }
                      $smarty->assign("operation",$operation);
                      $smarty->assign("category",$category);
                      // По категориям
                      if(!empty($_GET['category_id'])) {

                              switch($_GET['mode']) {
                              case "add":
                                    // Блок для добавления
                                    $newsError = $error->getErrors("news");
                                    if(!empty($_POST['submit'])) {
                                            $news->setMessage($_POST['title'], $_POST['description'], $_POST['message'], time(), $_POST['category_id'], 1, $_FILES['image']);
                                            $smarty->assign("newsError",$newsError);
                                    }
                                    break;
                              case "edit":
                                    $newsError = $error->getErrors("news");
                                    // Блок для редактирования
                                    if(empty($_GET['message_id'])) {
                                            (empty($_GET['MessagePage'])) ? $MessagePage = 0 : $MessagePage = intval($_GET['MessagePage']);
                                            $message = $news->getNews($_GET['category_id']);
                                            for($i=0;$i<count($message);$i++) {
                                                $obj = new makeLink("message_id",$message[$i]->message_id);
                                                $message[$i]->url = $obj->purl;
                                            }
                                            $page    = Tools_PagesList::frame(
                                                       $numPageOnFrame,
                                                       20,
                                                       count($news->getNews(intval($_GET['category_id']))),
                                                       null,
                                                       false,
                                                       "MessagePage"
                                                       );
                                            $smarty->assign("page",$page);
                                            $smarty->assign("message",$message);
                                    }
                                    else {
                                            $message = $news->getMessage($_GET['message_id']);
                                            $smarty->assign("message",$message);

                                            if(!empty($_POST['submit'])) {
                                                $news->setMessage($_POST['title'], $_POST['description'], $_POST['message'], time(), $_POST['category_id'], 1, $_FILES['image'], $_GET['message_id']);
                                                $smarty->assign("newsError",$newsError);
                                            }
                                    }

                                    break;
                              case "delete":
                              // и т.д.
Поглядите, там одни switch casы, посвященные операциям добавления, редактирования, удаления! Это же сущий кошмар! Можно ли избежать этого, применив идею полиморфизма или ещё как-либо сделать код компактнее??
 

Black Raven

Новичок
Re: Структура проекта кажется мне избыточной

PHP:
                      switch($_GET['mode']) {
                              case "add":
                                    $operation = "добавление";
                                    break;
                              // и т.д.
можно превратить в:
PHP:
$operations = array('add' => 'добавления');
$smarty->assign("operation",$operations[$_GET['mode']]);
-----------------
PHP:
                      if(!empty($_GET['category_id'])) {
                              switch($_GET['mode']) {
                              case "add":
                              // и т.д.
можно превратить в:
PHP:
if(!empty($_GET['category_id'])) { include($actions_dir.'/'.$_GET['mode'].'.inc'); }
---------
код станет полегче...

ну или так:
PHP:
if(!empty($_GET['mode'])) { 
                      //Выводим категории 
                      $category = $news->getCategory(); 
                      $right = "./news/".$_GET['mode'].".tpl"; 
                      $smarty->assign("right",$right); 
                      for($i=0;$i<count($category);$i++) { 
                              $obj = new makeLink("category_id",$category[$i]->category_id); 
                              $category[$i]->url = $obj->purl; 
                      } 

                      if(!empty($_GET['category_id'])) {
                                            // делаем то что нужно в действии + проставляем $operation
                                            include($actions_dir.'/'.$_GET['mode'].'.inc');                      }

                      $smarty->assign("operation",$operation); 
                      $smarty->assign("category",$category);
 

mus

Новичок
Black Raven
Разделять на файлы - вообще, по-моему, утопия. Слишком сильно разобью проект.
Krishna
Я не просил разбираться в коде и искать ошибки - просто взглянуть...
 

mus

Новичок
Смотрел. Несовсем устраивает. Нигде не прослеживается четкая грамотная структурированная разметка кода. По сравнению с прикладными языками программирования php очень немодулен.
 

die_hard

Новичок
2mus - что есть модульность?
И вообще
1 - PHP - ООП (более или менее в пятерку, в 4-ке можно пользоваться если не сильно придираться)
2 - Если ты не видишь модульность или она тебя не устраивает в том коде, который ты используешь, еще не значит что её (хорошей модульности) там нету

-~{}~ 18.06.06 17:14:

и вообще полезно бы было на самом деле разбить файл. Бояться большого количества файлов (без ущерба производительности) - это неправильно.
 

mus

Новичок
Если ты не видишь модульность или она тебя не устраивает в том коде, который ты используешь, еще не значит что её (хорошей модульности) там нету
Я сам тот код писал, что выше, и никак не могу смириться с тем, что он какой-то неправильный, что ли, как классы писать - это понятно, они и в африке классы, а вот как писать грамотные контроллеры - очень сложный для меня вопрос. Может кто поделиться примером или указать на какой-нибудь более или менее идеальный пример?
 
Проблема состоит в том, что на мой взгляд нужно избавлять от этой избыточности в программном коде и каким-то образом избежать повторений.
mus, начни с рефакторинга того, что у тебя уже есть:
1) разбей поток инструкций (ветки if, switch, циклы) на отдельные функции;
2) разбей получившиеся функции на методы получения данных, методы обработки данных и методы вывода данных;
3) если ты сделаешь функции достаточно мелкими, то обнаружишь, что можешь большинство из них сгруппировать по смыслу;
4) в зависимости от качества выполненного 1), 2), 3) большинство функций в группе можно упростить, вынеся "за скобки" общую функциональность в отдельные функции;
5) можно упростить результат 4-го шага, создав класс и объеденив используемые функциями переменные в переменные класса.

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

TheBattle

Новичок
Алексей Пешков
Весьма любопытно, но без примера сложно что-то подогнать под этот алгоритм. Это из литературы взято или из личного опыта?
 

mus

Новичок
Нет, я с Алексеем полностью согласен, он достаточно четко выразил свои мысли. Постараюсь сделать то, что он посоветовал. Рефакторинг действительно сильная вещь, это как проверка собственных мыслей, изложенных на черновике =)
Спасибо!
 
Сверху