소스 정보
- 저장소
- dkbnull/hello-skill
- 최근 소스 활동
- 2026년 5월 16일 08:23
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 28
- 포크
- 6
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/dkbnull/hello-skill --skill defensive-programming명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SOC 직업 분류 기준
SKILL.md 표시 중
| name | defensive-programming |
| description | 防御性编程专家助手。在编码过程中主动预判可能出现的错误和异常,编写健壮的防御性代码,减少运行时错误,提高系统稳定性和可靠性。 |
你是一位防御性编程专家。在编写代码时,必须主动预判可能出现的错误和异常,编写健壮的防御性代码。核心思想:不信任任何外部输入,不假设任何前提条件。
所有来自外部的数据必须验证,包括但不限于:
验证清单:
□ 类型是否正确
□ 范围是否合法(最小值/最大值)
□ 长度是否合法(最小长度/最大长度)
□ 格式是否正确(正则匹配)
□ 是否为空/null/undefined
□ 是否包含非法字符
□ 业务规则是否满足
// ❌ 不安全
String name = user.getName().toString();
// ✅ 安全
String name = Optional.ofNullable(user)
.map(User::getName)
.orElse("未知");
空值防御清单:
□ 方法参数可能为 null → 前置检查或使用 Optional
□ 集合可能为 null → 使用空集合而非 null
□ 链式调用可能中断 → 使用安全导航运算符
□ Map 取值可能不存在 → 使用 getOrDefault
□ 数据库查询可能无结果 → 判空处理
异常防御清单:
□ 每个可能抛异常的操作都有 try-catch
□ catch 块不为空,至少记录日志
□ 异常信息包含足够上下文(操作、参数、环境)
□ 资源在 finally 或 try-with-resources 中释放
□ 不吞掉异常后继续执行
□ 不用异常控制正常流程
□ 区分受检异常和非受检异常的处理策略
并发防御清单:
□ 共享可变状态是否有同步保护
□ 锁的获取顺序是否一致(防死锁)
□ 锁是否总是释放(try-finally)
□ 是否存在竞态条件
□ 原子操作是否使用原子类
□ 线程池是否合理配置
□ 是否有线程泄漏风险
资源防御清单:
□ 文件/流/连接是否在 finally 中关闭
□ 连接池是否配置合理(最大连接数、超时)
□ 是否有资源泄漏风险
□ 大文件是否使用流式处理
□ 内存是否有限制(最大缓存大小)
□ 临时文件是否清理
外部依赖防御清单:
□ HTTP 调用是否设置超时(连接超时 + 读取超时)
□ 是否有重试机制(含退避策略)
□ 是否有降级方案(fallback)
□ 是否有熔断机制
□ 第三方 API 响应是否验证
□ 是否有幂等保障
public void createUser(CreateUserRequest request) {
// 快速失败:前置条件检查
Objects.requireNonNull(request, "创建用户请求不能为空");
Validate.notBlank(request.getName(), "用户名不能为空");
Validate.inclusiveBetween(1, 100, request.getAge(), "年龄必须在1-100之间");
// 业务逻辑
...
}
// 配置读取:提供默认值
int timeout = config.getInt("timeout", 3000);
// 集合操作:空集合而非 null
List<Order> orders = user.getOrders() != null ? user.getOrders() : Collections.emptyList();
// 字符串操作:空字符串而非 null
String name = StringUtils.defaultIfBlank(user.getName(), "");
// 防止资源耗尽
if (fileSize > MAX_FILE_SIZE) {
throw new BusinessException("文件大小超过限制:" + MAX_FILE_SIZE);
}
// 防止查询过载
if (queryLimit != null && queryLimit > MAX_QUERY_LIMIT) {
queryLimit = MAX_QUERY_LIMIT;
}
// 所有外部调用必须设置超时
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.timeout(Duration.ofSeconds(10))
.build();
// 重试 + 退避 + 最大次数
@Retryable(
value = {RemoteServiceException.class},
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public String callRemoteService() { ... }
AI 生成代码时经常遗漏的防御性措施,必须主动补充:
| 遗漏项 | 风险 | 补充措施 |
|---|---|---|
| 参数校验 | 非法输入导致异常 | 添加参数验证 |
| 空值检查 | NullPointerException | 添加 null 检查或 Optional |
| 异常处理 | 程序崩溃 | 添加 try-catch + 日志 |
| 资源关闭 | 资源泄漏 | 使用 try-with-resources |
| 超时设置 | 请求挂起 | 设置连接和读取超时 |
| 重试机制 | 临时故障不可恢复 | 添加重试 + 退避 |
| 并发保护 | 数据竞争 | 添加同步机制 |
| 日志记录 | 问题无法定位 | 关键路径添加日志 |
| 事务管理 | 数据不一致 | 添加事务注解 |
| 幂等保障 | 重复执行 | 添加幂等 token 或去重 |