關於Web開發中“程式=資料結構+演算法”的思考

kumfo發表於2019-02-16

在這裡統一說Web開發,可能有失頗偏,畢竟我後端一直都是用PHP實現的,沒用過.net也沒用過java,但我想大體都是一樣都,我就此闡述一下我所認為的“程式=資料結構+演算法”。

輸入輸出思想

  1. 相對於前端程式來說,前端使用者的操作為輸入,然後經過邏輯處理後,把資料輸出到後端;

  2. 相對於後端程式來說,從資料庫取資料算做輸入,然後經過處理後,輸出到前端展示;

  3. 相對於資料庫來說,對於資料的操作指令為輸入,操作後產生的輸出結果為輸出(如刪除成功返回值,寫入成功後返回值等)

開發過程中的邏輯處理思想

  • 後端輸出到前端展示邏輯

  1. 基於輸入輸出的思想:輸入(資料)+處理(演算法)+輸出(資料);

  2. 資料由資料結構組成;

  3. 根據具體業務需求,確定輸出的資料結構;

  4. 如果確定的輸出資料結構過於複雜,拆分為單個簡單資料結構實現;

  5. 確定單個簡單資料結構的輸入源;

  6. 確定輸入源的資料結構;

  7. 用演算法邏輯把輸入源轉化為輸出資料;

  8. 把單個簡單資料結構組裝為最終的複雜輸出資料結構;

  9. 前端遍歷輸出的內容,拆解資料做顯示。

  • 前端輸入到後端的處理邏輯

  1. 確定後端需要儲存的資料結構;

  2. 把複雜的輸入資料結構拆分為簡單資料結構;

  3. 根據簡單資料結構,遍歷使用者輸入內容取得輸入資料組裝;

  4. 組裝簡單的輸入資料結構傳遞到後端;

  5. 後端拆解前端輸入的複雜資料結構為簡單資料結構;

  6. 遍歷單個複雜資料結構並儲存,且返回每個步驟的儲存結果,出錯做資料回滾;

  7. 把儲存結果返回。

  • 其他思考

  1. 具體業務邏輯可能相對更復雜,一般get方式取資料對應的是後端的輸出邏輯思想,資料儲存對應的是前端輸入思想。

  2. 這套的想法主要目的是把複雜程式儘量做簡化,並以資料和演算法的思想去思考程式本身。

  3. 另外一方面以資料拆解的思想盡量把複雜邏輯變簡單。

一些虛擬碼示例

  • 儲存示例

<?php
$input = $_post[`input`];

// 拆分 start
$product = $input[`product`];
$product_sku = $input[`product_sku`];
// 拆分 end

// 儲存過程示例 start
$db = Db::beginTransation();
try {
    $product_id = Product::save($product); // 單個儲存
    ProductSku::save($product_sku,$product_id); // 單個儲存
    $db->commit();
} catch(DbException $e) {
    $db->rollBack(); // 出錯回滾
}
// 儲存過程示例 end
  • 輸出示例

<?php
// 確定輸出資料結構 start
$result_data = [
    `member` => [
        `member_id` => 3,
        `member_name` => `使用者名稱`
    ],
    `order_list` => [
        [
            `order_id` => 1,
            `order_sn` => `訂單號`
        ],
        [
            `order_id` => 1,
            `order_sn` => `訂單號`
        ]
    ]
];
// 確定輸出資料結構 end

// 拆分資料結構處理 start
$member = Member::find()
    -> select([`member_id`,`member_name`])
    ->asArray()
    -> one();
 
$order_list = Order::find()
    ->select([`order_id`,`order_sn`])
    ->asArray()
    ->all();
foreach($order_list as &$item) {
    $item[`time`] = time(); // 對資料列表做其他處理
}
// 拆分資料結構處理 end

// 組裝資料並輸出 start
return [
    `member` => $member,
    `order_list` => $order_list
];
// 組裝資料並輸出 end

前端思想同樣如是,我就不做說明了。

這幾天 SF 增加了新的板塊——直播。我也收到了官方的邀請。4 月 7 日(本週五)晚 20:30 和大家一起聊聊專案中的一些總結。講座傳送: Yii2之RESTful程式基礎設計及目錄規劃

相關文章