导读:我们刚刚测试了 JetBrains AI,这是一款新的多层 LLM AI 助手,适用于其集成开发环境 (IDE) 集合。
有使用 Java 的同学一直对IntelliJ 的评价很高,最近他们对 Rider for C# 的评价也很高。
当我有机会尝试JetBrains AI(一种自称为“AI 助手”的 AI 服务)时 ,也感到非常兴奋。这款软件是 “由 OpenAI 和 Google 作为主要第三方AI提供商提供支持”。
当人工智能技术如此频繁地变化时,我不确定哪些大语言模型的能力与某些任务相匹配,或者是否用哪个是个好主意,但是不依赖某个单个供应商确实更加有意义。
现在说到使用某个 LLM,每个专业开发人员的需求都略有不同,没有一种就是单纯光是“为我编写代码”。
开发者的两种突出需求模式是“代码完成”和“解释此代码”,这对于面对不熟悉的代码库的顾问来说非常有用。
生成单元测试也是一种选择项,尽管不对自己的单元测试负责会在某种程度上违反 Agile 原则。比如我个人不喜欢在 IDE 中提供代码示例,因为我可以浏览整体,但我知道有些人却很喜欢。例如,大多数开发者发现时间和日期功能正在变得非常不直观;有时复杂的系统无法变得更简单。这些例子是非常有用的。
本文将是对 AI 助理的评论,但是我第一次在 Mac 上使用 JetBrains IDE,因此需要进行一些管理工作。我有一个该 AI 服务的“许可证密钥”,我还尝试将其移植到社区版本上。
ReSharper 运行在 Visual Studio 上,而 Rider 是一个单独的 IDE,所以我选择了后者,以便方便查看 C#。我希望 AI 服务能够附加到它上面,在这一点上,并不完全清楚。
我最终安装了 Rider 的试用版本。下面从导入设置开始,满分搞定!
在下一节中,我的问题立即得到了AI回答,味道还不错。
这让我更加相信编辑器厂商已经考虑了用户成长路径。它一开始这样做产品,很明显,但是,我在看到其它很多的产品没有给予自己的服务足够的关注。注册完用户后,JetBrains 给我发了邮件,这样就成功注册了一个帐户,这样我便获得了一个免费许可证来做测试了。
LLM 服务现在在很大程度上被视为一种附加组件,这使得“AI”感觉像是一种附加组件。我认为这不是 IDE 制造厂商的错误做法,我相信最终,这种类型的产品将存在于操作系统堆栈或更靠后的位置。
现在,我们必须等待某个大公司争取到 LLM 的主导地位,这时将个人用户推向明确的消费者地位。
static private List
archetypes = new List (); ...
public static List
FetchArchetypes() { if (!archetypes.Any()) {
ArchetypeTemplates tt = BackEnd.DataLoader
.LoadGameData("Archetypes.json"); foreach (ArchetypeTemplate t in tt.Archetypes) {
archetypes.Add(new Archetype(t));
}
}
return archetypes;
}
其中,Archetype 是游戏中的结构。最初,我将其作为 JSON 文件中的数组读取,并在本地重新创建该列表结构。
如果列表已经创建,我只需传递该列表即可。
那么 AI 认为这是在做什么?它返回了一个全面的答案,其中包括以下两个亮点:
“最后,该方法返回 Archetypes 列表,其中包含基于 JSON 文件中的模板创建的 Archetype 实例。Archetype 类似乎代表游戏中的特定原型,此方法用于根据 JSON 文件中的数据填充所有原型的列表。”
“在这个特定方法中,值得注意的是,只有当原型列表为空时,才会执行数据加载和对象实例化。这意味着一旦原型被提取一次,对此方法的后续调用将返回相同的列表,而无需进行任何额外处理。这是一种常见模式,适用于加载或对象创建是一个繁重的过程,并且生成的数据在应用程序的生命周期内不会发生变化的情况。”
所以,这里有几个好东西。AI 已经弄清楚了所讨论的 Archetype 可能用于游戏。这非常重要,在快速尝试理解代码时,理解意图和实用性很重要。
AI 已经认识到我使用了后期实例化,为什么我要使用它,以及它是一个真正的模式。 它甚至还明白读取 JSON 文件是在其他地方完成的,但我们依赖于输入。
然后,我直接从上下文菜单中请求AI进行代码重构建议:
它建议将加载操作分解为单独的方法,以简化代码。我非常认可,几乎每个开发人员都会同意这一有效改进。
它也可能还会抱怨代码里缺乏错误检测。
代码完成
[Flags] public enum Pets
{
None = 0,
Dog = 1,
Cat = 2,
Bird = 4,
Rabbit = 8,
Other = 16
}
Flags 值以二进制幂增加,可以构建成一个集合。
我删除了原有代码,并要求助手使用签名再重新生成它。它给了我生成了相关选项。首先检查标志是否在当前集合中的方法。它给出了这个函数主体:
public bool CheckFullGameFlags(FullGameFlags flag)
{
return (InGameFullFlags & flag) != 0;
}
这是原来有的代码:
public bool CheckGameFlag(FullGameFlags flag) => (InGameFullFlags.HasFlag(flag));
虽然它没有给出现代级的 C# 方法,但HasFlag 正确地计算出了我想要将传入的Flag与集合进行比较。InGameFullFlags从上面的代码中找到了本地集合。
然后我给了它 SetFullGameFlag 的免费签名。同样,命名约定中有足够的内容用于提示,我想添加新的 Flag:
我再次点击曲线并使用“使用 AI 实现”,它生成了下面的代码,它还附带了完整的解释。
void SetFullGameFlag(FullGameFlags flag)
{
InGameFullFlags = InGameFullFlags | flag;
}
这和我所拥有的是相同的(除了表达式主体标记⇒外):
public void SetGameFlag(FullGameFlags flag) => InGameFullFlags |= flag;
最后,对 ClearGameFlag 也做同样的操作,这只是对设置进行按位取反。再次,得到了完全正确的结果。
我很高兴地将结果直接写入编辑器,作为代码完成直接搞定。而通过在侧面板中写入了帮助信息,AI 附带了大量的解释说明文字。
作者:万能的大雄
本文为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。