zoukankan      html  css  js  c++  java
  • 代码如何优化

    有时候在写代码的时候只关注功能的实现,代码的质量很差,这里用一个修改某个表中数值的例子来说明,如何实现代码逐步优化的过程:

    实例1:

    第一种实现方式:

    if($enableQuantity >= $transactionQuantity){
                    //更新锁定库存的数量
                    $inventory_locked_data = array(
                        "locked_quantity" => $inventoryItem['locked_quantity'] + $transactionQuantity,
                        "locked_real_quantity" => $inventoryItem['locked_real_quantity'] + $transactionQuantity * $inventoryItem['unit_quantity']
                    );
                    
                    //记录库存锁定交易过程
                    $inventory_locked_transaction_data = array(
                        "inventory_item_id" => $inventoryItem['inventory_item_id'],
                        "quantity" => $transactionQuantity,
                        "real_quantity" => $transactionQuantity * $inventoryItem['unit_quantity'],
                        "created_user" => $params['created_user']
                    );
                    $transactionQuantity = 0; 
                }else{
                    //更新锁定库存的数量
                    $inventory_locked_data = array(
                        "locked_quantity" => $inventoryItem['locked_quantity'] + $enableQuantity,
                        "locked_real_quantity" => $inventoryItem['locked_real_quantity'] + $enableQuantity * $inventoryItem['unit_quantity']
                    );
                    
                    //记录库存锁定交易过程
                    $inventory_locked_transaction_data = array(
                        "inventory_item_id" => $inventoryItem['inventory_item_id'],
                        "quantity" => $enableQuantity,
                        "real_quantity" => $enableQuantity * $inventoryItem['unit_quantity'],
                        "created_user" => $params['created_user']
                    );
                    $transactionQuantity -= $enableQuantity;
                }

    第二种实现方式:

    $inventory_locked_transaction_data_list = array();
    $inventory_item_ids = explode("," , ModelPalletModel::getInventoryItemIdsByPalletIds($params['pallet_id']));
    $transactionQuantity = $params['quantity'];
    foreach($inventory_item_ids as $inventory_item_id){
        $inventoryItem = ModelInventoryItemModel::getInventoryItemById($inventory_item_id);
        
        $enableQuantity = $inventoryItem['quantity'] - $inventoryItem['locked_quantity'];
        
        if($enableQuantity <= 0){
            continue;
        }
        
        if ($transactionQuantity == 0) {
            break;
        }
        //原先使用了if条件进行判断的,导致了下面代码的冗余
        $locked_quantity = $enableQuantity >= $transactionQuantity ? $inventoryItem['locked_quantity'] + $transactionQuantity : $inventoryItem['locked_quantity'] + $enableQuantity;
        $transaction_locked_quantity = $enableQuantity >= $transactionQuantity ? $transactionQuantity : $enableQuantity;
        
        //更新锁定库存的数量
        $inventory_locked_data = array(
            "locked_quantity" => $locked_quantity,
            "locked_real_quantity" => $locked_quantity * $inventoryItem['unit_quantity']
        );
        
        //记录库存锁定交易过程
        $inventory_locked_transaction_data = array(
            "inventory_item_id" => $inventoryItem['inventory_item_id'],
            "quantity" => $transaction_locked_quantity,
            "real_quantity" => $transaction_locked_quantity * $inventoryItem['unit_quantity'],
            "created_user" => $params['created_user']
        );
        
        $transactionQuantity -= $transaction_locked_quantity;
        
        ModelInventoryItemModel::updateInventoryItem($inventoryItem['inventory_item_id'] , $inventory_locked_data);
        ModelInventoryItemModel::createInventoryLockedTransaction($inventory_locked_transaction_data);
        array_push($inventory_locked_transaction_data_list , $inventory_locked_transaction_data);
    }

    第三种实现方式:

    $inventory_locked_transaction_data_list = array();
            $inventory_item_ids = explode("," , ModelPalletModel::getInventoryItemIdsByPalletIds($params['pallet_id']));
            $transactionQuantity = $params['quantity'];
            foreach($inventory_item_ids as $inventory_item_id){
                $inventoryItem = ModelInventoryItemModel::getInventoryItemById($inventory_item_id);
                
                $enableQuantity = $inventoryItem['quantity'] - $inventoryItem['locked_quantity'];
                
                if($enableQuantity <= 0){
                    continue;
                }
                
                if ($transactionQuantity == 0) {
                    break;
                }
                //优化后的代码
                $locked_quantity = min($enableQuantity , $transactionQuantity);
                
                //更新锁定库存的数量
                $inventory_locked_data = array(
                    "locked_quantity" => $locked_quantity + $inventoryItem['locked_quantity'],
                    "locked_real_quantity" => ($locked_quantity + $inventoryItem['locked_quantity']) * $inventoryItem['unit_quantity']
                );
                
                //记录库存锁定交易过程
                $inventory_locked_transaction_data = array(
                    "inventory_item_id" => $inventoryItem['inventory_item_id'],
                    "quantity" => $locked_quantity,
                    "real_quantity" => $locked_quantity * $inventoryItem['unit_quantity'],
                    "created_user" => $params['created_user']
                );
                
                $transactionQuantity -= $locked_quantity;
                
                ModelInventoryItemModel::updateInventoryItem($inventoryItem['inventory_item_id'] , $inventory_locked_data);
                ModelInventoryItemModel::createInventoryLockedTransaction($inventory_locked_transaction_data);
                array_push($inventory_locked_transaction_data_list , $inventory_locked_transaction_data);
            }
            
            if($transactionQuantity > 0){
                Flight::throwException($transactionQuantity , 40002);
            }

    第四种实现方式:

            try {
                
                $inventory_locked_transaction_data_list = array();
                $inventory_item_ids = explode("," , ModelPalletModel::getInventoryItemIdsByPalletIds($params['pallet_id']));
                $transactionQuantity = $params['quantity'];
                foreach($inventory_item_ids as $inventory_item_id){
                    if ($transactionQuantity == 0) {
                        break;
                    }
                    
                    $inventoryItem = ModelInventoryItemModel::getInventoryItemById($inventory_item_id);
                    
                    $enableQuantity = bcsub($inventoryItem['quantity'] , $inventoryItem['locked_quantity'], 6);
                    
                    if($enableQuantity <= 0){
                        continue;
                    }
                    
                    $locked_quantity = min($enableQuantity, $transactionQuantity);
                    
                    //更新锁定库存的数量
                    $inventory_locked_data = array(
                        "locked_quantity" => bcadd($locked_quantity, $inventoryItem['locked_quantity'], 6),
                        "locked_real_quantity" => bcmul(bcadd($locked_quantity, $inventoryItem['locked_quantity'], 6), $inventoryItem['unit_quantity'], 6)
                    );
                    
                    //记录库存锁定交易过程
                    $inventory_locked_transaction_data = array(
                        "inventory_item_id" => $inventoryItem['inventory_item_id'],
                        "quantity" => $locked_quantity,
                        "real_quantity" => bcmul($locked_quantity, $inventoryItem['unit_quantity'], 6),
                        "created_user" => $params['created_user']
                    );
                    //使用高精度计算
                    $transactionQuantity = bcsub($transactionQuantity,$locked_quantity,6);
                    
                    ModelInventoryItemModel::updateInventoryItem($inventoryItem['inventory_item_id'] , $inventory_locked_data);
                    ModelInventoryItemModel::createInventoryLockedTransaction($inventory_locked_transaction_data);
                    array_push($inventory_locked_transaction_data_list , $inventory_locked_transaction_data);
                }
                
                if($transactionQuantity > 0){
                    throw new Exception("inventory quantity not sufficient");
                }
                
                Flight::db()->commit();
                Flight::sendRouteResult(array('inventory_item_list' => $inventory_locked_transaction_data_list));
            } catch (Exception $e) {
                Flight::db()->rollback();
                Flignt::sendRouteResult('error_info'=>$e->getMessage(), 'error_code'=>$e->getCode());
            }

    这四种代码实现方式主要优化过程在于避免代码冗余,代码处理顺序,数值计算使用高精度等;

    实例2:下面是实现一个字符串插入数据库,要求每个字符串唯一;

    优化前:

                    $res = true;
                    for($i = 1; $res; $i++){
                        $inventory_batch_sn = 'F-'.date("YmdHis").'-P-'.$i;
                        if(!empty(InventoryItemModel::getInventoryItemByInventoryBatchSn($inventory_batch_sn))){
                            $res = true;
                        }else{
                            $res = false;
                        }
                    }
                    $inventory_item_data['inventory_batch_sn'] = $inventory_batch_sn;
    优化后1:
     
     $inventory_batch_sn = $params['facility_id'] . '-' . date("YmdHis") . '-' . $params['product_id'] . '-';
     $count = InventoryItemModel::getCountInventoryItemByInventoryBatchSn($inventory_batch_sn);
     $inventory_item_data['inventory_batch_sn'] = $inventory_batch_sn . ($count+1);
    减少了代码量;
     
     
    优化后2,:
     
                    $inventory_batch_sn = $params['facility_id'] . '-' . date("YmdHis") . '-' . $params['product_id'] . '-';
                    $inventoryItem = InventoryItemModel::getInventoryItemByInventoryBatchSn($inventory_batch_sn . "1");
                    if(empty($inventoryItem)){
                        $inventory_item_data['inventory_batch_sn'] = $inventory_batch_sn . "1";
                    } else {
                        $count = InventoryItemModel::getCountInventoryItemByInventoryBatchSn($inventory_batch_sn);
                        $inventory_item_data['inventory_batch_sn'] = $inventory_batch_sn . ($count+1);
                    }
     
        public static function getCountInventoryItemByInventoryBatchSn($inventory_batch_sn) {
            $sql = "select count(distinct inventory_batch_sn) from ws_inventory_item where inventory_batch_sn like '{$inventory_batch_sn}%' limit 1 ";
            return Flight::db()->getOne($sql);
        }
    这种方式保证了查询性能;
     
     
  • 相关阅读:
    centos 7常用需求
    python处理mysql的一些用法
    python下的queue
    2017-1-17不错的模块和工具
    wordpress钩子和钩子函数
    python中字典的使用
    linux下查看系统信息
    apk安全测试思路
    rhel 5.8 and 6.4 yum配置
    分布式文件系统
  • 原文地址:https://www.cnblogs.com/sdgf/p/5282146.html
Copyright © 2011-2022 走看看