Задать вопрос

Зачем так сделано, что дальше можно сделать с кодом?

Добрый день.
Обратились ко мне с предложением внести некоторые правки на сайте, который разработан на yii2.
Пока требовалось настроить urlManager(), но будут и ещё куча правок.
Сайт по продаже/найму автомобилей.
Заглянув в один из контроллеров я немного "завис". Контроллер из 1 500 строк, большинство действий в нём получают информацию из базы об автомобилях, но с разными параметрами.
Вот пример такого действия, выбор из базы автомобилей в заданном регионе.
actionSearchByRegion
public function actionSearchByRegion($region = null)
    {
        if (\Yii::$app->request->isGet) {

            $region = \Yii::$app->request->get('region-name');
            $region = str_replace('-', ' ', $region);
//            $region = substr($region, 0, 5);
            $region = Regions::find()
                ->select('region_id')
                ->where(['like', 'region_name', $region])
                ->asArray()
                ->one();

            if (!empty($region)) {
                $cars = Cars::find()
                    ->where(['=', 'car_region', $region['region_id']])
                    ->andWhere(['=', 'car_sold', 0])
                    ->orderBy(['id' => SORT_DESC])
                    ->asArray();

                $query = $cars;
                $countQuery = clone $query;
                $pages = new Pagination([
                    'totalCount' => $countQuery->count(),
                    'defaultPageSize' => 12,
                ]);
                $models = $query->offset($pages->offset)->limit($pages->limit)->all();

                return $this->render('search', [
                    'cars_res' => $models,
                    'pages' => $pages,
                ]);
            }

        }
    }


Следующим действием идёт actionSearchByCity, в котором получают автомобили с заданным городом. Так же есть actionSearchByRegionCityMark и actionSearchByRegionCityMarkModel, в которых необходимо получить автомобили данной модели и марки привязанных к заданному региону и городу соответственно.
Поисковой модели как таковой нет, есть, опять же, отдельное действие для поиска.
Связей между моделями нет, внешних ключей нет. При этом в debug панели показывает свыше 150 запросов к базе данных. Многие запросы при этом дублируются.

В представлениях, которые подключает данный контроллер есть, на мой взгляд, совсем "прекрасный" код.
<?= $form->field($searchcar, 'city')->label('Okres')->dropDownList(
//                            ArrayHelper::map(\backend\models\City::find()->where(['region_id' => $searchcar->state])->asArray()->all(), 'city_id', 'city_name'),
                                ArrayHelper::map(\backend\models\City::find()->where(['region_id' => $_GET['SearchCar']['state'] ? $_GET['SearchCar']['state'] : $_GET['region']])->asArray()->all(), 'city_id', 'city_name'),
                                [
                                    'prompt' => 'Vyberte okres',
                                    ///'value' => $_GET['SearchCar']['city'] ? $_GET['SearchCar']['city'] : $_GET['city']
                                ]
                            ) ?>


Вот код контроллера полностью. Посмотрите, пожалуйста, опытным глазом и выскажите своё мнение.

Опыта у меня не очень много, поэтому хотелось бы узнать мнение более опытных людей, что с этим кодом делать?
Оставить как есть и вносить мелкие правки или всё таки предложить переписать?
Чего именно хотел добиться предыдущий разработчик таким кодом(отсутствием связей, внешних ключей и т.д.)?
Что мне сказать заказчику по поводу правок?
  • Вопрос задан
  • 121 просмотр
Подписаться 2 Простой 2 комментария
Решения вопроса 3
iiifx
@iiifx
PHP, OOP, SOLID, Yii2, Composer, PHPStorm
Я не защищаю этот код и мне он совсем не нравится, но есть вымышленный идеальный мир и есть реальный. В реальном мире подобное происходит очень часто.

Опыта у меня не очень много, поэтому хотелось бы узнать мнение более опытных людей, что с этим кодом делать?

Ничего не делать. Вы можете попытаться объяснить клиенту суть проблемы, но скорее всего он откажется переделывать проект. Вы уверены, что вы со своим "не очень много опыта" сможете быстро и качественно переписать? Зачем клиенту нужно платить второй раз, если он не увидит никаких изменений со стороны UI?

Оставить как есть и вносить мелкие правки или всё таки предложить переписать?

Сделать свою работу и сообщить клиенту о проблемах, которые в будущем станут еще больше.

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

Он реализовал задачу используя свой опыт и возможности, и получил за нее деньги. Он не пытался сделать мир лучше.
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Посмотрите, пожалуйста, опытным глазом и выскажите своё мнение.

Это пи..ец

Что мне сказать заказчику по поводу правок?

Сказать что все плохо, поэтому будет дольше и дороже, предложить рефакторинг.

Чего именно хотел добиться предыдущий разработчик таким кодом?

Ничего. Просто человек вообще не знаком с framework, а заказчик видимо просил на yii.
Ответ написан
qonand
@qonand
Software Engineer
Чего именно хотел добиться предыдущий разработчик таким кодом(отсутствием связей, внешних ключей и т.д.)?

Ничего, он просто хотел сделать и сдать свою работу. Да это полнейший говнокод, но как сказал Виталий Хоменко код скорее всего вышел таким из за опыта и возможностей разработчика. Мы все делаем проекты на основе своего опыта и навыков - то что сейчас кажется сделанным идеально, через год нам же покажется говнокодом. И тут уж ничего не поделаешь

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

Таких проектов полным полном и нужно уметь с ними работать. Взять и переписать все с нуля для таких проектов не вариант, т.к.:
1. Как бы код не был написан, в данный момент он выполняет свою задачу - приносит деньги клиенту
2. Переписывание кода всегда несет за собой кучу рисков - нет гарантии что переписанный проект по коду будет лучше чем существующий (объективно, даже опытные программисты не могут это гарантировать, а если у Вас мало опыта тем более ни о каких гарантиях речи идти не может), нет гарантий что Вы учтете все тонкости предметной области (известные предыдущему разработчику)
3. Переписывание кода всегда всегда занимает много времени, мало просто написать новый код, нужно еще протестировать что бы после этого ничего не сломалось в системе, а это порой очень проблематично

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

Что мне сказать заказчику по поводу правок?

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

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

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