为什么很多程序员不用switch,而是大量 的if......else if?

这篇具有很好参考价值的文章主要介绍了为什么很多程序员不用switch,而是大量 的if......else if?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不会吧还有人用if else和switch case?三目运算符?

不会吧? 不会吧?大佬都是全都不用的!以JAVA为例

条件判断语句的四种写法,茴字的四种写法大家不会不知道吧

1.正常人写法:

private static String MAN = "man";
private static String WOMAN = "woman";
@Data
static class Person{
    private String gender;
    private String name;
}  
public static void main(String[] args) {
    Person p = new Person();
    p.setGender(MAN);
    p.setName("张三");

    if(Objects.equals(p.getGender(),MAN)){
        System.out.println(p.getName() + "应该去男厕所");
    }

    if(Objects.equals(p.getGender(),WOMAN)){
        System.out.println(p.getName() + "应该去女厕所");
    }

}

//输出 :张三应该去男厕所
2.Lambda策略模式写法:

某些大公司P6级别以上(年薪30w-50w)标准写法,写if else是要被骂的

private static Map<String, Consumer<String>> FUNC_MAP = new ConcurrentHashMap<>();
private static String MAN = "man";
private static String WOMAN = "woman";
static {
    FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});
    FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});
}
@Data
static class Person{
    private String gender;
    private String name;
}
public static void main(String[] args) {
    Person p = new Person();
    p.setGender(MAN);
    p.setName("张三");
    Person p2 = new Person();
    p2.setGender(WOMAN);
    p2.setName("张三他老婆");

    FUNC_MAP.get(p.getGender()).accept(p.name);
    FUNC_MAP.get(p2.getGender()).accept(p2.name);

}

//输出:
//张三应该去男厕所
//张三他老婆应该去女厕所
3.DDD领域驱动设计思想+策略模式写法:

某些大公司P7级别以上(年薪40w-70w)标准写法(笑)

private static String MAN = "man";
private static String WOMAN = "woman";
@Data
static class Person{
    private String gender;
    private String name;

    private static Map<String, Consumer<String>> FUNC_MAP = new ConcurrentHashMap<>();
    static {
        FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});
        FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});
    }
    public void goToWC(){
        FUNC_MAP.get(gender).accept(name);
    }
}

static class PersonFactory{
    public static Person initPerson(String name ,String gender){
        Person p = new Person();
        p.setName(name);
        p.setGender(gender);
        return p;
    }
}
public static void main(String[] args) {
    Person p = PersonFactory.initPerson("张三",MAN);
    Person p2 = PersonFactory.initPerson("张三他老婆",WOMAN);
    p.goToWC();
    p2.goToWC();
}

//输出:
//张三应该去男厕所
//张三他老婆应该去女厕所
某些奇葩公司就是喜欢这种语法,看起来够装逼,实际上效率并没有高多少,可读性差了很多,而且Debug比较麻烦
4.Actor模型+领域驱动设计+策略模式+事件响应式架构

真正的P8年薪百万架构师级写法,逼王才这么写代码,装逼的极限,内卷的奥义

Maven依赖:

依赖Akka框架 Actor模型,懂得都懂,大数据分布式计算Spark框架RDD依赖的框架,很复杂,源码是Scala语言,逼王必学。也可以Scala做架构,Java做上层,有兴趣可以了解一下,反正管他是什么,够牛逼就完了。哎,就是得有牌面。if else什么的太low,应届毕业生水平才写if else(魔怔领导原话)。

   <dependency>
        <groupId>com.typesafe.akka</groupId>
        <artifactId>akka-actor_2.12</artifactId>
        <version>2.5.2</version>
    </dependency>

代码

private static String MAN = "man";
private static String WOMAN = "woman";
private static String WC_EVENT= "想上厕所";
@Data
static class Person extends UntypedActor {
    private String gender;
    private String name;

    public static Props props(final String name,final String gender) {
        return Props.create(new Creator<Person>() {
            private static final long serialVersionUID = 1L;
            @Override
            public Person create() throws Exception {
                Person p = new Person();
                p.setGender(gender);
                p.setName(name);
                return p;
            }
        });
    }
    @Override
    public void onReceive(Object message) throws Throwable {
        Pair<String,ActorRef> m = (Pair<String,ActorRef>)message;
        System.out.println(name + m.getLeft());
        m.getRight().tell(this, ActorRef.noSender());

    }
}

@Data
static class Toilet extends UntypedActor {
    private static Map<String, Consumer<String>> FUNC_MAP = new ConcurrentHashMap<>();
    static {
        FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});
        FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});
    }

    public void wc(Person p ){
        FUNC_MAP.get(p.getGender()).accept(p.getName());
    }

    public static Props props() {
        return Props.create(Toilet.class);
    }

    @Override
    public void onReceive(Object message) throws Throwable {
        Person p = (Person) message;
        wc(p);
    }
}

public static void main(String[] args) {
    ActorSystem actorSystem = ActorSystem.create();
    ActorRef person = actorSystem.actorOf(Person.props("张三",MAN), "ZhangSan");
    ActorRef toilet = actorSystem.actorOf(Toilet.props(), "Toilet");
    Pair<String,ActorRef> message = Pair.of(WC_EVENT,toilet);
    person.tell(message,ActorRef.noSender());
}

//输出
//张三想上厕所
//张三应该去男厕所
5.Actor模型+领域驱动设计+策略模式+事件响应式架构+动态类模板构建+运行时编译

为什么要写if else?为什么要创建类?为什么要写方法?真正的大佬(神经病)根本不需要写if else,也不需要创建class,甚至不需要命名方法。我上厕所就要写Toilet 类,开车就要写Car类,还得继承Actor的抽象类,太low,真正的Java不需要类型,不需要类,不需要if else,不需要命名方法,什么都不需要,便是Java的极致。我悟了。

Maven依赖:

咱还得整新活,javassist动态类加载,框架级代码才会用,运行时调编译器搞起,类型什么的根本不需要,咱就是要颠覆Java的根基,什么class,小孩才写class ,大人都是玩编译器。

   <dependency>
        <groupId>com.typesafe.akka</groupId>
        <artifactId>akka-actor_2.12</artifactId>
        <version>2.5.2</version>
    </dependency>

    <dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.25.0-GA</version>
    </dependency>

代码:

import akka.actor.ActorRef;
import akka.actor.ActorSystem;
import akka.actor.Props;
import akka.actor.UntypedActor;
import akka.japi.Creator;
import javassist.*;
import org.apache.commons.lang3.tuple.Pair;

import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

public class DynamicActorTest {

private static String MAN = "man";
private static String WOMAN = "woman";
private static String WC_EVENT= "想上厕所";
private static String WC_OVER_EVENT = "上完厕所了";

private static ActorSystem actorSystem = ActorSystem.create();

/**
 * 创建一个动态类,并实例化为对象,该方法会根据参数动态构建Class
 * @param name 动态类名
 * @param function actor模型消息处理方法 两个参数 一个是自身,一个是消息
 * @param attrAndValues 动态类的 属性 和 属性值
 * @return actor引用
 * @throws Exception
 */
public static ActorRef createDynamicClassImpl(String name, BiConsumer function, Pair<String, String>... attrAndValues) throws Exception {
    ClassPool pool = ClassPool.getDefault();
    // 动态定义包名 瞎几把写就行
    String className = "com.xxx.xxx.xxx." + name;
    // 创建一个空类
    CtClass cc = pool.makeClass(className);
    // 动态继承抽象类UntypedActor
    cc.setSuperclass(pool.get(UntypedActor.class.getName()));
    // 动态根据参数创建类的属性
    for (Pair<String, String> attrValue : attrAndValues) {
        CtField param = new CtField(pool.get(String.class.getName()), attrValue.getLeft(), cc);
        // 访问级别是 PUBLIC
        param.setModifiers(Modifier.PUBLIC);
        cc.addField(param, CtField.Initializer.constant(attrValue.getRight()));
    }

    //创建类一个属性叫function 类型是BiConsumer
    CtField param = new CtField(pool.get(BiConsumer.class.getName()), "function", cc);
    //访问级别是 PRIVATE
    param.setModifiers(Modifier.PRIVATE);
    cc.addField(param);
    //创建模板方法 方法是执行BiConsumer对应的lambda表达式
    CtMethod m = CtNewMethod.make(
            "public void onReceive(Object message) { function.accept($0 ,message);}",
            cc);
    cc.addMethod(m);
    // 动态添加构造函数
    CtConstructor cons = new CtConstructor(new CtClass[]{pool.get(BiConsumer.class.getName())}, cc);
    // 构造函数内容就是给function参数赋值
    cons.setBody("{ $0.function = $1 ;}");
    cc.addConstructor(cons);
    //-----------动态Actor类构建完毕------------
    // 实例化Actor
    Props p = Props.create(new Creator<UntypedActor>() {
        @Override
        public UntypedActor create() throws Exception {
            //反射创建对象
            return (UntypedActor)cc.toClass().getConstructor(BiConsumer.class).newInstance(function);
        }
    });
    return actorSystem.actorOf(p);
}


public static void main(String[] args) throws Exception {
    // class什么的根本不需要,直接动态创建类,对于复杂场景可以搞分布式remoteActor
    // 创建一个Car类(领域对象),并实例化,定义他的消息处理方法(或者你乐意叫领域驱动事件也可以)
    ActorRef car = createDynamicClassImpl("Car",(self, message)->{
        System.out.println(message);
        System.out.println("开车走咯~");
    });

    // 创建一个Toilet类,并实例化,定义他的消息处理方法(或者你乐意叫领域驱动事件也可以)
    ActorRef toilet = createDynamicClassImpl("Toilet", (self, message) ->{
        try {
            Map<String, Consumer<String>> FUNC_MAP = new HashMap<>();
            FUNC_MAP.put(MAN,person ->{System.out.println(person + "应该去男厕所");});
            FUNC_MAP.put(WOMAN,person ->{System.out.println(person + "应该去女厕所");});
            // 因为是无类型取值使用反射
            String gender = message.getClass().getField("gender").get(message).toString();
            String name = message.getClass().getField("name").get(message).toString();
            FUNC_MAP.get(gender).accept(name);
            car.tell(name+WC_OVER_EVENT,ActorRef.noSender());
        } catch (Exception e) {
            System.out.println("厕所不太欢迎这位");
        }

    });

    // 创建一个Person类,具有两个属性name和gender,并实例化,定义他的消息处理方法(或者你乐意叫领域驱动事件也可以)
    ActorRef person = createDynamicClassImpl("Person", (self, message) -> {
        Pair<String,ActorRef> pair = (Pair<String,ActorRef>) message;
        System.out.println(pair.getLeft());
        pair.getRight().tell(self,ActorRef.noSender());
    }, Pair.of("name", "张三"), Pair.of("gender", MAN));
    // 告诉张三想上厕所了 让他找厕所去
    person.tell(Pair.of(WC_EVENT,toilet), ActorRef.noSender());
}

}
//输出:
//想上厕所
//张三应该去男厕所
//张三上完厕所了
//开车走咯~
这样写代码,基本会被开除,你已经无敌了 公司已经容不下你了。

总结,代码还是正常写就得了,能实现业务不出bug好维护的就是好代码,切勿为了装逼使用各种奇技淫巧,if else没啥不好的。

原创声明

作者zh:古明地觉文章来源地址https://www.toymoban.com/news/detail-606519.html

到了这里,关于为什么很多程序员不用switch,而是大量 的if......else if?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么北欧的顶级程序员数量远远超于中国?

    说起北欧,很多人会想到寒冷的冬天,漫长的极夜,童话王国和圣诞老人,但是如果我罗列下诞生于北欧的计算机技术,恐怕你会惊掉下巴,先来看一些人物介绍: Linus Torvalds :是芬兰籍的计算机程序员,是Linux操作系统的创始人和主要开发者。 Bjarne Stroustrup :是丹麦籍的计

    2024年02月02日
    浏览(62)
  • 为什么这么优秀的女生要找男程序员做老公?

    这篇文章呢我们谈一下 学计算机的男生这个问题 这个话题主要是来自于 有一个舞蹈老师 有一天跟我聊起来 说他的一个学生 长得非常漂亮是个女士 身材非常棒然后 在这边就是在温哥华这边呢 正在申请PR这个是没有问题的 有工作然后就想找一个程序员 老公那就是这样的一个

    2023年04月17日
    浏览(65)
  • ChatGPT出来后,为什么老有人想让我们程序员失业?

    🐱 个人主页: 不叫猫先生 ,公众号: 前端舵手 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏: vue3+vite+typeScript从入门到实践 📢 资料领取:前端进阶资料

    2024年02月07日
    浏览(57)
  • 程序员员为什么总是要加班呢?不加班会被开除吗?

    最近和圈子外的一个好朋友去聊天 他问我一个很奇怪的问题 就是你们程序员为什么会经常加班 并且都是11点12点才回家 为什么会这样 是因为有很多事情做不完吗其实 我半开玩笑的告诉他 其实事情没那么多 那为什么还要加班呢 首先加班的原因有很多 但是概述起来 就有如下

    2023年04月25日
    浏览(103)
  • 程序员为什么不喜欢关电脑?揭秘背后的原因与“英雄”本色

    在许多人眼中,程序员似乎总是与电脑形影不离,甚至深夜时分,他们的电脑屏幕也依旧亮着。那么,为什么程序员们似乎从不喜欢关电脑呢?今天,就让我们一起走进程序员的世界,揭秘这背后的原因,看看他们真正的“英雄”本色! 在程序员的日常工作中,保持流畅且不

    2024年02月19日
    浏览(61)
  • 为什么越来越多的人转行学IT当程序员?

    疫情当下,大学毕业生的人数越来越多,就业越来越困难,导致毕业生的就业压力越来越大。但就在这种“毕业即失业”的就业形势下,IT行业的从业者却拿着高薪,在所有行业中成为“佼佼者”。 为什么学IT的人越来越多? 01 行业发展前景,一直向上 我们的工作、生活和学

    2023年04月11日
    浏览(74)
  • 为什么有35岁「职业危机」的程序员不转做测试呢?

    针对这个问题,我想我还是有点发言权的,虽然我不是做开发,但是我老公是妥妥的程序员一枚,而我又是干测试的,所以我也会问他,为啥不转测试呀,测试相对不累,且工资也高于市面很多工作,即轻松又能赚钱,何乐而不为? 和老公交流过这个问题。交流后,我觉得要

    2024年02月10日
    浏览(55)
  • 人工智能这么厉害,比如GPT-4,为什么没有看到程序员失业?

    目录  一、一次理性的反思 看看网友基于GPT-4生成代码的测试案例: 二、人工智能与程序员相辅相成 三、无独有偶的低代码 1、提升开发价值 2、利于团队升级 四、最后 OpenAI发布了GPT-4,这个远超以往的任何人工智能的模型,在 逻辑、推理、数学、常识 等方面超越了90%的人

    2023年04月08日
    浏览(66)
  • 程序员日常|为什么我在开发工作中偏爱这款键盘?

    最近一直不断地有粉丝朋友们私信我,问我该如何给自己挑选一款适合程序员工作的键盘,于是今天来给大家介绍下我用的键盘。 程序员作为一个需要长时间敲代码的职业,没有一个趁手的键盘是不行的,往小了说是折损工作效率,往大了说就是在损伤自己的手,是对自己的

    2024年02月02日
    浏览(53)
  • 【为什么计算机老师不转行做薪资更高的程序员工作?】

    至于为什么一些计算机老师没有选择从事薪资更高的程序员工作,有很多原因。首先,人们的职业选择因素多样化,不仅仅取决于薪资。有些老师可能对教学工作有着浓厚的兴趣,并享受与学生交流和知识传授的过程。其次,不同的人对工作环境和工作内容有不同的偏好。有

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包