Эволюция кода

Один из самых приятных в программировании (лично для меня) моментов — это когда тяжелый и запутанный код становится прозрачным. В одном из текущих проектов я отказался от паттерна Active Record в пользу паттерна Data Mapper.

Вот как выглядел один из методов контроллера:

public function actionIncludedUnits($id)
{
    $unitsTable        = \app\models\Unit::tableName();
    $unitsBundlesTable = \app\models\UnitsBundle::tableName();
    $unitsGroupsTable  = \app\models\unitsGroups\UnitsGroup::tableName();
    $tangiblesTable    = \app\models\tangibles\Tangible::tableName();

    $query = "SELECT u.id unitId,
                     ug.id unitsGroupId,
                     ug.division_slug slug,
                     ug.group_num l, 
                     u.group_num r, 
                     t.name tangibleName
                FROM {$unitsBundlesTable} ub
           LEFT JOIN {$unitsTable} u ON u.bundle_of_units_id = ub.id
           LEFT JOIN {$unitsGroupsTable} ug ON u.units_group_id = ug.id
           LEFT JOIN {$tangiblesTable} t ON u.tangible_id = t.id
               WHERE ub.complex_unit_id = :id";

    $raw = Yii::$app->db->createCommand($query)
        ->bindValue(':id', $id)
        ->queryAll();

    $res = [];

    foreach ($raw as $item) {
        $res[$item['unitId']] = [
            'unitsGroupNumber' => sprintf('%02d/%02d', $item['l'], $item['r']),
            'tangibleName' => $item['tangibleName'],
            'unitUrl' => \yii\helpers\Url::to([
                'units/view', 
                'slug' => $item['slug'], 
                'group' => $item['unitsGroupId'], 
                'id' => $item['unitId']
            ]),
        ];
    }

    return (\yii\helpers\Json::encode($res));
}

Вот как он выглядит сейчас:

public function actionIncludedUnits($id)
{
    $units = (new mappers\UnitMapper)->search([
        'Unit' => [
            'complexUnitId' => $id,
        ],
    ]);

    $res = [];

    foreach ($units->getModels() as $unit)
        $res[$unit->id] = [
            'unitsGroupNumber' => $unit->spoNumberOutput(),
            'tangibleName'     => $unit->tangible->name,
            'categoryName'     => $unit->tangible->category->name,
            'unitUrl'          => \yii\helpers\Url::to([
                'units/view', 
                'slug'  => $unit->unitsGroup->divisionSlug, 
                'group' => $unit->unitsGroup->id, 
                'id'    => $unit->id,
            ]),
        ];

    return \yii\helpers\Json::encode($res);
}

Здесь, конечно, вся работа лежит под капотом, и все же понять, что происходит теперь гораздо проще, а сам код стал элегантнее.

Слово дня: ноотропы

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

Слово дня: бонитет

Бонитет — количественный показатель, отражающий реальное или потенциальное качество природных объектов (животных, растений, почв), определяющий их экономическую ценность. Бонитировка (процесс оценки природного объекта и установления его бонитета). Бонитет леса. Бонитет почв. Бонитет сельскохозяйственных животных.

Задача про лишние пары

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

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