一文告诉你如何用Bito AI提高开发效率

​ 随着最近ChatGPT、AutoGPT的诞生,如何利用AI提效赋能成为了大家关注的焦点。然而,OpenAI较高的实用门槛(科学上网),使得大部分程序猿只能望洋兴叹,空有渴望AI的能力,却无使用AI的途径。

​ 而最近,一款名为Bito AI的插件横空出世。通过这款工具,可以让AI轻松编写代码、解析语意、编写单测、检查安全性等等功能。可以说是给编程人员带来了不少的福利。更重要的是,这款工具是免费的!且其支持VS Code、Chrome插件以及Jetbrains的全系列IDE,如:IDEA、PyCharm、Clion、GoLand等,几乎可以说是覆盖了大部分开发同学。

​ 今天,我就将这款工具分享给你。

安装

​ 作者编程的工具主要是IDEA,因此我主要介绍IDEA工具下的Bito AI使用教程。通过Settings => Plugins,在插件市场中搜索"bito"就可以搜索到对应的插件。点击安装后并重启IDEA,就可以在右侧边栏找到插件啦~
在这里插入图片描述
在这里插入图片描述

正确打开方式

​ 在插件的右下角,介绍了目前插件支持的功能,从左到右依次是:代码解释生成注释性能检测安全检测风格测试提高可读性代码整洁生成单元测试

在这里插入图片描述

​ 这里我主要挑代码解释安全检查生成单元测试这三个我个人觉得最有用的功能做个简单的介绍。

代码解释

​ 对于一些好奇心旺盛的程序员来说,知其然也要知其所以然。为了探究实现的原理,往往离不开查看源码的过程。以我最近在研究的HashMap为例子,他的hash方法让我一直疑惑不解:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

​ 代码本身并不复杂,但是一个右移16位做异或的操作却让我难以理解。为啥要做异或运算?为啥又是右移了16位再做异或运算?我翻遍了百度、知乎,也才笼统的得到一个答案:可能是为了解决哈希冲突。

在这里插入图片描述

但是当我向AI请求这段代码的含义时,简简单单就获得了一个清晰易懂的答案。(通过选中你关注的代码,右键就可以打开Bito AI插件,选择explain this code,就可以获取到AI对于这段代码的理解。)

在这里插入图片描述

​ 看到答案的我也不由的惊呼起来,有这等工具加持,我还会怕冗长的Spring框架看不懂吗?我还会害怕自己理解不了繁琐的源码原理吗?

​ 显然,有了这样的工具,对于程序员理解框架、理解内在的实现含义,必然是一大助力。

代码检测

​ 在日常业务代码中,我们难免会遇到一些【可能出现异常的情况】,最常见的比如空指针异常。那么是否可以借助于AI的能力,尽可能的避免空指针,避免成为团队的"Null-King/Queue"呢?答案是肯定的。

​ 同上述操作类型,我们可以通过选中代码后,右键点击进行安全检查,AI就会自动为你的代码做安全检测。

在这里插入图片描述

​ 点击之后,AI就会为你分析当前的代码的问题所在,并自动为你生成一份“它”认为的安全的代码:(通过强调一下”使用中文“,可以让AI翻译成一下成你能简单理解的内容。)

在这里插入图片描述

​ 在AI生成完代码后,Bito插件还会为你自动生成Diff View,供你判断当前AI到底改动了什么。方便你对代码进行合并。

在这里插入图片描述

​ 从生成的代码中我们不难看到,除了对于空指针的判断以为,AI还“自顾自的”为你创建了几种它认为需要检查的情况。如:要校验商品当前是否有效、是否正在使用中等等。通过对自己的代码反复的分析,无疑可以提高编程的质量、减少犯错的概率。

生成单元测试

​ 在写完了一段代码以后,为了保证自己逻辑的完整性、可行性,免不了需要写一些单元测试的代码。对于这一点,BitoAI也能够支持。只是遗憾的是,目前BitoAI还做不到像上面一样,通过选中一段代码,并右键点击"Generate Unit Test",BitoAI就能针对你所选择的代码生成一段单元测试。

​ 目前只能通过手动将代码粘贴到右侧的对话框中,让AI自动生成。

在这里插入图片描述

原始代码:

    @SneakyThrows
    public Boolean deductProduct(ProductPO productPO) {
        log.info("distribuiteLock:" + JSON.toJSONString(productPO));
        //首先获取分布式的锁
        RLock lock = redissonClient.getLock("deductProduct");
        try {
            LOGGER.info("分布式锁加锁!");
            //尝试对redis的分布式锁进行加锁
            boolean success = lock.tryLock(30, TimeUnit.SECONDS);
            if (!success) {
                //加锁失败,直接返回
                return false;
            }
            LOGGER.info("查找商品的数据为 :" + JSON.toJSONString(productPO));
            Example example = new Example(ProductPO.class);
            Example.Criteria criteria = example.createCriteria();
            criteria.andEqualTo("skuId", productPO.getSkuId());
            List<ProductPO> productPOS = productMapper.selectByExample(example);
            if (CollectionUtils.isEmpty(productPOS)) {
                throw new RuntimeException("当前商品不存在");
            }
            for (ProductPO selectProductPO : productPOS) {
                //对对应的sku进行数量扣减
                Integer number = selectProductPO.getNumber();
                LOGGER.info("当前商品的数量为:" + number);
                if (number <= 0) {
                    //小于等于0时,不进行扣减
                    continue;
                }
                selectProductPO.setNumber(number - productPO.getNumber());
                productMapper.updateByPrimaryKey(selectProductPO);
            }
        } finally {
            //最后一定记得释放锁资源
            LOGGER.info("分布式锁释放!");
            lock.unlock();
        }
        return true;
    }

AI生成的单元测试代码:

import org.junit.jupiter.api.Test;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import static org.mockito.Mockito.*;
import static org.junit.jupiter.api.Assertions.*;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
 public class DeductProductTest {
     @Mock
    private RedissonClient redissonClient;
     @Mock
    private ProductMapper productMapper;
     @InjectMocks
    private MyClass myClass;
     public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
     @Test
    public void testDeductProduct() {
        // set up test data
        ProductPO productPO = new ProductPO();
        productPO.setSkuId("123");
        productPO.setNumber(1);
         ProductPO existingProductPO = new ProductPO();
        existingProductPO.setNumber(10);
         // mock RedissonClient.getLock() method
        RLock lock = mock(RLock.class);
        when(redissonClient.getLock("deductProduct")).thenReturn(lock);
         // mock RLock.tryLock() method
        when(lock.tryLock(30, TimeUnit.SECONDS)).thenReturn(true);
         // mock ProductMapper.selectByExample() method
        Example example = new Example(ProductPO.class);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("skuId", productPO.getSkuId());
        when(productMapper.selectByExample(example)).thenReturn(Collections.singletonList(existingProductPO));
         // call the method to be tested
        boolean result = myClass.deductProduct(productPO);
         // assert the result
        assertTrue(result);
         // verify RedissonClient.getLock() method is called once with the correct parameter
        verify(redissonClient, times(1)).getLock("deductProduct");
         // verify RLock.tryLock() method is called once with the correct parameters
        verify(lock, times(1)).tryLock(30, TimeUnit.SECONDS);
         // verify ProductMapper.selectByExample() method is called once with the correct parameter
        verify(productMapper, times(1)).selectByExample(example);
         // verify ProductMapper.updateByPrimaryKey() method is called once with the correct parameter
        verify(productMapper, times(1)).updateByPrimaryKey(existingProductPO);
    }
}

​ 尽管生成出来的代码实际上并不能很好的运行起来(mock数据有问题、且类上没有写启动的方法),但是实际上简单的修改修改,基本的一个单测样例就出来了。实际上还是很大的节省了开发的代码内容的。

总结

​ 理性中立客观的来说,虽然当前的BitoAI提供的功能还存在着一定的缺陷。比如部分生成的代码质量不高、解释的语言也更像是一些没用的话术。但是产品本身设计出来的功能和预期实现的目标确实是很诱人。试想一下,如果未来在编写代码的时候,能有一个无所不知的AI协助你,那么你的开发效率是不是可以得到几何倍数的提升呢?


更多干货内容,欢迎关注wx公众号【笑傲菌】~

参考文献

有哪些好用的 AI 神器推荐?

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eclipse是一个开放源代码的集成开发环境(IDE),可用于Java开发,但也可以用于其他编程语言的开发。在本文中,我将向你展示如何使用Eclipse进行Java开发。 1. 下载Eclipse 首先,你需要从Eclipse官方网站下载Eclipse IDE。下载页面上将提供几个不同的版本,包括Eclipse IDE for Java Developers、Eclipse IDE for JavaScript and Web Developers,以及Eclipse IDE for C/C++ Developers等。选择适合你的版本,然后按照安装向导进行安装。 2. 创建Java项目 一旦你安装了Eclipse,你可以启动它并创建一个新的Java项目。选择“File”->“New”->“Java Project”,然后按照向导创建一个新的Java项目。在创建项目时,你需要指定项目名称、项目类型以及JRE版本等信息。 3. 创建Java类 一旦你创建了一个Java项目,你就可以创建一个Java类。选择你的Java项目,在“src”文件夹上右键单击,然后选择“New”->“Class”。输入类名和选择要继承的类(如果有的话),然后点击“Finish”。 4. 编写Java代码 现在你已经创建了一个Java类,可以开始编写Java代码了。在Eclipse的编辑器中,你可以输入Java代码并保存它。当你保存Java文件时,Eclipse会自动编译你的代码,并在Problems视图中显示任何编译错误。 5. 运行Java程序 一旦你编写了Java代码并保存了它,你可以运行Java程序。右键单击Java文件,然后选择“Run As”->“Java Application”。如果一切顺利,你的Java程序将在控制台中输出结果。 6. 调试Java程序 如果你的Java程序出现了错误或不按预期运行,你可以使用Eclipse的调试器来调试它。在Eclipse的编辑器中,你可以设置断点并启动调试器。当程序执行到断点时,调试器会暂停程序并允许你检查变量、运行代码等。 7. 导入外部JAR包 有时,你可能需要使用外部JAR包来完成你的Java项目。在Eclipse中,你可以简单地将外部JAR包导入到你的项目中。右键单击Java项目,然后选择“Build Path”->“Configure Build Path”。在“Libraries”选项卡上,你可以添加外部JAR包。 总结 在本文中,我们介绍了如何使用Eclipse进行Java开发。我们学习了如何创建Java项目、创建Java类、编写Java代码、运行Java程序、调试Java程序以及导入外部JAR包。Eclipse具有强大的功能,可以大大提高Java开发效率

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值