文章目录
背景,尝试使用ai coding工具针对当前项目进行简单实践
开发的目标
这里有一个简单的接口开发,就是通过一个目标设置,用户可以事先存储两个值,一个是步数目标,一个是睡眠目标。
根据原先的产品逻辑,用户必须同时设置步数目标、睡眠目标两个数值。但是需求变动了,变动点是步数目标和睡眠目标不用同时设置,只要设置一个就可以了。
代码逻辑修改部分。
原有代码片段详解.
实体类
java
@Data
public class GoalSettingsSaveReq {
/**
* 目标设置ID
*/
@ApiModelProperty(value = "目标设置ID")
private String goalSettingId;
/**
* 步数目标
*/
@NotNull(message = "步数目标不能为空")
@Min(value = 1000, message = "步数目标不能小于1000")
@Max(value = 65000, message = "步数目标不能大于50000")
@ApiModelProperty(value = "步数目标")
private Integer stepTarget;
/**
* 睡眠目标
*/
@NotNull(message = "睡眠目标不能为空")
@Min(value = 1, message = "睡眠目标不能小于0.5小时")
@Max(value = 30, message = "睡眠目标不能大于15小时")
@ApiModelProperty(value = "睡眠目标")
private BigDecimal sleepTarget;
}
java
@RestController
@RequestMapping("/api/v2/mr/goal/settings")
@Slf4j
@RequiredArgsConstructor
@Api(tags = "目标设置管理")
public class GoalSettingsController {
private final GoalSettingsBusinessService goalSettingsBusinessService;
@PostMapping("/saveOrUpdate")
@ApiOperation("保存或修改目标设置")
public CommonDataResponse<GoalSettingsVo> saveOrUpdate(
@Validated @RequestBody GoalSettingsSaveReq request) {
log.info("saveOrUpdate goal settings request: {}", JSONUtil.toJsonStr(request));
String userId = GlassesContext.getUserIdByStr();
return CommonDataResponse.make(goalSettingsBusinessService.saveOrUpdate(request, userId));
}
}
1. 编写需求提示词,让iflow帮忙开发。
提示词
com.qiuguo.server.glasses.controller.GoalSettingsController#saveOrUpdate 方法帮我调整一下,我需要调整一下字段的处理逻辑。在目标设置请求的时候允许只存在步数目标 以及 睡眠目标 , 但是不允许两个都是空值。帮我调整一下。
在计划模式下,iflow根据当前的提示词,会根据用户的需求,先去查找文件,以及周围的代码(读取GoalSettingsController接口,比如接口的GoalSettingsSaveReq请求对象,接口的返回对象 GoalSettingsVo, GoalSettingsBusinessService,GoalSettingsService等等依赖)
可以看到这一过程是自动的,然后iflow会根据当前收集的上下文信息(包括用户提示词(提问),搜索到的代码片段),提供了一个当前的计划。
在仔细阅读该代码,可以发现,计划分了三步走。
java
根据您的需求,我需要调整目标设置的字段处理逻辑。目前的`GoalSettingsSaveReq`类中,`stepTarget`和`sleepTarget`两个字段都被设置为`@NotNull`,这意味着两个字段都必须有值。根据您的要求,需要修改为:在目标设置请求中只允许存在*步数目标*以及*睡眠目标*,但不允许两个都是空值。
我的计划是:
1. 修改`GoalSettingsSaveReq`类,将`stepTarget`和`sleepTarget`字段的`@NotNull`注解移除,允许它们为空
2. 在`GoalSettingsServiceImpl`的`saveOrUpdate`方法中添加校验逻辑,确保`stepTarget`和`sleepTarget`不能同时为空
3. 如果两个字段都为空,则抛出业务异常,提示用户至少设置一个目标
这样可以满足您的需求,即允许单独设置步数目标或睡眠目标,但不允许两个都为空。
很显然,以上的计划能瞒住普通的需求。
但是作为一个有过其他方案开发的经验者 ,我完全可以使用另一种编码方式去实现。因此搜选择了** 3.继续规划** 使用。也就是选择了如下的计划调整 步骤。
计划调整
提示词: 校验的过程我使用 Java Bean Validation提供ConstraintValidator定义自定义校验,来实现检验逻辑。帮我重新规划一下。
计划回复。

java
根据您的需求,我将使用Java Bean Validation的ConstraintValidator来实现目标设置的校验逻辑。目前的`GoalSettingsSaveReq`类中,`stepTarget`和`sleepTarget`两个字段都被设置为`@NotNull`,这意味着两个字段都必须有值。根据您的要求,需要修改为:在目标设置请求中只允许存在*步数目标*以及*睡眠目标*,但不允许两个都是空值。
我的计划是:
1. 创建一个新的自定义校验注解`@ValidateGoalTargets`,用于校验目标设置请求中的步数目标和睡眠目标
2. 实现一个对应的校验器`GoalTargetsValidator`,继承`ConstraintValidator`接口,确保`stepTarget`和`sleepTarget`不能同时为空
3. 在`GoalSettingsSaveReq`类上添加这个自定义注解,移除原有的`@NotNull`注解
4. 在校验器中实现具体的校验逻辑:
- 当`stepTarget`和`sleepTarget`都为null时,校验失败
- 当至少有一个字段有值时,校验通过
5. 添加适当的错误提示信息,告知用户至少需要设置一个目标
这样可以满足您的需求,即允许单独设置步数目标或睡眠目标,但不允许两个都为空,并且使用了Java Bean Validation的标准方式来实现
基本上看以上的描述,基本功能已经基本上满足了我的需求。但是,一个很重要的问题是,计划调整只是添加了简单的校验,但是并没有帮我调整业务逻辑,也就是后续的service具体实现,因为字段的变更,可能会影响业务逻辑。所以,我仍然选择了** 3.继续规划** 使用。也就是选择了如下的进一步计划调整 步骤。
进一步计划调整。
提示词:
同时帮我添加一个非常重要的步骤,在修改了校验之后,还需要调整业务逻辑,帮忙看看需要调整哪些业务逻辑。
回复:
计划回复
shell
根据您的需求,我已经完成了对目标设置校验逻辑的规划,具体包括以下几个方面:
1. 创建自定义校验注解@ValidateGoalTargets:定义一个新的注解用于校验目标设置请求中的步数目标和睡眠目标。
2. 实现GoalTargetsValidator校验器:实现一个继承ConstraintValidator的校验器,确保stepTarget和sleepTarget不能同时为空。
3. 改GoalSettingsSaveReq类:移除原有的@NotNull注解,并添加自定义的@ValidateGoalTargets注解。
4. 检查并调整GoalSettingsServiceImpl中的业务逻辑:确认该类中的saveOrUpdate方法不需要额外的校验逻辑调整,因为校验将由Java Bean Validation在Controller层自动完成。
5. 检查并调整GoalSettingsBusinessServiceImpl中的业务逻辑:确认该类中的saveOrUpdate方法不需要额外的校验逻辑调整,因为它直接调用DaoService的方法。
6. 检查Controller层:确认GoalSettingsController中的saveOrUpdate方法已经使用了@Validated注解,能够自动触发Java Bean Validation。
通过以上调整,我们可以实现目标设置的校验逻辑:允许单独设置步数目标或睡眠目标,但不允许两个都为空,并且使用了Java Bean Validation的标准方式来实现。这样既满足了业务需求,又保持了代码的一致性和可维护性。
看了一下,基本上没有大毛病了,那么我们就开始让ai帮忙写一下代码吧。请选择是,使用 yolo 模式编辑,请去上趟厕所。回来就会给我一个非常好的答案了。
这里提示一下,其实还有一个功能需要添加这里方便演示我就不做下一步操作了,核心的步骤[测试],""" 请给我添加一个测试用例。"""
runing and go to wc
最终回复

show my code


java
public class GoalTargetsValidator implements ConstraintValidator<ValidateGoalTargets, GoalSettingsSaveReq> {
@Override
public boolean isValid(GoalSettingsSaveReq goalSettings, ConstraintValidatorContext context) {
// 检查stepTarget和sleepTarget是否都为空
if (Objects.isNull(goalSettings.getStepTarget()) && Objects.isNull(goalSettings.getSleepTarget())) {
// 如果都为空,校验失败
context.disableDefaultConstraintViolation();
context.buildConstraintViolationWithTemplate("至少需要设置一个目标(步数目标或睡眠目标)")
.addConstraintViolation();
return false;
}
// 如果至少有一个不为空,校验通过
return true;
}
}
java
@Constraint(validatedBy = GoalTargetsValidator.class)
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidateGoalTargets {
String message() default "至少需要设置一个目标(步数目标或睡眠目标)";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
很明显,ai flow已经帮我实现了功能,我只要看一遍就可以了。
结论。
在现实场景下ai coding目前仍然是一个需要靠经验(个人开发,领域经验),去开发的。当我们把问题描述地的确很精细的时候,【考虑开发过程中的并发,事务,等等,技术方案】,都需要经过历年的经验,希望以此篇致敬ai coding。希望以后能够越做越好。
这一篇是我的一个新的开始吧,后续我可能会根据自己这几个月来对ai coding的实践进行进一步梳理,也希望大家在开发的过程中出现的问题一起沟通,学习。
还有一个比较有趣的ai coding编码时间是,请看看从RTSP到HLS:构建一个简单的流媒体转换服务(java spring 这篇文章,这个项目也是由ai 完全开发的。这个过程挺有意思的,希望与大家共勉。

