当前位置:首页>java>DRY 原则再思考:消除知识重复,而非代码相似

DRY 原则再思考:消除知识重复,而非代码相似

  • 2026-01-23 01:50:45
DRY 原则再思考:消除知识重复,而非代码相似

DRY(Don’t Repeat Yourself) 并不是说“别写两行长得像的代码”,而是说:系统中的每一项知识(knowledge)都应当有且仅有一个权威、无歧义的表达

DRY原则由Andy Hunt与Dave Thomas在1999年的经典著作《The Pragmatic Programmer》中提出,其初衷并非追求代码的“简洁”或“短小”,而是对抗软件演进中最隐蔽的敌人——隐性重复

当同一业务规则、配置逻辑或算法决策散落在多个角落时,每一次需求变更都可能变成一场“捉虫游戏”:你改了A模块,却忘了B模块也藏着同样的逻辑——于 bug在静默中滋生。

DRY 中的 “Yourself”是关键:它强调的是对自己所写系统的责任——不要让你自己(未来的你,或你的队友)陷入“一处修改、处处遗漏”的泥潭。DRY也是容易被误读的原则之一。很多人将其简化为“消灭视觉重复”,结果为了消除几行结构相似的 if 语句,硬造出泛型工具类、抽象基类甚至运行时反射机制,最终导致:

  • 代码耦合度上升;
  • 调试路径变长;
  • 业务语义被稀释。 
    区分 “知识重复” 与 “代码巧合相似” ——前者必须消除,后者不妨容忍。

一、DRY的含义:知识≠代码

把DRY简单理解为“不要写重复代码”是危险的简化。关键在于 “knowledge”(知识) —— 比如业务规则、算法逻辑、配置策略、状态转换条件等。而表面相似的代码,未必代表同一知识

✅ 正确理解:

  • 如果两个地方的“重复”源于同一个业务规则(例如“用户必须年满18岁才能注册”),那么这个规则应该只在一个地方定义。
  • 如果两个地方只是“碰巧长得像”(例如两个独立模块都用了 if (list != null && !list.isEmpty())),强行合并反而会制造耦合。

DRY 的目标是:当需求变更时,你只需修改一处。


二、反面教材:违反 DRY 的 Java 代码

❌ 反例1:硬编码导致多处重复业务规则

// 用户服务publicvoidregisterUser(User user){if (user.getAge() < 18) {thrownew IllegalArgumentException("年龄必须大于等于18岁");    }// ...}// 订单服务publicvoidcreateOrder(Order order){if (order.getUser().getAge() < 18) {thrownew IllegalStateException("未成年用户不能下单");    }// ...}// 营销服务publicbooleanisEligibleForPromotion(User user){return user.getAge() >= 18// 注意:这里逻辑一致,但表述不同!}

问题分析

  • “18岁”这一业务规则散落在三个地方,且错误消息不一致。
  • 若将来法定成年年龄改为20岁,开发者必须找到所有相关位置修改,极易遗漏。
  • 这是典型的 “知识重复”,违反 DRY。

三、正面示范:正确应用 DRY

✅ 正例1:将业务规则封装为单一权威源

publicclassAgePolicy{publicstaticfinalint MIN_AGE_FOR_REGISTRATION = 18;publicstaticbooleanisAdult(int age){return age >= MIN_AGE_FOR_REGISTRATION;    }publicstaticvoidvalidateAdult(int age){if (!isadult(age)) {thrownew IllegalArgumentException("用户必须年满 " + MIN_AGE_FOR_REGISTRATION + " 岁");        }    }}// 使用publicvoidregisterUser(User user){    AgePolicy.validateAdult(user.getAge());}publicvoidcreateOrder(Order order){    AgePolicy.validateAdult(order.getUser().getAge());}

优点

  • 业务规则集中管理,修改只需一处。
  • 方法命名清晰表达意图。
  • 常量命名具有业务语义(MIN_AGE_FOR_REGISTRATION),而非魔法数字。

四、警惕“伪 DRY”:过度抽象的陷阱

DRY 的最大误区,是把视觉重复当作知识重复。反例“为了不重复而制造复杂性”的典型错误。

❌ 反例2:强行通用化无关逻辑

// 试图“复用”两个完全无关的校验逻辑publicclassGenericValidator{publicstatic <T> voidvalidateNotNull(T obj, String name){if (obj == nullthrownew IllegalArgumentException(name + " 不能为空");    }publicstaticvoidvalidateListNotEmpty(List<?> list, String name){        validateNotNull(list, name);if (list.isEmpty()) thrownew IllegalArgumentException(name + " 不能为空列表");    }}// 在 UserValidator 中publicvoidvalidate(User user){    GenericValidator.validateNotNull(user.getName(), "姓名");    GenericValidator.validateListNotEmpty(user.getRoles(), "角色列表");}// 在 OrderValidator 中publicvoidvalidate(Order order){    GenericValidator.validateNotNull(order.getId(), "订单ID");    GenericValidator.validateListNotEmpty(order.getItems(), "商品列表");}

表面看:避免了 if (x == null) 的重复。实际上

  • GenericValidator 成为“万能工具箱”,职责模糊。
  • 错误信息模板化,丧失上下文(“角色列表不能为空” vs “用户至少需分配一个角色”)。
  • 更严重的是:User 和 Order 的校验逻辑本无共性,强行统一反而掩盖了各自的业务语义。

✅ 正例2:接受“良性重复”,保持上下文清晰

publicclassUserValidator{publicvoidvalidate(User user){if (user.getName() == null || user.getName().isBlank()) {thrownew IllegalArgumentException("用户姓名不能为空或空白");        }if (user.getRoles() == null || user.getRoles().isEmpty()) {thrownew IllegalArgumentException("用户必须至少拥有一个角色");        }    }}publicclassOrderValidator{publicvoidvalidate(Order order){if (order.getId() == null) {thrownew IllegalArgumentException("订单ID缺失,无法创建");        }if (order.getItems() == null || order.getItems().isEmpty()) {thrownew IllegalArgumentException("订单中必须包含至少一件商品");        }    }}

为什么这是更好的做法?

  • 每个验证消息都贴合具体业务场景,便于用户理解和日志排查。
  • 类职责单一,符合 SRP(单一职责原则)。
  • 即使有几行结构相似的 if,但表达的是不同知识,不应合并。

记住:重复的代码片段 ≠ 重复的知识。


五、复杂场景:DRY 与配置、策略模式的结合

当真正的“同一知识”需要在多个上下文中使用时,可通过策略、配置或领域模型实现优雅复用。

✅ 正例3:用策略模式统一费率计算(同一业务规则)

publicinterfaceShippingRateCalculator{BigDecimal calculateShippingCost(Order order);}@ComponentpublicclassDomesticShippingCalculatorimplementsShippingRateCalculator{@Overridepublic BigDecimal calculateShippingCost(Order order){// 国内运费规则(可能很复杂)return applyWeightBasedRate(order.getTotalWeight());    }}@ComponentpublicclassInternationalShippingCalculatorimplementsShippingRateCalculator{privatefinal DomesticShippingCalculator domesticCalc;publicInternationalShippingCalculator(DomesticShippingCalculator domesticCalc){this.domesticCalc = domesticCalc;    }@Overridepublic BigDecimal calculateShippingCost(Order order){// 国际运费 = 国内基础运费 + 固定附加费return domesticCalc.calculateShippingCost(order).add(new BigDecimal("20.00"));    }}

这里,国内运费的计算逻辑是共享知识,通过依赖注入复用,既避免重复,又保持扩展性。


六、DRY 与 YAGNI 的平衡

DRY 常与 YAGNI(You Aren’t Gonna Need It) 产生张力:

  • 过早抽象(违反 YAGNI):只为“可能”复用而设计通用组件。
  • 放任重复(违反 DRY):明知是同一规则却到处复制粘贴。

平衡之道

  1. 先容忍少量重复,直到第二次或第三次出现时再重构。
  2. 问自己:“如果这个规则变了,我需要改几个地方?” 如果答案 >1,就该 DRY 了。
  3. 优先提取方法,而非类或接口。局部方法复用成本最低。

DRY是手段不是目的

DRY原则的终极目标不是“代码行数最少”,而是降低系统认知负荷与变更成本。这意味着:

  • 真正的业务知识,确保单一权威源;
  • 偶然相似的代码,宁可重复,也不制造虚假抽象;
  • 清晰的命名与上下文,让每一行代码都讲述自己的故事。

重复不可怕,可怕的是用错误的抽象掩盖了本应独立的逻辑。保持警惕,保持简单,保持对“知识”而非“代码”的敬畏——这才是 DRY 的真谛。

信条:好的复用,是让变化只发生在一个地方;坏的复用,是让 bug 出现在所有地方。

● SpringBoot 优雅停机演进:实现原理与最佳实践

● 这有可能是OpenFeign最实用的用法与实践总结

● 盘点2025年java生态热门开源项目榜单

简单即可靠:KISS原则在开发中的实践与误用

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 02:06:59 HTTP/2.0 GET : https://f.mffb.com.cn/a/461494.html
  2. 运行时间 : 0.315877s [ 吞吐率:3.17req/s ] 内存消耗:4,620.94kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=d7b61d819f3ca2a86ca46207c10beb58
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001063s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001338s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.004521s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.004290s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001437s ]
  6. SELECT * FROM `set` [ RunTime:0.001049s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001425s ]
  8. SELECT * FROM `article` WHERE `id` = 461494 LIMIT 1 [ RunTime:0.005212s ]
  9. UPDATE `article` SET `lasttime` = 1770574019 WHERE `id` = 461494 [ RunTime:0.025308s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 65 LIMIT 1 [ RunTime:0.003939s ]
  11. SELECT * FROM `article` WHERE `id` < 461494 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.002121s ]
  12. SELECT * FROM `article` WHERE `id` > 461494 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.005566s ]
  13. SELECT * FROM `article` WHERE `id` < 461494 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.037782s ]
  14. SELECT * FROM `article` WHERE `id` < 461494 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.017214s ]
  15. SELECT * FROM `article` WHERE `id` < 461494 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002085s ]
0.317862s