程序员方法论系列:“类”有啥用?

老铁们,上一篇,我们了解了什么是“类”(点击查看前文)今儿个咱们唠唠这个“类”啊,这玩意儿到底有啥用?

“类”是咱们编程世界里的大拿,跟现实世界那叫一个紧密相连。

咱得好好掰扯掰扯,这“类”到底是咋回事,咋就能把现实世界给抽象化了呢?

首先,咱得明白,这个“类”啊,它就像是现实世界的一个影子,咱们用编程语言给它画出来。比如说,咱们看到的猫啊狗啊,那都是现实世界里的东西,咱们用“类”来给它们建模,这不就是抽象映射嘛!咱们是辩证唯物主义的好学生,得明白,这“类”不是凭空来的,它是现实世界的产物,但同时呢,它也能反作用于现实世界,这得好好琢磨琢磨。

“类”对应的英文是“class”。咱们中文里,给“类”组个词,最直接想到的就是“分类”。说到分类,咱们小时候生物课上学的那个生物分类。生物分界、门、纲、目、科、属、种,这一套下来,那叫一个细致。这分类方式,就像是个树状图,跟数据结构里的树形结构似的,每一种生物,最后都得落到“种”这个级别上。

老铁们可能要问了,这分类跟面向对象的“class”有啥关系啊?

哎,关系大了去了!咱们定义一个“class”的时候,都得有属性,这些属性啊,根据它们的取值范围或者不同,就能对实例化对象进行分类。比如说,咱们定义一个“Number”类,那这个类的实例化结果,最后肯定得落在实数轴或者虚数轴上,要是实数,还能分成正数、负数或者零,对吧?

再举个例子,咱们有个“Creature”类,里面有个属性“hasSpinalColumn”,这个属性是true还是false,那就能把生物分成有脊椎动物门和无脊椎动物门。类似的,还有很多属性,比如有没有毛发、有没有鳞片、有没有四肢、有没有眼睛,是单眼还是复眼。咱们通过这些属性,用单一属性或者属性组合来分类,这不就能对现实世界的任何一个实例化对象进行分类了嘛!

Java Code

// 举个简单的Java代码示例

class Creature {

    boolean hasSpinalColumn;

    boolean hasHair;

    boolean hasScales;

    boolean hasLimbs;

    boolean hasEyes;

    String eyeType; // 单眼还是复眼

    // 构造函数

    public Creature(boolean hasSpinalColumn, boolean hasHair, boolean hasScales, boolean hasLimbs, boolean hasEyes, String eyeType) {

        this.hasSpinalColumn = hasSpinalColumn;

        this.hasHair = hasHair;

        this.hasScales = hasScales;

        this.hasLimbs = hasLimbs;

        this.hasEyes = hasEyes;

        this.eyeType = eyeType;

    }

    // 分类方法

    public String classify() {

        if (hasSpinalColumn) {

            return "有脊椎动物门";

        } else {

            return "无脊椎动物门";

        }

    }

}

// 使用示例

public class Main {

    public static void main(String[] args) {

        Creature cat = new Creature(true, true, false, true, true, "单眼");

        System.out.println("猫属于:" + cat.classify());

    }

}

老铁们,脑子里还有问号?这玩意儿有啥用啊?

那我给你们举个工作中的例子。有个同事,她得做个弹药的分类,这分类得在一个页面里做成下拉框。弹药咋分类,甲方没说,她也不懂。我就给她讲了分类法,最后分类结果是:弹药来源分类、物理性质分类、使用用途分类等等。这分类方式,得根据实际情况来,得有个兜底的“其他”。

比如说,弹药来源分类。

可以是生产中弹药、运输中弹药、备用弹药、上膛弹药、缴获弹药、捡的,还有其他。

物理性质分类呢,可以是固体弹药、液体弹药、气体弹药、包装弹药、散装弹药之类的。

使用用途分类,可以是枪弹、炮弹、火箭弹、导弹、炸药、散装药、伪装药(地雷)、未分类其他药(可能是缴获的用途不明的)。

说到这儿,基本上这功能该有的分类方式就有了。弹药得按多种方式分类,比如谁用的,空军、陆军、海军,然后是单兵、班级别、排级别,再按火力范围、包装产品、型号或者口径继续分。这分类方式,也是个树状图,一层层分下去。

Java Code

// 弹药类

class Ammunition {

    String source; // 弹药来源

    String physicalProperty; // 物理性质

    String usage; // 使用用途

    // 构造函数

    public Ammunition(String source, String physicalProperty, String usage) {

        this.source = source;

        this.physicalProperty = physicalProperty;

        this.usage = usage;

    }

    // 根据来源分类

    public String classifyBySource() {

        switch (source) {

            case "生产":

                return "生产中弹药";

            case "运输":

                return "运输中弹药";

            case "备用":

                return "备用弹药";

            case "上膛":

                return "上膛弹药";

            case "缴获":

                return "缴获弹药";

            case "捡的":

                return "捡的弹药";

            default:

                return "其他";

        }

    }

    // 根据物理性质分类

    public String classifyByPhysicalProperty() {

        switch (physicalProperty) {

            case "固体":

                return "固体弹药";

            case "液体":

                return "液体弹药";

            case "气体":

                return "气体弹药";

            case "包装":

                return "包装弹药";

            case "散装":

                return "散装弹药";

            default:

                return "其他";

        }

    }

    // 根据使用用途分类

    public String classifyByUsage() {

        switch (usage) {

            case "枪弹":

                return "枪弹";

            case "炮弹":

                return "炮弹";

            case "火箭弹":

                return "火箭弹";

            case "导弹":

                return "导弹";

            case "炸药":

                return "炸药";

            case "散装药":

                return "散装药";

            case "伪装药":

                return "伪装药(地雷)";

            default:

                return "未分类其他药";

        }

    }

}

// 使用示例

public class Main {

    public static void main(String[] args) {

        Ammunition ammo1 = new Ammunition("生产", "固体", "枪弹");

        System.out.println("弹药1来源分类:" + ammo1.classifyBySource());

        System.out.println("弹药1物理性质分类:" + ammo1.classifyByPhysicalProperty());

        System.out.println("弹药1使用用途分类:" + ammo1.classifyByUsage());

        Ammunition ammo2 = new Ammunition("缴获", "液体", "导弹");

        System.out.println("弹药2来源分类:" + ammo2.classifyBySource());

        System.out.println("弹药2物理性质分类:" + ammo2.classifyByPhysicalProperty());

        System.out.println("弹药2使用用途分类:" + ammo2.classifyByUsage());

    }

}

说到这里,我简单的阐述一下我当年所讲的分类法的结论。

分类法,使用面向对象的方式对事物进行建模,以单个或多个属性为分类标准,对这个事物(class)进行分类。分类的结果必定要分类完全,或者有兜底分类,如果分类过程中,以某个标准分类,结果落在了两个类中,而不是唯一的,说明分类标准选取错误。即使分类标准错误,也可能有意义。

好了,篇幅有限,就唠到这儿。要是觉得还不够,建议找毛选第一册第一章,看看教员咋分类人的,仔细琢磨琢磨,能不能用这方式去建模,决定满足啥属性或者属性搭配,才能确定这人是伙伴、敌人,还是有统战价值。

感觉当年读了教员这内容的人,没看懂的居多。下一篇咱们就着分类法,讲讲咋做职业规划吧,方法论嘛,少讲技术细节,多讲技术应用,抛砖引玉才重要,引起思考才重要。

老铁们!咱们编程啊,就得这么来,把现实世界的逻辑搬到代码里,这样才能做出有用的东西来。

好了,今儿个就唠到这儿,咱们下篇再见!

你可能感兴趣的:(程序员方法论,java,程序人生,改行学it)