介绍
通灵义码AI是一款面向程序开发者的智能辅助工具,其核心功能在于通过深度学习算法对代码进行分析和建议。该工具能够在一定程度上理解编程语言的语法和语义,帮助开发者提高代码质量和开发效率。然而,其生成的代码并非总能满足实际需求,因此优化和指导尤为重要。
代码质量如何高效提高?
在软件开发的初期阶段,推荐的步骤是首先编写原始代码,随后使用通灵义码AI插件进行代码优化。这一流程有助于快速构建基本功能,随后通过AI技术进行改进。然而,现实中,通灵义码AI所优化的代码有时存在冗余、低效等问题,难以直接使用。为了解决这一问题,开发者可以通过结合特定指令,向通灵义码AI明确表达其需求。
通过优化指令的使用,开发者可以引导AI更好地理解其意图,从而生成符合要求的代码。例如,可以在提交代码时附加对功能的具体描述、性能要求及可读性标准等信息。这种交互式的优化方式,不仅提高了代码的质量,也增强了开发者与AI工具之间的协同作用。
综上所述,通灵义码AI作为一款创新的编码助手,通过合理的使用和优化指令,能够有效提升代码质量,助力软件开发的高效进行。
指令1 功能细分
Do One Thing
函数应该只做一件事。它们应该把这件事做好。它们应该只做这件事。
AI会基于这个指令,不断细分功能和业务,然后在封装到对应的方法,这时我们就可以复制粘贴,当然我们可以创建对应的Service去管理这些方法。
指令2 抽象函数
Reading Code from Top to Bottom: The Stepdown Rule
我们希望代码像一个自上而下的叙述。我们希望每个函数后面都跟着下一个抽象层次的函数,这样我们就可以在阅读函数列表时,逐层降级地阅读程序。
指令3 替换if/else
Switch Statements
很难写一个小的 switch 语句。即使是只有两个案例的 switch 语句,其大小也超出了我对单个代码块或函数的期望。编写一个只做一件事的 switch 语句也很困难。由于其本质,switch 语句总是执行 N 件事情。不幸的是,我们并不总能避免使用 switch 语句,但我们可以确保每个 switch 语句都埋藏在一个低级类中,并且永远不会重复。当然,我们可以通过多态性来实现这一点。
指令4 函数名
Use Descriptive Names
实现这一原则的关键一半在于为小函数选择合适的名称,这些函数只做一件事。函数越小、越专注,选择描述性名称就越容易。
不要害怕给名字起得长一些。一个长的描述性名称比一个短的神秘名称要好。一个长的描述性名称比一个长的描述性注释要好。使用一种命名约定,使函数名称中的多个单词易于阅读,然后利用这些多个单词为函数命名,使其能够清楚地表达其功能。
指令5 参数功能合并
Triads
接受三个参数的函数比二元函数更难理解。排序、暂停和忽略的问题增加了不止一倍。我建议在创建三元函数之前仔细考虑。
Argument Objects 参数对象
Compare: 比较:
Circle makeCircle(double x, double y, double radius);
vs
Circle makeCircle(Point center, double radius);
指令6 流转的对象
Command Query Separation
函数应该要么执行某个操作,要么返回某个信息,但不能两者兼而有之。你的函数要么应该改变一个对象的状态,要么应该返回关于该对象的一些信息。两者同时进行往往会导致混淆。
当某个业务过于复杂,我们不要害怕创建类,当每一个函数需要不同的请求参数,大胆使用函数封装请求参数对象,这个请求参数对象只是中间对象,在方法运行结束后,它就会销毁了。
是不是感觉很可惜,没什么用,而且还把工作量加大,但是请求参数封装后,这个代码会非常优雅。
指令7 提取重复代码
Don't Repeat Yourself
重复可能是软件中一切邪恶的根源。为了控制或消除重复,许多原则和实践应运而生。
指令8 对象内的计算封装
Data Abstraction
隐藏实现不仅仅是将一层函数放在变量之间。隐藏实现是关于抽象的!一个类并不仅仅通过 getter 和 setter 将其变量暴露出来。相反,它提供了抽象接口,使得用户可以操作数据的本质,而无需了解其实现。
public class Square {
public Point topLeft;
public double side;
}
public class Rectangle {
public Point topLeft;
public double height;
public double width;
}
public class Circle {
public Point center;
public double radius;
}
public class Geometry {
public final double PI = 3.141592653589793;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square)shape;
return s.side * s.side;
}
else if (shape instanceof Rectangle) { Rectangle r = (Rectangle)shape; return r.height * r.width;
}
else if (shape instanceof Circle) {
Circle c = (Circle)shape;
return PI * c.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
public class Square implements Shape {
private Point topLeft;
private double side;
public double area() {
return side*side;
}
}
public class Rectangle implements Shape {
private Point topLeft;
private double height;
private double width;
public double area() {
return height * width;
}
}
public class Circle implements Shape {
private Point center;
private double radius;
public final double PI = 3.141592653589793;
public double area() {
return PI * radius * radius;
}
}
指令9 检查null
Don't Return Null Don't Pass Null
如果你有返回 null 的方法的冲动,考虑抛出异常或返回一个特殊情况对象。如果你正在调用一个来自第三方 API 的返回 null 的方法,考虑用一个方法来包装该方法,这个包装方法要么抛出异常,要么返回一个特殊情况对象。
从方法中返回null是糟糕的,但将null传递给方法更糟。除非你正在使用一个期望你传递null的API,否则你应该尽量避免在代码中传递null。
指令10 引入第三方框架
Using Third-Party Code
在接口的提供者和接口的用户之间存在一种自然的紧张关系。第三方包和框架的提供者努力追求广泛的适用性,以便能够在多种环境中工作并吸引广泛的受众。另一方面,用户希望接口能够专注于他们的特定需求。这种紧张关系可能在我们系统的边界上引发问题。例子:
Map sensors = new HashMap();
Sensor s = (Sensor)sensors.get(sensorId);
vs
public class Sensors {
private Map sensors = new HashMap();
public Sensor getById(String id) {
return (Sensor) sensors.get(id);
}
//snip
}
指令11 依赖注入
Dependency Injection
一个强大的机制,用于将构建与使用分离,是依赖注入(DI),即将控制反转(IoC)应用于依赖管理。控制反转将次要责任从一个对象转移到其他专门负责此目的的对象,从而支持单一职责原则。在依赖管理的上下文中,一个对象不应自行负责实例化其依赖项。相反,它应将这一责任交给另一个“权威”机制,从而实现控制的反转。由于设置是一个全局问题,这个权威机制通常是“主”例程或一个特殊用途的容器。