读码及代码优化封装技巧
读码
阅读代码其实就跟我们阅读文章一样,你首先要了解词义、语法,最好还知道这段文字的语境,这样你才能完整理解作者想表达的意图。同样的,读代码,你需要了解该编程语言的关键字、数据结构、语法以及代码块中变量的含义和环境(上下文)。相信写过代码的人都知道,相对于写码,阅读别人的代码(自己上周写的代码已成为自己眼中别人的代码)是一件痛苦的事情,日常读码中,一般是有以下两种场景:
- 学习上,比如在全球最大的同性交友网站github上阅读开源项目,讲道理这种场景下,我们一般选择的都是知名的开源项目,这类项目一般都有严格的代码审查流程并遵守业内的统一标准,符合我们的口味。可以看下hyperf 项目,hyperf的绝大部分组件都是基于PSR规范进行开发的,组件之间没有直接关联。比如其内置的容器组件,依据开发实践标准实现的,我们吃起来才合胃口。
- 工作上,基于业务开发的需要阅读相应的代码,目前我们团队使用 php-cs-fixer 在上git之前统一格式和 phpmd 代码质量检测工具,基本统一了代码风格,读起来还是相对友好,但毕竟是业务代码,因此除理解代码与注释外,还可以多走亿步来沟通清楚。
代码优化封装
当代码逻辑中有多个可单独拆分的功能时,就应该将其分离出来,倘若放任不管则后面难以维护,后期业务逻辑又有改动时,自己回头来看可能都很费工夫,长此以往,整个模块的复杂度显著提升,一个小小的改动可能就触动整个功能的稳定性,因此优化代码封装是必要的。
写码建议:
- 一个类文件不要超过1000行代码,超过1000行时很明显就要考虑拆分了,这样可以减少类的加载时间、内存频繁占用和回收,利于维护,对读码也友好
- 一个类只负责一项职责,遵守一个函数只做一件事的原则,这样做可以明显降低复杂度及提高可读性
- 函数的编写要尽量简洁,有复杂的条件嵌套判断时考虑逻辑分层,拆分为多个函数或进行抽象分离;优先考虑简单的条件,不符合就直接return出场或抛出异常。
- 遵循对应编程语言的编码标准,利于读码及维护
- 动手敲码前多些思考,如何进行逻辑拆解或抽象,上来就干只能是一时爽,前期的快速开发后面也将花费更多的时间精力来弥补
- 多读好的开源代码,从别人的实践中获取经验再反哺自己,有利于开阔写码的思路
- 设计模式作为最佳实践应该要好好掌握,在合适的场景使用合适的设计模式会让你的代码更加健壮
来个例子:
商城的售后目前有仅退款、退货退款、换货、整单取消这四个类型,下面我们来看看如何更好的实现生成售后单的功能。
1.采用拆解函数的方式,每种售后方式为一个函数
<?php declare(strict_types=1);
namespace Order;
class AfterSaleOrder {
const SALES_TYPE = [
'only_refund' => 1, //仅退款
'return_goods_and_refund' => 2, //退货退款
'exchange_goods' => 3, //换货
'order_cancel' => 4, //整单取消
];
private static $refundData;
/**
* 初始化数据
* @param array $refundData
* @return $this|null
*/
public function setAfterData (array $refundData) {
self::$refundData = $refundData;
if (self::checkRefundData()) {
return $this;
}
return null;
//todo
}
/**
* 验证退款参数
* @return bool
*/
private static function checkRefundData () :bool{
if (!isset(self::$refundData['sales_type']) || !in_array(self::$refundData['sales_type'], self::SALES_TYPE)) {
return false;
}
//todo
return true;
}
public static function execute() :bool{
$res = self::create();
if ($res) {
var_dump("successful.");
return true;
//todo
}
//todo
return false;
}
/**
* 仅退款
* @return bool
*/
private static function onlyRefund() :bool{
print_r(self::$refundData);
var_dump("only_refund successful.");
//todo
return true;
}
/**
* 退货退款
* @return bool
*/
private static function returnGoodsAndRefund() :bool{
print_r(self::$refundData);
var_dump("return_goods_and_refund successful.");
//todo
return true;
}
/**
* 换货
* @return bool
*/
private static function exchangeGoods() :bool{
print_r(self::$refundData);
var_dump("exchange_goods successful.");
//todo
return true;
}
/**
* 整单取消
* @return bool
*/
private static function orderCancel() :bool{
print_r(self::$refundData);
var_dump("order_cancel successful.");
//todo
return true;
}
/**
* 处理退款
* @return bool
*/
private static function create() :bool{
if (self::SALES_TYPE['only_refund'] == self::$refundData['sales_type']) {
return self::onlyRefund();
}
if (self::SALES_TYPE['return_goods_and_refund'] == self::$refundData['sales_type']) {
return self::returnGoodsAndRefund();
}
if (self::SALES_TYPE['exchange_goods'] == self::$refundData['sales_type']) {
return self::exchangeGoods();
}
if (self::SALES_TYPE['order_cancel'] == self::$refundData['sales_type']) {
return self::orderCancel();
}
return false;
}
}
2.用抽象的方式拆解,每种售后方式为一个类,且都继承售后基类用来约束一些必须实现的功能
业务调用类
<?php
namespace Order\Obj;
use Order\Obj\AfterSaleModel\AfterSaleAbstract;
use Order\Obj\AfterSaleModel\ExchangeGoods;
use Order\Obj\AfterSaleModel\OrderCancel;
use Order\Obj\AfterSaleModel\OnlyRefund;
use Order\Obj\AfterSaleModel\ReturnGoodsAndRefund;
class AfterSaleOrder {
const SALES_TYPE = [
'only_refund' => 1, //仅退款
'return_goods_and_refund' => 2, //退货退款
'exchange_goods' => 3, //换货
'order_cancel' => 4, //整单取消
];
//退款参数
private static $refundData;
//退款模型
private static $afterSaleObj;
public function __construct (array $refundData) {
if (self::checkRefundData($refundData)) {
self::$refundData = $refundData;
self::$afterSaleObj = self::getAfterSaleObj();
return $this;
}
return null;
//todo
}
/**
* 验证退款参数
* @param array $refundData
* @return bool
*/
private static function checkRefundData (array $refundData) :bool{
if (!isset($refundData['sales_type']) || !in_array($refundData['sales_type'], self::SALES_TYPE)) {
return false;
}
//todo
return true;
}
public static function execute() :bool{
$res = self::create();
if ($res) {
var_dump("successful.");
return true;
//todo
}
//todo
return false;
}
/**
* 获取退款模型
* @return null|AfterSaleAbstract
*/
private static function getAfterSaleObj() :?AfterSaleAbstract{
if (self::SALES_TYPE['only_refund'] == self::$refundData['sales_type']) {
return new OnlyRefund(self::$refundData);
}
if (self::SALES_TYPE['return_goods_and_refund'] == self::$refundData['sales_type']) {
return new ReturnGoodsAndRefund(self::$refundData);
}
if (self::SALES_TYPE['exchange_goods'] == self::$refundData['sales_type']) {
return new ExchangeGoods(self::$refundData);
}
if (self::SALES_TYPE['order_cancel'] == self::$refundData['sales_type']) {
return new OrderCancel(self::$refundData);
}
return null;
}
/**
* 操作退款
* @return bool
*/
private static function create() :bool{
if (self::$afterSaleObj) {
return self::$afterSaleObj::execute();
}
//todo
return false;
}
}
售后基类:用来约束实体类,必须实现execute函数
<?php
namespace Order\Obj\AfterSaleModel;
abstract class AfterSaleAbstract {
private static $data;
public function __construct (array $data) {
self::$data = $data;
}
abstract static function execute () :bool;
}
实体类:仅退款、退货退款、换货、整单取消
<?php
namespace Order\Obj\AfterSaleModel;
class ReturnGoodsAndRefund extends AfterSaleAbstract {
private static $data;
public function __construct (array $data) {
parent::__construct($data);
}
public static function execute () :bool{
if (self::refund() && self::inStorage()) {
return true;
}
//todo
self::setLogData();
return false;
}
private static function refund() :bool{
var_dump('退款');
return true;
}
private static function inStorage() :bool{
var_dump('入库');
return true;
}
private static function setLogData() {
var_dump(json_encode(['type' => 'refund_goods_and_refund','data' => self::$data]));
}
}
以上只是最简单的业务逻辑,还没有完全拓展开来,实际中还应该继续拆分出入库、支付相关、邮件及日志等,优化代码的好处多多,这会使我们写出维护性更高、质量更好的代码,希望有朝一日我也能领会到写代码的哲学与快乐,加油,干饭人。
怎么收藏这篇文章?
兄弟写的非常好 https://www.cscnn.com/
哈哈哈,写的太好了https://www.cscnn.com/
《侦探:开端》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/34842.html
《天命》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/20129.html
你的文章让我感受到了生活的美好,谢谢! http://www.55baobei.com/8Cwnndt40e.html
你的文章让我感受到了生活的美好,谢谢! http://www.55baobei.com/HeGRfw92Ap.html
你的文章让我感受到了快乐,每天都要来看一看。 https://www.4006400989.com/qyvideo/29212.html
独家揭秘:西游屠魔传奇私服超神功率,横扫千军震撼来袭!:https://501h.com/fugu/2024-08-13/27617.html
独家揭秘:热血传奇客私服,万劫连击掀起惊世风云!:https://501h.com/heji/2024-10-04/39840.html
《第三调解室》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/126880.html
真棒!
你的文章让我感受到了生活的美好,谢谢! http://www.55baobei.com/HeGRfw92Ap.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/KbA24sSe8Q.html
你的文章让我感受到了快乐,每天都要来看一看。 https://www.4006400989.com/qyvideo/12771.html
你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/8U7hMvgDuX.html
你的文章让我学到了很多知识,非常感谢。 https://www.yonboz.com/video/60460.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/KbA24sSe8Q.html
你的文章内容非常卖力,让人点赞。 http://www.55baobei.com/V3fAIYzl0t.html
你的文章让我学到了很多知识,非常感谢。 https://www.yonboz.com/video/60460.html
你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/Qum3VnmXjG.html
你的才华让人瞩目,期待你的更多文章。 http://www.55baobei.com/8U7hMvgDuX.html
看到你的文章,我仿佛感受到了生活中的美好。 https://www.4006400989.com/qyvideo/72052.html
《查理班克斯的教育》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/62946.html
《推手1991》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/76273.html
《辛普森一家第十六季》欧美动漫高清在线免费观看:https://www.jgz518.com/xingkong/98553.html
你的文章让我感受到了正能量,非常棒! http://www.55baobei.com/TSvZSWnz64.html
你的才华横溢,让人敬佩。 https://www.4006400989.com/qyvideo/94447.html
《拒绝帮扶白眼狼后,全村追悔莫及(完整版)》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/160162.html
你的文章让我学到了很多技能,非常实用。 http://www.55baobei.com/OWKgRUJYfT.html
你的文章充满了智慧,让人敬佩。 http://www.55baobei.com/UFJRqRFEG6.html
《查理班克斯的教育》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/62946.html
《推手1991》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/76273.html
《犬夜叉剧场版2镜中的梦境城》动画片高清在线免费观看:https://www.jgz518.com/xingkong/89003.html
你的文章让我心情愉悦,每天都要来看一看。 http://www.55baobei.com/aiGoPkjbX9.html
你的文章让我心情愉悦,每天都要来看一看。 https://www.4006400989.com/qyvideo/97016.html
每次看到你的文章,我都觉得时间过得好快。 http://www.55baobei.com/qgxWgFuS91.html
《圣洛伦佐之夜》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/6930.html
你的文章让我心情愉悦,每天都要来看一看。 http://www.55baobei.com/ffPk2CIlLv.html
你的才华让人惊叹,你是我的榜样。 https://www.4006400989.com/qyvideo/29322.html
《国家宝藏第二季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/18583.html
《混世小刁民》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/26844.html
《香火2003》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/91915.html
你的文章让我心情愉悦,每天都要来看一看。 http://www.55baobei.com/iZeUNYhgAW.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/7T1oGzL1Jj.html
每次看到你的文章,我都觉得时间过得好快。 https://www.yonboz.com/video/66568.html
《查理班克斯的教育》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/62946.html
《推手1991》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/76273.html
《辛普森一家第十六季》欧美动漫高清在线免费观看:https://www.jgz518.com/xingkong/98553.html
555
555
你的文章让我心情愉悦,每天都要来看一看。 http://www.55baobei.com/1UrZBG3S0M.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/7T1oGzL1Jj.html
《混世小刁民》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/26844.html
你的文章让我心情愉悦,每天都要来看一看。 http://www.55baobei.com/IpEF40Bg34.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/mhWQsuigBB.html
《圣洛伦佐之夜》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/6930.html
《国家宝藏第二季》大陆综艺高清在线免费观看:https://www.jgz518.com/xingkong/18583.html
《混世小刁民》短片剧高清在线免费观看:https://www.jgz518.com/xingkong/26844.html
你的文章让我心情愉悦,每天都要来看一看。 https://www.yonboz.com/video/96402.html
你的才华让人惊叹,你是我的榜样。 http://www.55baobei.com/RTvKuKP6Kb.html
《雷克斯海3D:史前世界》记录片高清在线免费观看:https://www.jgz518.com/xingkong/124821.html
《紧急着陆》动作片高清在线免费观看:https://www.jgz518.com/xingkong/145137.html
《目的地:杜斯伯里》喜剧片高清在线免费观看:https://www.jgz518.com/xingkong/152214.html
哈哈哈,写的太好了https://www.lawjida.com/