代码之道 – change or not change

1. 前言

谈论代码之道或许有些言过其实,我更倾向于将其视为一种沟通与分享的机会,以便咱们能够共同学习并获得进步,今天我主要从变与不变的角度来和咱们分享一下我写代码的一些心得

2. 从规划形式说起

规划形式咱们可谓是久闻大名,那究竟规划形式处理了什么样的问题呢?

  • 拿一个装修器形式看看
// 展现接口
public interface Showable { 
    public void show();
}
public class Girl implements Showable { 
    @Override
    public void show() { 
        System.out.print("女生的脸"); 
    }
}
public class Decorator implements Showable{ 
    //被装修的展现者
    Showable showable;
    public Decorator(Showable showable) {
        //结构时注入被装修者 
        this.showable = showable; 
    } 
    @Override 
    public void show() {
        System.out.print("磨皮");
        //化妆品点缀开端 
        showable.show();
        //被装修者的原生展现办法 
        System.out.print("美颜");
        //点缀完毕 
    }
}
public class Client { 
    public static void main(String[] args) { 
        //用装修器包裹女孩后再展现 
        new Decorator(new Girl()).show(); 
        //运转成果:点缀【女生的脸】 
   } 
}

能够看到装修器形式的实质其实便是在不改变本来的代码上,为办法加上新的功用。

可是为什么需求这样呢?你或许会说我在本来的代码上添加两行代码不好吗?

public class Girl implements Showable {
    @Override
    public void show() { 
        System.out.print("磨皮");
        System.out.print("女生的脸"); 
        System.out.print("美颜");
    }
}

可是这样这个办法就被限定在磨皮美颜 上面了,如果这个女孩在星期一想 磨皮美颜,在星期二想祛痘遮瑕 那就又需求新写一个Girl类了。

也便是最实质是要清楚 女生的脸 一般情况下是 不变的磨皮美颜这些东西是变化的,所以中心是笼统出变化和不变的东西。

咱们常常使用的 AOP 其实也能够看作是一种装修器,只不过由 AOP 实现的愈加强大,能够通过注解的方法批量为办法增强功用。

  • 再看看规划形式中的工厂吧
public abstract class Entity {
    //敌人的坐标
    protected int x;
    protected int y;
    //初始化坐标
    public Enemy(int x,int y)  {
        this.x = x;
        this.y = Y;
    }
    //笼统办法,在地图上制作
    public abstract void show();
}
// 飞机类
public class Air extends Entity {
    public Air(int x,int y){
        super(x,y);//调用父类结构办法初始化坐标
    }
    @Override
    public void show(){
        System.out.println("制作飞机于上层图层,呈现坐标:"  x   ","   y);
        System.out.println("飞机出来了");
    }
}
// 车辆
public class Car extends Entity {
    public Tank(int x,int y){
        super(x,y);//调用父类结构办法初始化坐标
    }
    @Override
    public void show(){
        System.out.println("制作汽车于基层图层,呈现坐标:" x   ","   y);
        System.out.println("汽车向玩家出来了");
    }
}

其实也是相同的道理,工厂其实便是抽离了对象不变的实质 实体都有 x y 坐标,而且都会在地图上制作

所以规划形式其实没有帮你处理任何问题,它是对一类相似问题的笼统的总结,当你看到相同的问题时,你天然就知道选用那种规划形式来让你的代码变得愈加简单。

  • 再来看一个更简单的例子
public class MultiplicationTable {
    public static void main(String[] args) { 
        System.out.println("1*1=1"); 
        System.out.println("1*2=2t2*2=4"); 
        System.out.println("1*3=3t2*3=6t3*3=9");
        // ... 省掉
    }
}
public class MultiplicationTable {
    public static void main(String[] args) { 
        for (int i = 1; i <= 9; i  ) { 
            for (int j = 1; j <= i; j  ) { 
                System.out.print(j   "*"   i   "="   (i * j)   "t"); 
            } 
        }
    } 
}

程序界常流传的一个笑话便是,老师让学生写代码输出99乘法表,成果学生直接用手写的办法输出了出来。

这其实便是初学者无法对问题进行更实质的笼统,找到事物中变与不变的部分,所以才造成了这种啼笑皆非的情况。

点评一个代码的好坏,其间的一个方面我想便是有没有对事物或者问题有更实质的思考,提炼出了事物和问题之间不变的共性

3. 那么写代码更中心问题究竟是什么

我觉得写好代码有时就和解数学题相同, 都是需求笼统出事物的变和不变的部分,可是最中心的问题其实仍是没有对事物笼统的能力,找到一个事物和问题之间的共性其实是很难的。

你或许需求各方面常识都需求有涉猎,就像如果不知道方程,或许就只能使用穷举的方法来处理鸡兔同笼的问题了。

我想许多时分咱们写代码时都忽略了需求仔细思考问题本身的共性,而不是直接去处理问题。用蛮力来处理问题许多时分或许只能是得不偿失。

提取出问题和事物的共性,寻求一个问题的最优解,避免重复的体力劳动,或许会让日常的工作变得愈加轻松。