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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik »

Добрый день.
Обратились ко мне с предложением внести некоторые правки на сайте, который разработан на yii2.
Пока требовалось настроить urlManager(), но будут и ещё куча правок.
Сайт по продаже/найму автомобилей.
Заглянув в один из контроллеров я немного "завис". Контроллер из 1 500 строк, большинство действий в нём получают информацию из базы об автомобилях, но с разными параметрами.
Вот пример такого действия, выбор из базы автомобилей в заданном регионе.

Код: Выделить всё

    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,
                ]);
            }

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

Код: Выделить всё

<?= $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']
                                ]
                            ) ?>
Вот код контроллера полностью. Посмотрите, пожалуйса, опытным глазом и выскажите своё мнение.

Опыта у меня не очень много, поэтому хотелось бы узнать мнение более опытных людей, что с этим кодом делать?
Оставить как есть и вносить мелкие правки или всё таки предложить переписать?
Чего именно хотел добиться предыдущий разработчик таким кодом(отсутствием связей, внешних ключей и т.д.)?
Что мне сказать заказчику по поводу правок?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

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

Сообщение andku83 »

Сидит программист глубоко в отладке.
Подходит сынишка:
— Папа, почему солнышко каждый день встает на востоке, а садится на западе?
— Ты это проверял?
— Проверял.
— Хорошо проверял?
— Хорошо.
— Работает?
— Работает.
— Каждый день работает?
— Да, каждый день.
— Тогда ради бога, сынок, ничего не трогай, ничего не меняй!!!
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

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

Сообщение andku83 »

внесите правки и закройте.

если вам нечем заняться и у заказчика есть лишние деньги - предложите, только сначала хорошо подумайте готовы ли переписывать ВСЕ (в глубине появится еще больше), иногда проще написать заново.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik »

andku83 писал(а): 2018.03.15, 20:09 внесите правки и закройте.

если вам нечем заняться и у заказчика есть лишние деньги - предложите, только сначала хорошо подумайте готовы ли переписывать ВСЕ (в глубине появится еще больше), иногда проще написать заново.
Пока готовится следующее задание с правками, даже не знаю, как это отобразится на работе. Возможет же вариант, что без переписывания кода новые правки невозможно будет вообще внести?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

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

Сообщение futbolim »

actionSearchCar() божественнен!
А, если серьёзно, то не из худших. Бывает кошмарнее ситуации.
Бывает даже, что "тяп-ляп" выкладывают в общее пользование. Например, https://github.com/CostaRico/yii2-image ... /Image.php
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

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

Сообщение futbolim »

Возможет же вариант, что без переписывания кода новые правки невозможно будет вообще внести?
Невозможно. Плохокодить можно до бесконечности. Пример: федеральная резервная система США.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Отличная лапшичка. На самом деле не так всё ужасно, ставим phpstorm, берём в руки refactor → extract, тратим 2-3 часа и получается относительно сносно. Для правок уже сойдёт.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik »

samdark писал(а): 2018.03.15, 21:57 Отличная лапшичка. На самом деле не так всё ужасно, ставим phpstorm, берём в руки refactor → extract, тратим 2-3 часа и получается относительно сносно. Для правок уже сойдёт.
А что это даст? Никогда не пользовался refactor->extract
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

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

Сообщение samdark »

Код разъедется в удобоваримые куски.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

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

Сообщение maleks »

slo_nik писал(а): 2018.03.15, 19:22 Чего именно хотел добиться предыдущий разработчик таким кодом(отсутствием связей, внешних ключей и т.д.)?
Скорее всего он не сильно их понял (всякие hasMany->via->with), вот и не использует. Как и dataProvider с searchModel.
Это вполне обычный код под yii, с него и стартуйте, в нем же и плюсы есть - бесхитростный и простой, даже ТЗ не надо.
Yii2 universal module sceleton - for basic and advanced templates
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

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

Сообщение mkramer »

По говнокоду я слышал от одного крутого лектора правило трёх раз: первый раз правим говнокод - плюёмся, но не трогаем. Если второй раз лезем в тот же код для правки, плюёмся, берём на карандаш. Если третий раз лезем в тот же код - делаем рефакторинг.

В принципе, я и сам не сразу пишу код идеальный, иногда, если проект не большой и не предполагает расти, то можно оставить возню с ActiveRecord прямо в контроллерах, никуда не выносить, так быстрее выдаёшь продукт. Но потом, если всё это начинает перерабатываться, то начинаешь уже свой код в порядок приводить.
slo_nik
Сообщения: 344
Зарегистрирован: 2013.10.07, 19:08

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

Сообщение slo_nik »

Благодарю всех ответивших.
Ваши ответы помогли принять решение.
Ответить