面向对象之极限思维法

简书 賈小強
转载请注明原创出处,谢谢!

在我的上篇文章中对面向对象进行了分析,这篇文章将采用高中解题中用的极限思维法来比较面向过程和面向对象,从而让人直观的知道看到什么样的代码就知道那样的代码用面向对象的方法更加合适,可以降低复杂度

一般而言面向对象的程序需要先经过面向对象分析,然后将系统分成不同的类,各自负责一些责任,并且类之间存在交互,但是这并不是万能的,很多时候由于开始没有考虑到,直到当代码写到那里的时候才发现还需要什么,从而代码逐渐就恶化,复杂性陡增,进入了代码的穷凶极恶之地

这篇文章继续从代码的角度来分析,优点是和重构一样,知道了坏味道,那么就可以想办法改进,也就说开始不用十全十美,中途发现坏味道的时候还能挽救

坏味道

首先假设一份原始代码如下,采用极限思维的方法,把下面变量想象的更多,参数传递更加复杂,各种交错,一团乱麻

public class Demo1 {
    private void method0() {
        //part1
        int a = 1;
        int b = 2;
        int c = 3;
        int d = 4;
        int e = 5;
        int f = 6;
        int g = 7;
        int h = 8;
        int i = 9;
        int j = 10;
        int k = 11;
        int l = 12;

        //part2
        //一些别的代码
        a++;
        c++;
        //一些别的代码
        h++;
        //part3
        int x = method2(g, h, i, j, k, l);
        //一些别的代码执行导致a b c变动,变动后的a b c后面代码还将使用
        for (int m = 0; m < 10; m++) {
            a++;
            b--;
            --c;
        }

        System.out.println(a + b + c + d + e + f + x);
    }

    private int method2(int g, int h, int i, int j, int k, int l) {
        return g + h + i + j + k + l;
    }


    public static void main(String[] args) {
        Demo1 demo = new Demo1();
        demo.method1();
    }
}

输出

71

这份代码有如下问题:

  1. part1部分:有很多变量的声明赋值
  2. part2部分:由于代码实际逻辑原因,上面的变量操作被间隔开了,虽然从某种角度上,这些变量还有有关系的
  3. part3部分:这样的代码很可能随带的有过长参数,当然也可能与多返回值,以及引用传递等问题

改进

将上面变量以及相关操作提取一个类,也就演变成如下两个类

public class Demo2 {
    private void method0() {
        //part1
        Xx xx = new Xx();

        //part2
        //一些别的代码
        xx.method1();
        xx.method2();
        //一些别的代码
        xx.method3();
        //part3
        //一些别的代码执行导致a b c变动,变动后的a b c后面代码还将使用
        xx.method4();
        xx.method5();
        System.out.println(xx.method6());
    }


    public static void main(String[] args) {
        Demo2 demo = new Demo2();
        demo.method1();
    }
}
public class Xx {
    private int a;
    private int b;
    private int c;
    private int d;
    private int e;
    private int f;
    private int g;
    private int h;
    private int i;
    private int j;
    private int k;
    private int l;

    public Xx() {
        this.a = 1;
        this.b = 2;
        this.c = 3;
        this.d = 4;
        this.e = 5;
        this.f = 6;
        this.g = 7;
        this.h = 8;
        this.i = 9;
        this.j = 10;
        this.k = 11;
        this.l = 12;
    }

    public void method1() {
        a++;
    }

    public void method2() {
        c++;
    }

    public void method3() {
        h++;
    }

    public void method4() {
        for (int m = 0; m < 10; m++) {
            a++;
            b--;
            --c;
        }
    }

    public int method5() {
        return g + h + i + j + k + l;
    }

    public int method6() {
        int x = method5();
        return a + b + c + d + e + f + x;
    }
}

输出

71

改进后part1,part2,part3在Demo2中不再有上面提到的问题,在Demo2中的代码中只看到了xx这个对象,于是method0这部分的逻辑清爽多了

扩展

据说面向对象这种编程方法在GUI程序中非常适合,细想一下确实没错,每个不同的控件都有各自的属性,并且也各自有不同的方法,有的控件可以继承从而复用代码,要是采用面向过程的方法,可能各种状态变量传来传去,很快就将是场灾难,而采用面向对象的方式组织代码相较就科学很多

但是抛开这种直观可视化具体和现实世界有对应关系的对象,真实的代码中还有很多没有形状不可见抽象的的概念的对象,如果在程序设计之初没有考虑到,可以用上面提取类的方法来用面向对象的方式,来识别并简化代码,让代码的复杂性在可控范围之内

Happy learning !!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355