1、使用引用是不是使我们的代码更加的简洁,除此之外相对于第一种写法,我们节省了内存空间,尤其是再操作一个大数组时效果是及其明显的。
2、使用匿名函数
Class One
{
private $instance;
// 类 One 内部依赖了类 Two
// 不符合设计模式的最少知道原则
public function __construct()
{
$this->instace = new Two();
}
public function doSomething()
{
if (...) {
// 如果某种情况调用类 Two 的实例方法
$this->instance->do(...);
}
....
}
}
...
$instance = new One();
$instance->doSomething();
上面代码写法的问题:
不符合设计模式的最少知道原则,类 One 内部直接依赖了类 Two;
类 Two 的实例不是所有的上下文都会用到,所以浪费了资源。用单例,也无法解决实例化了不用的尴尬。
使用匿名函数进行改写:
Class One
{
private $closure;
public functionn __construct(Closure $closure)
{
$this->closure = $closure;
}
public function doSomething()
{
if (...) {
// 用的时候再实例化,实现懒加载
$instance = $this->closure();
$instance->do(...);
}
}
}
...
$instance = new One(function() {
return new Two();
});
$instance->doSomething();
...
3、减少对 if...else..的使用。可先使用 if 来处理简单异常,提前 return,再执行正常逻辑
Function doSomething() {
if (...) {
if (...) {
...
} else {
...
}
} else {
if (...) {
...
} else {
...
}
}
}
细心的你会发现,上面绝大多数 else 代码里都是在处理异常情况,更可能这个异常代码特别简单,那么就可以先去处理异常,提前 return,再执行正常的逻辑。
function doSomething() {
if (...) {
// 异常情况
return ...;
}
if (...) {
// 异常情况
return ...;
}
// 正常逻辑
....
}
Class One
{
public function doSomething() {
if (...) {
throw new Exception(...);
}
if (...) {
throw new Exception(...);
}
// 正常逻辑
...
}
}
4、关联数组做 map
做决策,通常会判断不同的上下文,再选择不同策略,通常会像下面一样使用 if 或者 switch 判断:
Class One
{
public function doSomething()
{
if (...) {
$instance = new A();
} elseif (...) {
$instance = new A();
} else{
$instance = new C();
}
$instance->doSomething(...);
...
}
}
Class One {
private $map = [
'a' => 'namespace\A',
'b' => 'namespace\B',
'c' => 'namespace\C'
];
public functin doSomething()
{
....
$instance = new $this->map[$strategy];
$instance->doSomething(...);
}
}
```
5、使用接口
为什么要使用接口?便于后期的扩展和代码的可读性,例如:设计一个优惠系统,不同的商品知识再不同的优惠策略下具备不同的优惠行为,我们定义一个优惠行为的接口,最后对这个接口编程即可,伪代码如下:
```
Interface Promotion
{
public function promote(...);
}
Class OnePromotion implement Promotion
{
public function doSomething(...) {
...
}
}
Class TwoPromotion implement Promotion
{
public function doSomething(...)
{
...
}
}
```
6、控制器不要有直接的 DB 操作
程序绝大多数的操作基本都是增删改查,可能是查询的 where 条件和字段不同。所以可以抽象的把对数据库增删改查的方法写到 model 中,通过参数暴露我们的 where,fields 条件。
> 文章摘录来源:http://tigerb.cn/2017/06/01/artisan/