在这里统一说Web开发,可能有失颇偏,毕竟我后端一直都是用PHP实现的,没用过.net也没用过java,但我想大致都是同样都,我就此阐述一下我所认为的“程序=数据结构+算法”。php
相对于前端程序来讲,前端用户的操做为输入,而后通过逻辑处理后,把数据输出到后端;前端
相对于后端程序来讲,从数据库取数据算作输入,而后通过处理后,输出到前端展现;java
相对于数据库来讲,对于数据的操做指令为输入,操做后产生的输出结果为输出(如删除成功返回值,写入成功后返回值等)算法
后端输出到前端展现逻辑数据库
基于输入输出的思想:输入(数据)+处理(算法)+输出(数据);segmentfault
数据由数据结构组成;后端
根据具体业务需求,肯定输出的数据结构;数据结构
若是肯定的输出数据结构过于复杂,拆分为单个简单数据结构实现;post
肯定单个简单数据结构的输入源;.net
肯定输入源的数据结构;
用算法逻辑把输入源转化为输出数据;
把单个简单数据结构组装为最终的复杂输出数据结构;
前端遍历输出的内容,拆解数据作显示。
前端输入到后端的处理逻辑
肯定后端须要存储的数据结构;
把复杂的输入数据结构拆分为简单数据结构;
根据简单数据结构,遍历用户输入内容取得输入数据组装;
组装简单的输入数据结构传递到后端;
后端拆解前端输入的复杂数据结构为简单数据结构;
遍历单个复杂数据结构并存储,且返回每一个步骤的存储结果,出错作数据回滚;
把存储结果返回。
其余思考
具体业务逻辑可能相对更复杂,通常get方式取数据对应的是后端的输出逻辑思想,数据存储对应的是前端输入思想。
这套的想法主要目的是把复杂程序尽可能作简化,并以数据和算法的思想去思考程序自己。
另一方面以数据拆解的思想尽可能把复杂逻辑变简单。
存储示例
<?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程序基础设计及目录规划