如何用AI写编写代码
最近在写代码时,充分享受到了借助于AI来编写代码的好处。以下演示实例:因为历史的原因,需要用到Eclipse的SWT来写流程图的代码,但是国内基本上都是如何用JS来写代码,对于SWT的应用现在都非常有限。我们以前用SWT做的流程图,不能实现画虚线。比如两个节点之间,鼠标拖动时,实现一个虚线。我本人这方面的经验不足,就询问AI,看能否对我进行指导:我做了这样的询问: 我用zest来实现流程图。请实现节点间可以通过鼠标移动添加连线的功能,鼠标移动时可以显示虚拟的连线。AI做出如下的回答:在 Eclipse Zest 中实现通过鼠标移动添加连线并显示虚拟连线的功能,可以借助 Zest 和 Draw2D 的功能来实现。以下是实现步骤和示例代码:
- 创建 Zest 图表使用 Graph 组件作为主容器。
- 捕获鼠标事件监听鼠标按下、移动和释放事件,记录节点的起点和终点。
- 绘制虚拟连线使用 PolylineConnection 在鼠标移动时动态绘制虚拟连线。
- 添加连线当鼠标释放时,将虚拟连线替换为实际连线,并更新图表模型。
以下代码展示如何实现这个功能:
- 节点查找 (findNodeAt)通过鼠标坐标检查鼠标点击的节点。
- 临时连线创建 (createTemporaryConnection)创建虚拟连线并将其绘制在图层上。
- 动态更新连线 (updateTemporaryConnection)鼠标移动时更新连线的终点。
- 清理虚拟连线 (clearTemporaryConnection)在鼠标释放时移除虚拟连线。
- 添加实际连线鼠标释放时,如果目标节点存在且与起始节点不同,则创建实际的 GraphConnection。
- 用户按下鼠标选择起始节点。
- 鼠标拖动时显示虚拟连线。
- 鼠标释放后,如果释放位置在另一个节点上,则添加连线;否则取消连线。
此代码可以作为基础,根据需求扩展更多功能(如连接线样式、属性编辑等)。
想不到这么简单就完成了。这就是使用AI带来的开发效率。不过有担心了,程序员是否真的要失业了?
一句话生成代码并演示能形成效果有什么玩法列出25条
以下是25种一句话生成代码并演示能形成效果的玩法:
1. **生成贪吃蛇游戏**:输入“用 HTML 做一个贪吃蛇游戏”,即可生成贪吃蛇游戏代码,支持键盘操作。
2. **制作天气查询工具**:描述“生成一个天气查询应用”,平台会自动生成相关代码并提供预览。
3. **创建个人简历网页**:只需一句话描述简历内容,即可生成排版精美的简历网页。
4. **开发简单的任务管理应用**:输入“生成一个任务事项代办记事本”,即可得到一个简单的前端任务管理应用。
5. **绘制数据图表**:如输入“生成一个展示去年各个月份销售额的柱状图”,即可生成相应的数据图表代码。
6. **制作抽奖工具**:描述“生成一个抽奖工具”,平台会生成相应的抽奖应用。
7. **搭建日程展示页面**:输入“生成一个日程展示页面”,即可得到一个用于展示日程安排的网页。
8. **创建通知公告板**:描述“生成一个通知公告板”,即可生成一个用于发布通知公告的网页。
9. **开发动态壁纸应用**:输入“生成一个动态壁纸应用”,即可得到一个简单的动态壁纸应用。
10. **制作音乐播放器**:描述“生成一个音乐播放器”,即可生成一个音乐播放器应用。
11. **开发营销活动页面**:输入“生成一个营销活动页面”,即可得到一个用于促销活动或产品介绍的网页。
12. **创建合同管理系统**:描述“生成一个合同管理系统”,低代码平台会自动生成合同模板和管理功能。
13. **制作客户关系管理系统**:输入“生成一个客户管理系统”,即可得到一个用于管理和互动的系统。
14. **开发项目管理工具**:描述“生成一个项目管理工具”,平台会生成项目计划、资源分配和进度跟踪功能。
15. **创建人事管理系统**:输入“生成一个人事管理系统”,即可得到一个用于管理员工信息和人事事务的系统。
16. **开发售后服务系统**:描述“生成一个售后服务系统”,即可得到一个用于处理客户售后请求的工具。
17. **制作采购管理系统**:输入“生成一个采购管理系统”,平台会根据需求生成采购计划和供应商选择策略。
18. **创建销售管理系统**:描述“生成一个销售管理系统”,即可得到一个用于优化销售流程和提高业绩的系统。
19. **开发生产管理系统**:输入“生成一个生产管理系统”,即可得到一个用于优化生产流程和提高效率的工具。
20. **制作设备管理系统**:描述“生成一个设备管理系统”,即可得到一个用于监控设备状态和进行维护的系统。
21. **开发质量管理系统**:输入“生成一个质量管理系统”,即可得到一个用于质量检测和改进的工具。
22. **创建物资管理系统**:描述“生成一个物资管理系统”,即可得到一个用于智能化管理库存和物资流动的系统。
23. **制作仓储管理系统**:输入“生成一个仓储管理系统”,即可得到一个用于优化仓储布局和库存管理的工具。
24. **开发互动学习应用**:描述“生成一个互动学习应用”,即可得到一个用于模拟实验或语言学习的互动工具。
25. **制作太阳系模型动画**:输入“生成一个太阳系模型动画”,即可得到一个展示太阳系行星运动的动画效果。
一文详解|如何写出优雅的代码
简介: 和大家一起探讨一下优雅代码
谈到好代码,我的第一想法就是优雅,那我们如何该写出好的代码,让阅读的人感受到优雅呢?首先简单探讨一下优雅代码的定义
关于好代码的定义,各路大神都给出了自己的定义和见解
- 整洁的代码如同优美的散文。—— Grady Booch
- 任何一个傻瓜都能写出计算机可以理解的代码。唯有写出人类容易理解的代码,才是优秀的程序员。—— Martin Fowler
首先要达成一致,我们写的代码,除了用于机器执行产生我们预期的效果之外,更多的时候是给人读的,可能是后续的维护人员,更多时候是一段时间后的作者本人,因此优雅面向不同的用户有两层含义的解读
- 对人而言,代码的整洁,清晰的逻辑
- 对机器而言,准确性、执行性能、异常处理机制等
这次,我们就来聊一聊,什么代码是优雅的代码,怎样写出优雅的代码
简单说就是类、方法、变量的命名要名副其实,要能描述清晰自己的职责。一个好的命名能输出更多的信息,它会告诉你,它为什么存在,它是做什么事的,应该怎么使用。一个简单的衡量标准是,如果命名完仍需要注释来补充语义,那就不是名副其实;
选个好名字要花时间,但省下的时间的时间比花掉的多,一旦发现有更好的名称,就换掉旧的。
举个栗子
整体逻辑没啥问题,读完之后,就有很多问题在脑海中产生
- 1. theList中是存储什么东西的数组?
- 2. theList第一个值是做什么的?
- 3. 值4的意义又是什么?
- 4. 返回的列表该怎么使用?
代码应该体现所处的情景,比方说上述的代码所处情景是我们正在开发一种扫雷游戏,盘面是名为theList的单元格列表,那就将其名称改为gameBoard。
盘面上每个单元格都用一个简单数组表示。零下标条目是一种状态值,而这种状态值为4代表“已标记”。只要改为有意义的名称,代码就得到了改进。
更进一步,不用int数组来表示单元格,而是另写一个类。该类包括一个名副其实的函数(称为isFlagged),从而掩盖住哪个魔术数4,得到新的函数版本。
实际上,只要我们的代码有足够的表达力,能清晰的通过命名来做到名副其实,就不太需要注释,或者根本不需要;注释的存在往往是弥补我们无法用代码清晰表达意图的情况。可以想象一下,每次自己发现需要写注释的时候,是什么心态,担心此处代码明天自己看不懂或者别人看不懂,那有没有考虑用更好的语义的代码来替代。
但尽管有注释,也有好有坏,有时候注释也会撒谎,通常注释存在的越久,就离其描述的代码越远,变得越来越离谱;因为代码在变动在迭代,在注释和代码间可能会插入新的代码,旧代码我们通常copy来copy去,分离又重组,但注释一般不会修改,就会造成注释和描述的代码分离,对阅读者造成更大的迷惑。
我们在需要写注释的时候就要告诉自己,能不能用代码来进行描述。以下是一些坏代码的注释bad case
方法应该有多短小?没有明确约束,idea也不会限制你,但通常我们的方法不该长于一屏,至少多于一屏或者横向外溢到屏幕以外最直观的就会造成可读性体验差,读了下面忘记上面,左右拖拽等。对大多数笔记本来说一屏大概就30行左右。短小精简的方法要比30行短很多,比如
if语句、else语句、while语句等,其中的代码应该只有一行,
改行通常是一个调用语句,这样不但能保持短小,还可以给调用方法命名一个有说明性的名字,进一步增加代码的可读性
一事精,便可动人。这个普世法则甚至适用于各种场合。像设计原则的单一职责模式,让类只有一个职责。如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致逻辑混乱,设计耦合。当一个职责发生变化时,可能会影响其它的职责。
另外,多个职责耦合在一起,会影响复用性。针对方法而言更是如此。方法作为程序的原子单元,保持单一会有效提升复用性。 那怎么判断一个方法是否只做了一件事。最简单的规则就是看看该方法是否能在拆出一个方法,且拆出去的方法是不同于该方法的诠释和实现。但是要注意同一方法的逻辑层级务必要一致。
抽象层级一致也是对方法只做一件事的更高要求,抽象层级不一致的代码一定是做了多件事。
我们读代码通常是自顶向下阅读,我们想让每个方法后面都跟着位于下一层级的方法,这样我们可以依着抽象层级向下阅读了。我们也需要这样阅读代码,先有整体在展示细节,这种叫向下规则。这也是保持方法短小,确保只做一件事的诀窍。一旦方法中混杂不同的抽象层级,会让人很迷惑,因为没办法这个方法中判断某个表达式是基础概念还是细节,更恶劣的是,一旦细节与基础概念混杂,更多的细节就会纠缠不清,举例子我们想写一个冰冻大象的需求
这个例子的1.2两步就不是一个层级的逻辑,是属于更高层级的抽象。3.4.5都是将大象放入冰箱的步骤,属于低层级的抽象。可以将代码拆分为如下实现,将高抽象层级的代码聚合提取出来,细节在分别单独实现,如下
针对错误码的判断会导致更深层次的嵌套结构,返回错误码就意味着要求调用者跟着处理错误,如下
一般我们还需要将try/Catch代码块给抽离出去,另外形成方法。防止代码块过多搞乱代码结构,分不清错误处理还是正常流程。同时因为方法只做一件事,错误处理就是一件事,因此错误处理的方法不应该在做其他事,也就是如果一个方法中有try关键字,那try就是方法的开头。catch/finally代码块后面也不应该再有内容,如下
比如Lombok组件通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法 举例如下:
比如Apache Commons系列组件给我们提供了关于字符串、集合、IO操作等工具方法。这些组件是个大宝库,提供了不少轮子
重构是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
在重构之前一定要知道,一旦开始对类和方法进行重构,就需要事前有完备的单元测试用例来保障重构的准确性,每次重构之后都要去执行对应的单元测试用例,验证重构的正确性!
如果在一个以上的地点看到相同的代码结构,可以肯定的是,想办法抽线出来合而为一,代码会变得更好。一般包含几个点的重复
- 最单纯的重复代码就是“同一个类的两个函数含有相同的表达式”。这时候需要做的就是采用提炼函数提炼出重复的代码,然后让这两个地点都调用被提炼出来的那一段代码
- 如果重复代码只是相似而不是完全相同,需要先尝试用移动语句重组代码顺序,把相似的部分放在一起以便提炼。
- 如果重复的代码段位于同一个超类的不同子类中,可以使用函数上移来避免在两个子类之间互相调用。
遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名,可以对一组甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名称能够解释其用途,就要毫不犹豫地那样做,关键不在于函数的长度,而在于函数“做什么”和“如何做”之间的语义距离。
- 百分之九十九的场合里,要把函数变短,只需使用提炼函数。找到函数中适合集中在一起的部分,将它们提炼出来形成一个新函数。
- 如果函数内有大量的参数和临时变量,最终就会把许多参数传递给被提炼出来的新函数,导致可读性几乎没有任何提升。此时可以经常运用以查询取代临时变量来消除这些临时元素。引入参数对象和保持对象完整则可以将过长的参数列表变得更简洁一些。
- 如果有多个switch语句基于同一个条件 进行分支选择,就应该使用以多态取代条件表达式。
对数据的修改经常导致出乎意料的结果和难以发现的bug。在一处更新数据,却没有意识到软件中的另一处期望着完全不同的数据,于是出现难以预料的bug,往往比较难排查(需要排查数据流转的整体链路),这就需要一些方法用于约束对数据的更新,降低数据可变性的风险。
- 可以用封装变量来确保所有数据更新操作都通过很少几个函数来进行,使其更容易统一监控和演进
- 如果一个变量在不同时候被用于存储不同的东西, 可以使用拆分变量将其拆分为各自不同用途的变量,从而避免危险的更新操作。
- 使用移动和提炼函数尽量把逻辑从处理更新操作的代码中搬移出来,将业务处理逻辑代码与执行数据更新操作的代码分开。
所谓模块化,就是力求将代码分出区域,最大化区域内部的交互、最小化跨区域的交互。但是经常出现一个函数跟另一个模块中的函数或者数据交流格外频繁,远胜于与所处模块内部的交流,这就是模块功能不单一的典型情况。
- 总看到某个函数为了计算某个值,从另一个对象那儿调用半打的取值函数。如果这个函数需要跟这些数据待在一起,那就使用移动功能把它移过去。
- 一个函数往往会用到几个模块的功能,那么它究竟该被置于何处呢?原则是:判断哪个模块拥有的此函数使用的数据最多,然后就把这个函数和那些数据摆在一起。 如果先以提炼函数将这个函数分解为数个较小的函数并分别置放于不同类中,上面的步骤就会比较容易完成。
- Strategy模式和Visitor模式是为了对抗发散式变化,但也能解决单一职责问题,最根本的原则是:将总是一起变化的东西放在一块儿。 数据和引用这些数据的行为总是一起变化的,如果有特殊情况,我们就搬移那些行为,保持变化始终只在一地发生。
点击查看原文,获取更多福利!
https://developer.aliyun.com/article/1117703?utm_content=g_1000366324
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。