精华内容
下载资源
问答
  • 如何优化代码

    千次阅读 2019-06-21 19:49:16
    在互联网发展初期,计算机硬件性能不尽完美,所以程序员很大的一部分工作就是优化代码的执行速度,然后根据计算机各部分运行速度的快慢,总结出了很多规律,比如说堆排序,各种线程技术等,都是充分利用计算机内存的运行...

    一,代码执行效率为王的时代

    在互联网发展初期,计算机硬件性能不尽完美,所以程序员很大的一部分工作就是优化代码的执行速度,然后根据计算机各部分运行速度的快慢,总结出了很多规律,比如说堆排序,各种线程技术等,都是充分利用计算机内存的运行效率,尽量减少磁盘操作等.这也是考察一个程序员是否优秀的标准之一.只有这样才能在有限的机器资源上满足更多人的需求.


    但随着计算机机器的发展和降价,再一味地忽视代码的阅读效率,只为提高代码的执行效率,就有点得不偿失了,毕竟代码不仅要让技术执行,也需要让人阅读.记得有个经典案例是:面试官问如果客户量大增,该如何优化才能保证项目顺利运行?回答者侃侃而谈,从数据库优化到添加多线程.最后面试官直接说:直接增加服务器不就可以了,增加服务器的成本相对于修改代码的成本更低的.


    二,代码阅读效率也很重要的时代


    代码的特征是:一次编写,几次修改,多次阅读,时时运行

    目前基本上所有的项目都是以团队的形式推进的,代码肯定需要多人协作完成一个项目.这样肯定避免不了相互沟通和阅读代码,

    如何高效的阅读彼此的代码是一个项目能否顺利推进的重要标准.

    好的阅读效率肯定是要以规范做基础的.下面是一些自己在多年做项目过程中总结的一些如何提高阅读效率的说明

    1,不要提前定义变量,尽量在用的时候再定义,创建和使用放在一起

    2,代码首屏满足原则:一个类或接口最好将别人最想了解的和经常用到的代码放到最上面,保证一进来不用翻动屏幕就能找到想要的信息.

    3,实体类的参数必须注释,且尽量保证首屏满足原则

    4,数据库表字段避免使用mysql关键字 避免造成不必要的麻烦

    5,实体类 最好不要命名为一个字母.如 user u = new User();单个字母容易被认为是一个基本类型变量

    6,类起名称的时候不要和现用的类名重复,要不会经常应用错误或者让你选择用哪个类,比如自己写string处理类就不要叫StringUtils

    7,数据库表最好添加逻辑删除字段,避免错误操作造成数据无法恢复

    8,数据库表的名字,相关实体类的名字,mapper.xml文件名,dao层接口名,service层接口和实现类名字的前缀应该完全一样
       eg:数据库表名是user,mapper.xml应该为 UserMapper.xml,实体类应该是User.java,DAO层应该是UserDao.java
       service层应该是UserService.java  UserServiceImpl.java  

    9,影响项目代码后续返工和优化的绝大部分原因是之前的数据库表没有设计好,所以请用规定时间的2倍来创建数据库的表

    10,代码要尽可能的英语化,日志和注释尽可能功能的用中文说明,便于以后阅读和排查问题

    11,数据库表里的字段顺序,mysql表中的字段顺序,model类中的字段顺序最好保持一致

    12,sql语句一般先写插入,然后查询,然后更新,最后删除

    13,单元测试总是划算的

    14,无用的代码和废弃功能的代码一定要及时删除,如果为了以后使用可以自己手动备份下然后删除,避免代码的坏味道

    15,下次需要上线的内容,一定要都记下来,便于上线前自测,要不需求多了以后你就忘了都上线了哪些内容

    16,多个相似的名称,不要只让中间的字母不一样,这样很容易造成用错,比如 userNickName和userRealName

    17,数据库字段如果是可列出的值一定要把所有值都列出来,避免以后无法明白含义.如:状态 1 上架,0 下架

    18,每次上线前review从上次上线到这次上线的所有代码,并写出来需要测试的重点,便于测试和事后发邮件说明上线内容

    19,数据库表字段排序:主键>外键>关键字段>常备字段

    20,调用方法的参数,最好和被调用者的参数一样,如被调用者是getUser(string userName),调用者传参数是最好是getUser(userName)

    展开全文
  • 概述 如果你要去查多层IF…ELSE有什么危害, 估计会有很多, 什么不容易扩展、可读性差... 所以 今天简单总结下如何优化代码中看起来很low的if…else… 第一式:能返回及时返回 if(条件1) { return; } else { //逻辑B

    概述

    如果你要去查多层IF…ELSE有什么危害, 估计会有很多, 什么不容易扩展、可读性差。 其实所有代码优化的核心目的都是一个: 不让人看见是自己写的代码看起来很LOW。。 想象一下公司新来了一个毕业生, 要研读一下系统代码, 忽然看见有十个if else… 一打开代码记录,发现是对面的你写的, 一定心里想, 这个师兄技术一定不咋地。 所以 今天简单总结下如何优化代码中看起来很low的if…else…

    第一式:能返回及时返回

    if(条件1) {
       return;
    } else {
      //逻辑B
    }
    

    优化为:

    if(条件1) {
       return;
    }
    //逻辑B
    

    这种最常见在非空判断的时候, 如果是空 或者已经有了明确的返回值的时候就及时返回, 少了一个else之后的条件

    第二式:三目运算符

    int  price ; 
    if(condition){    
         price = 80; 
    }else{     
         price = 100; 
    }
    

    优化后:

    int price = condition ? 80 :100;
    

    看着是不是好看了? 这特么不就是if…else。

    第三式:数据字典法

    这个办法是核心就是把if…else用一个结构先存起来, 命中key 返回对应的value, 这个结构可以是枚举、MashMap、Java对象 甚至是数据库。 用枚举举例子:

    
    String OrderStatusDes; 
    if(orderStatus==0){     
        OrderStatusDes ="订单未支付"; 
    }else if(OrderStatus==1){     
        OrderStatusDes ="订单已支付"; 
    }else if(OrderStatus==2){    
        OrderStatusDes ="已发货"; 
    

    优化之后

    
    public enum OrderStatusEnum {     
        UN_PAID(0,"订单未支付"),
     
        PAIDED(1,"订单已支付"),
     
        SENDED(2,"已发货"),; 
         
        private int index;  
       
        private String desc;
          
        public int getIndex() {         
            return index;     
        } 
        
        public String getDesc() {         
            return desc;     
        } 
         
        OrderStatusEnum(int index, String desc){         
            this.index = index;         
            this.desc =desc;     
        }  
        
        OrderStatusEnum of(int orderStatus) {         
            for (OrderStatusEnum temp : OrderStatusEnum.values()) {             
                if (temp.getIndex() == orderStatus) {                 
                     return temp;             
                }         
            }         
            return null;     
        } 
    }
    

    使用:

    String OrderStatusDes = OrderStatusEnum.0f(orderStatus).getDesc();
    

    这个方法就实用多了, 确实方便扩展, 且不low, 是一种常见的方式。

    第四式:Optional大法

    Optional是Java8引入的, 确实挺好使的, 用的方法就是:

    Optional<String> strOptional = Optional.of("jay@huaxiao");
    strOptional.ifPresentOrElse(System.out::println, () -> System.out.println("Null"));
    

    和三目表达式有异曲同工的意思。但更强大。

    第五式:策略模式+工厂方法消除 if else

    这个算是个比较高端的玩法, 但是并不是都适合, 一般都用在if …else中逻辑比较多,且有共性(参数列表相同)的情况下。

    
    String medalType = "guest"; 
    if ("guest".equals(medalType)) {     
        System.out.println("嘉宾勋章");  
    } else if ("vip".equals(medalType)) {     
        System.out.println("会员勋章"); 
    } else if ("guard".equals(medalType)) {    
        System.out.println("展示守护勋章"); 
    } 
    

    第一步:就是要把各个层的逻辑抽象为接口, 这也就是我说的为啥要有共性的原因。

    //勋章接口 
    public interface IMedalService {     
        void showMedal(); 
    }
    

    第二步:根据不同逻辑定策略:

    //守护勋章策略实现类 
    public class GuardMedalServiceImpl implements IMedalService {     
        @Override     
        public void showMedal() {         
            System.out.println("展示守护勋章");     
         } 
     } 
     
     //嘉宾勋章策略实现类 
     public class GuestMedalServiceImpl implements IMedalService {     
            @Override     
            public void showMedal() {         
                System.out.println("嘉宾勋章");     
        } 
     } 
     
     //VIP勋章策略实现类 
     public class VipMedalServiceImpl implements IMedalService {     
        @Override     
        public void showMedal() {         
            System.out.println("会员勋章");     
        } 
     }
    

    接下来,我们再定义策略工厂类,用来管理这些勋章实现策略类,如下

    //勋章服务工产类 
    public class MedalServicesFactory {      
        private static final Map<String, IMedalService> map = new HashMap<>();     
        static {         
            map.put("guard", new GuardMedalServiceImpl());         
            map.put("vip", new VipMedalServiceImpl());         
            map.put("guest", new GuestMedalServiceImpl());     
        }     
     
        public static IMedalService getMedalService(String medalType) {         
            return map.get(medalType);     
        } 
    }
    

    测试代码:

    
    public class Test {     
        public static void main(String[] args) {         
            String medalType = "guest";         
            IMedalService medalService = MedalServicesFactory.getMedalService(medalType);                 
            medalService.showMedal();     
        } 
    } 
    

    是不是看起来难懂了很多? 对 这就是代码优化的目的, 这时候实习生已经对你有些敬仰了。

    终极姿势: 系统架构层优化IF…ELSE

    引入规则引擎, 之前写过就不重复写了, 链接:
    https://blog.csdn.net/wangpengzhi19891223/article/details/87793025
    https://blog.csdn.net/wangpengzhi19891223/article/details/87867579

    展开全文
  • 如何优化代码中大量的if/else,switch/case? 前言 随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得...

    转载与:https://my.oschina.net/19921228/blog/3044249

    如何优化代码中大量的if/else,switch/case?

    前言

    随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得更优雅吗?

    正文

    使用枚举
    这里我们简单的定义一个表示状态的枚举。

    public enum Status {
        NEW(0),RUNNABLE(1),RUNNING(2),BLOCKED(3),DEAD(4);
    
    
        public int statusCode;
    
        Status(int statusCode){
            this.statusCode = statusCode;
        }
    }
    
    

    那么我们在使用的时候就可以直接通过枚举调用了。

    int statusCode = Status.valueOf("NEW").statusCode;
    
    
    

    优雅的解决了下面代码赋值的方式

    if(param.equals("NEW")){
        statusCode = 0;
    }else if(param.equals("RUNNABLE")){
        statusCode = 1;
    }
    

    善用 Optional
    在项目中,总少不了一些非空的判断,可能大部分人还是如下的用法

    if(null == user){
        //action1
    }else{
        //action2
    }
    

    这时候该掏出Optional这个秘密武器了,它可以让非空校验更加优雅,间接的减少if操作。没了解过Optional的同学可自行Google,这里就不再赘述。

    Optional<User> userOptional = Optional.ofNullable(user);
    userOptional.map(action1).orElse(action2);
    

    上面的代码跟第一段是等效的,通过一些新特性让代码更加紧凑。

    表驱动法
    来自Google的解释:表驱动法是一种编程模式,它的本质是,从表里查询信息来代替逻辑语句(if,case)。下面看一个案例,通过月份来获取当月的天数(仅作为案例演示,获取2月份的数据不严谨),普通做法:

    int getMonthDays(int month){
    	switch(month){
    		case 1:return 31;break;
    		case 2:return 29;break;
    		case 3:return 31;break;
    		case 4:return 30;break;
    		case 5:return 31;break;
    		case 6:return 30;break;
    		case 7:return 31;break;
    		case 8:return 31;break;
    		case 9:return 30;break;
    		case 10:return 31;break;
    		case 11:return 30;break;
    		case 12:return 31;break;
    		default:return 0;
    	}
    }
    

    表驱动法实现方式

    int monthDays[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int getMonthDays(int month){
    	return monthDays[--month];
    }
    

    其实这里的表就是数组而已,通过直接查询数组来获得需要的数据,那么同理,Map之类的容器也可以成为我们编程概念中的表。

    Map<?, Function<?> action> actionsMap = new HashMap<>();
    
    // 初试配置对应动作
    actionsMap.put(value1, (someParams) -> { doAction1(someParams)});
    actionsMap.put(value2, (someParams) -> { doAction2(someParams)});
    actionsMap.put(value3, (someParams) -> { doAction3(someParams)});
     
    // 省略 null 判断
    actionsMap.get(param).apply(someParams);
    

    通过Java8的lambda表达式,我们把需要执行东西存进value中,调用的时候通过匹配key的方式进行。

    提前判断返回
    在之前的文章《优化代码中的“坏味道”》里也有提过,如下语句

    
    if(condition){
       //dost
    }else{
       return ;
    }
    改为
    
    if(!condition){
       return ;
    }
    //dost
    

    避免一些不必要的分支,让代码更精炼。

    其他方法
    除了上面提到的方法,我们还可以通过一些设计模式,例如策略模式,责任链模式等来优化存在大量if,case的情况,其原理会和表驱动的模式比较相似,大家可以自己动手实现一下,例如我们在Netty的使用过程中,可能会出现需要大量判断不同的命令去执行对应动作的场景。

    ServerHandler.java
    
    if(command.equals("login")){
        //执行登录
    }else if(command.equals("chat")){
        //聊天
    }else if(command.equals("broadcast")){
        //广播信息
    }
    

    该如何处理呢?这里先卖个关子,大家可以先思考一下,笔记后续会写一些关于Netty实现IM的文章,到时候会详细介绍。

    结语
    最后要明确一点,不是所有的if/else,switch/case都需要优化,当我们发现有“痛点”或者“闻到代码有坏味道”再来优化才是最好的,不然你可能会写了一个从不扩展的可扩展代码,所有的优化都是为了更好的迭代项目,更好的服务于业务,而不是为了优化而优化。

    展开全文
  • 如何优化代码

    2016-10-30 18:42:00
    转载于:https://www.cnblogs.com/likeweb/p/6013695.html

     

    转载于:https://www.cnblogs.com/likeweb/p/6013695.html

    展开全文
  • 前端如何优化代码

    2018-09-08 03:38:09
    如果针对的是不断运行的代码,不应该使用setTimeout,而应该是用setInterval 因为setTimeout每一次都会初始化一个定时器,而setInterval只会在开始的时候初始化一个定时器。 5、创建对象的另外一个办法-不使用...
  • 方便总是有代价,而且“blinky”就是夸大“切换GPIO引脚”的代码大小。对于具有少量RAM和FLASH的设备,这可能会引起关注:如果'blinky'占用那么多,我的应用程序是否适合该设备?不要担心:可以轻松地修剪掉(或任何...
  • 原问答:可否举例说明你在工作中是如何优化前端代码的? 原则 首先说一个最重要的优化原则:代码优化是每天都要进行的,而不是一两个月做一次大优化,那时做就已经晚了。另外由于优化是每天做的,所以你不需要一次的...
  • bean里大量的相同的字段,每个字段都有isChecked和content属性,所以需要每一个都判断一遍是否选中,选中再显示内容 稍微举下例子 ``` public class FittingsInfo { ...有没有什么办法简化代码
  • 那么有什么方案可以优化代码中大量的if/else呢,下面就给大家简单的介绍几种方法。 1. 提前return 在写判断条件时,选择取反判断,这样的话代码在逻辑表达上会更清晰,看下面代码: if (condition) { // do ...
  • 前段时间在阅读别人所写的代码的时候 , 发现其中一些业务相关的方法体内 , 出现了比较多的if-else语句多层嵌套的情况 . 首先我个人不是不提倡写if-else语句 , 不得不说 , 很多时候 , 在写某些逻辑 使用if-else 去做...
  • 前端优化代码 减少http请求,将多个js脚本文件和 css样式表合并成一个文件,减少http的请求次数。 减少http请求 多使用字体图标,少用图片,减少对图片文件的请求。 图片精灵的使用,请求一张图片,很多个位置的...
  • 发现:当代码完成优化后,就可以解决这类问题 模版方法设计模式 在定义功能时,功能的一部分是确定的,但是有一部分是不确定的,把不确定的部分暴露出去的,让子类去复写从而实现  */ public class TemplateDemo { ...
  • 如何优化代码中的多层if嵌套

    千次阅读 2020-02-12 11:28:55
    日常开发中经常要针对不同业务场景作出不同行为与判断,在最早接触的时候普遍都是使用如下代码进行业务区分: if(res.data.code===0){ //do something }else if(res.data.code===1002){ //do something }else if(res....
  • 一般有两种方案:即优化代码或更改设计方法。我们一般会选择后者,因为不去调用以下代码要比调用一些优化的代码更能提高程序的性能。而一个设计良好的程序能够精简代码,从而提高性能。   下面将提供一些在JAVA...
  • 为什么80%的码农都做不了架构师?>>> ...
  • 首先我们要明白优化代码,并不是建立在java的源码之上的。而是建立在代码的中间表达是或者机器码上面。 公共子表达式消除 如果一个表达式E已经出现过了。而且下面出现的E的所有变量值都没有发生改变,那就可以优化...
  • 如何优化代码编译速度

    千次阅读 2013-05-26 21:21:34
    在软件的日常开发活动中,代码的编译是一件很重要的工作,因为它直接产生了可以运行的二进制文件。但是编译工作却是一个比较费时间的过程。当需要编译的文件数量比较少的时候,这一点可能表现的并不突出,然而当文件...
  • 读取文件夹下所有图片,把像素点分别按r\g\b通道读出来处理,不知道为什么读图很慢,一百多张图等好一会,有没有什么优化代码的建议? ``` import sys import os import time import random import numpy as np...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,883
精华内容 5,153
关键字:

如何优化代码