代码坏味道自动化检测:从设计原理到工程实践

news2026/5/8 18:11:10
1. 项目概述一个“嗅觉”代码检查器的诞生在代码审查和日常开发中我们常常会遇到一些“闻起来不对劲”的代码。它们可能语法完全正确也能通过编译但结构臃肿、逻辑混乱、命名随意就像房间里弥漫着一股若有若无的异味让你感觉不舒服却又难以立刻指出具体问题。这类代码我们称之为“代码坏味道”。传统的静态代码分析工具如pylint、eslint主要关注语法错误、未使用的变量、风格规范等硬性规则但对于更深层次的、关于设计、结构和可维护性的“坏味道”往往力有不逮。cheickmec/smellcheck这个项目正是为了解决这个问题而生。它不只是一个检查器更像是一位经验丰富的“代码品鉴师”旨在自动化地嗅探出那些隐藏在代码深处的设计缺陷和不良实践。这个项目的核心价值在于它将“代码坏味道”这种相对主观、依赖经验的判断转化为一系列可配置、可执行的自动化检测规则。对于团队而言这意味着代码质量的门槛可以从“能运行”提升到“易于维护和扩展”。对于个人开发者尤其是初学者它则是一个绝佳的学习工具能帮助你快速识别自己代码中的潜在问题理解什么是好的设计。想象一下你写完一段自认为精妙的逻辑运行smellcheck后它提示你“这里存在一个‘过长参数列表’的坏味道建议考虑引入参数对象。” 这无疑是一次即时的、高质量的设计模式教学。2. 核心设计理念与架构拆解2.1 从“坏味道”到可检测规则smellcheck项目的首要挑战是如何将抽象的“坏味道”概念具象化。这需要深入理解各种经典坏味道如 Martin Fowler 在《重构》一书中总结的那些的本质并将其转化为对抽象语法树的模式匹配规则。以“重复代码”这个最常见的坏味道为例。简单的字符串匹配是无效的因为变量名、空格、格式的差异都会导致匹配失败。smellcheck需要做的是进行代码结构的相似性分析。一种常见的实现思路是先将代码块如函数、方法解析成某种规范化的中间表示比如忽略变量名、只保留操作符和控制流结构的“代码指纹”然后通过哈希或更复杂的相似度算法来比较这些指纹。对于“过大的类”或“过长的方法”规则则相对直接统计类中的方法数量、属性数量或方法的行数、圈复杂度并与预设的阈值进行比较。项目的架构很可能采用“插件化”或“规则引擎”的设计。核心引擎负责加载代码、解析为AST、遍历节点而具体的“坏味道”检测则实现为独立的规则插件。每个插件注册自己关心的AST节点类型如函数定义、类定义和检测逻辑。这种设计使得添加新的坏味道检测规则变得非常灵活社区可以很容易地贡献自己的“嗅觉”。2.2 技术栈选型与权衡要实现这样一个工具技术栈的选择至关重要。从项目名称和常见的开源实践来看它很可能是一个基于 Python 或 JavaScript/TypeScript 的工具因为这两种语言在开发者工具和静态分析领域生态丰富。如果选择 Python优势在于其强大的内置库如ast用于解析Python代码和丰富的科学计算库可用于实现复杂的相似度算法。radon、mccabe等库可以直接用来计算圈复杂度等度量元。smellcheck可以作为一个命令行工具轻松集成到 CI/CD 流程中。如果选择 JavaScript/TypeScript那么其优势在于能直接处理前端项目代码并且可以利用Babel、TypeScript Compiler API等成熟工具进行代码解析。这对于统一前端项目的代码质量规范尤其有吸引力。另一个关键决策是输出格式。一个优秀的检查工具不仅要能发现问题还要能清晰地呈现问题。因此smellcheck很可能支持多种输出格式简洁的终端文本输出用于快速反馈结构化的 JSON 输出便于其他工具如 CI 系统、IDE 插件集成以及美观的 HTML 报告用于生成可视化的代码质量仪表盘。3. 核心“嗅觉”规则详解与实现要点3.1 结构性坏味道检测这类坏味道关注代码单元类、方法的规模和结构。3.1.1 过大的类与神类检测逻辑通常基于多个阈值行数阈值统计类定义体的总行数去除空行和注释。一个超过 500 行的类就值得警惕。方法/属性数量阈值一个类拥有过多方法如超过20个或属性如超过15个往往意味着职责过多。内聚度评估更高级的检测会分析类内部方法之间的调用关系。如果类被清晰地划分为几个互不通信的方法组这暗示它应该被拆分成多个类。实操心得设置阈值时切忌一刀切。对于某些自动生成的代码如协议缓冲区生成的类或特定的设计模式如状态模式每个状态一个方法可能需要配置白名单或调整阈值。一个好的实践是让阈值可配置并为项目根目录提供一个.smellcheckrc配置文件。3.1.2 过长的方法与函数这是最普遍的坏味道之一。检测点包括物理行数最简单直接的指标。通常认为一个方法超过 50 行就难以理解。圈复杂度衡量方法中独立路径的数量。圈复杂度超过 10 通常意味着逻辑过于复杂测试用例会呈指数增长。嵌套深度过深的if/for/try嵌套会让代码像迷宫一样。检测最大嵌套层数超过 4 层就应发出警告。实现时需要在遍历AST遇到函数定义节点时启动一个子遍历器统计上述指标。对于圈复杂度的计算可以参考mccabe库的算法其核心是统计决策点if,for,while,and,or,catch等的数量加一。3.2 面向对象设计坏味道检测这类坏味道涉及类与类之间的关系。3.2.1 依恋情结指一个方法过度访问另一个类的数据而不是自己所在类的数据。检测逻辑是分析一个方法内部所有成员访问如self.xxx或this.xxx和外部对象访问如other_obj.attr。如果访问外部对象属性的频率远高于访问自身属性并且这些访问集中在某一个特定外部类上那么这个方法很可能更适合放在那个外部类中。实现上这需要对方法体内的每个属性访问节点进行来源分析区分“本地属性”和“外来属性”并进行统计和比例计算。3.2.2 数据泥团指总是一起出现的多个数据项如多个参数、多个类属性。检测这个坏味道需要跨方法甚至跨类的分析。参数泥团分析整个代码库找出频繁在多个方法签名中同时出现的参数组合。例如(user_id, username, email)这三个参数经常一起出现它们就应该被封装成一个UserInfo对象。属性泥团分析类的属性找出在多个类中重复出现的属性组合。这暗示这些属性应该被提取到一个新的父类或组合类中。这需要构建一个全局的数据使用关系图运用聚类算法来发现高频共现的数据组是smellcheck中算法复杂度较高的部分。3.2.3 重复代码这是“万恶之源”。如前所述需要基于代码指纹进行相似度检测。一种实用的实现是将代码块如函数标准化替换所有变量名、字面量为占位符如VAR1,LIT1标准化缩进和空格。计算标准化后代码的哈希值如 SimHash或将其转换为令牌序列。比较不同代码块的哈希值或计算令牌序列的编辑距离莱文斯坦距离。设定一个相似度阈值如 80%超过即报告“疑似重复代码”。注意事项检测重复代码非常消耗计算资源尤其是对于大型项目。一个优化策略是采用分治法和索引先快速筛选出可能相似的代码对如通过行数、首行哈希再进行精细比较。同时要允许用户排除某些目录如第三方库、生成的代码。4. 集成与工作流实践4.1 命令行工具的核心用法假设smellcheck安装后提供了一个smellcheck命令其典型用法如下# 检查当前目录下所有Python文件 smellcheck . # 检查指定文件或目录 smellcheck path/to/your/module.py # 指定配置文件 smellcheck --config .smellcheckrc . # 指定输出格式为JSON便于脚本处理 smellcheck --format json . report.json # 只检查特定的坏味道类型 smellcheck --smells “large-class, long-method” . # 设置自定义阈值例如将过长方法的行数阈值设为30 smellcheck --max-method-lines 30 .一个完整的.smellcheckrc配置文件可能长这样# .smellcheckrc exclude: - “**/migrations/**“ # 排除数据库迁移目录 - “**/tests/**“ # 排除测试目录可选有时测试代码也需要检查 - “*.min.js“ # 排除压缩后的JS文件 rules: large-class: enabled: true max-lines: 400 max-methods: 15 long-method: enabled: true max-lines: 40 max-complexity: 8 duplicate-code: enabled: true min-similarity: 0.85 min-tokens: 20 # 忽略少于20个令牌的重复 threshold: warning # 默认报告级别可以是 error, warning, info4.2 与开发流程的深度集成4.2.1 预提交钩子最及时的反馈是在代码提交之前。通过 Git 的pre-commit钩子可以在本地拦截有“坏味道”的代码。# 在 .git/hooks/pre-commit (或使用 pre-commit.com 框架) 中添加 #!/bin/sh echo “Running smellcheck...“ if ! smellcheck --staged --threshold error; then echo “Smellcheck failed! Please fix the issues before committing.“ exit 1 fi--staged参数是一个理想的功能表示只检查暂存区即将提交的文件这能极大提升检查速度。如果smellcheck原生不支持可以写脚本提取暂存区文件路径再传入。4.2.2 持续集成流水线在 CI 中运行smellcheck可以防止有问题的代码合并入主分支。通常将其作为测试阶段的一个步骤。# 例如在 GitHub Actions 的配置文件中 - name: Check for code smells run: | pip install smellcheck smellcheck . --format json --output smell-report.json # 可以设定一个基线只对新引入或恶化的坏味道报错更高级的用法是将本次运行的报告与上次或主分支的报告进行对比只对“新增”或“恶化”的坏味道发出构建失败信号而不是对历史遗留问题一刀切。这需要smellcheck支持输出带位置信息的稳定报告并能进行差异比较。4.2.3 IDE/编辑器插件最好的体验是将smellcheck集成到开发环境中实现实时、行内的提示。这需要为smellcheck开发一个 Language Server Protocol 服务器。LSP 服务器在后台运行对当前打开的文件进行增量分析并将检测到的问题以“诊断信息”的形式实时推送给 IDE如 VSCode、PyCharm在代码旁边显示波浪线或灯标。这是提升开发者体验和代码质量意识的最有效手段。5. 高级特性与定制化开发5.1 自定义“嗅觉”规则一个工具的生命力在于其可扩展性。smellcheck应该允许用户或团队根据自身业务和架构特点定义专属的“坏味道”。例如一个 Django 项目团队可能想定义一个“裸模型保存”坏味道禁止在视图或服务层直接调用Model.save()而必须通过特定的Service层方法以便统一添加审计日志或业务校验。自定义规则的实现需要smellcheck暴露一套清晰的规则定义 API。通常一个规则就是一个 Python 类或一个 JavaScript 模块它需要实现一个visit_XXX方法对应特定的AST节点类型并在其中编写检测逻辑。# 假设的 Python 自定义规则示例禁止使用特定的函数名 from smellcheck.core import BaseRule, register_rule register_rule class AvoidDeprecatedFunctionRule(BaseRule): name “avoid-deprecated-func“ description “Avoid using deprecated function ‘old_calc‘.“ def visit_Call(self, node): # 检查函数调用节点 if isinstance(node.func, ast.Name) and node.func.id ‘old_calc‘: self.report_issue( node, messagef“Function ‘{node.func.id}‘ is deprecated, use ‘new_calc‘ instead.“, severity“warning“ ) self.generic_visit(node) # 继续遍历子节点5.2 趋势分析与质量门禁单纯的单次检查价值有限。smellcheck如果能与时间维度结合进行趋势分析价值会倍增。历史趋势图在 CI 中每次运行都生成 JSON 报告并将关键指标如坏味道总数、各类坏味道数量、平均圈复杂度存储到时序数据库如 InfluxDB或直接写入一个历史文件。然后可以通过 Grafana 等工具绘制趋势图直观展示代码质量是向好还是向坏发展。质量门禁在 CI 流程中不仅检查是否有坏味道还要检查关键指标是否“恶化”。例如可以配置“本次提交不得导致‘重复代码’行数增加超过 50 行”或“平均方法圈复杂度不得高于上一版本”。这需要 CI 脚本能获取到基线数据并进行比较。技术债看板将smellcheck报告与项目管理工具如 Jira联动。可以为每个严重的坏味道自动创建一个“技术债”工单分配优先级纳入产品待办列表进行跟踪管理。5.3 误报处理与基线管理任何静态分析工具都无法避免误报。对于smellcheck这种涉及设计主观判断的工具误报率可能更高。因此提供便捷的误报抑制机制至关重要。行内注释忽略这是最精确的方式。在代码行后添加特定格式的注释告诉smellcheck忽略此处的检查。def very_long_but_necessary_method(...): # smellcheck: disablelong-method # ... 很多行必要的逻辑 ...文件级配置在文件头部添加注释忽略整个文件的特定规则或所有规则。基线文件对于历史遗留代码一次性修复所有坏味道不现实。可以生成一个“基线”报告将其中的问题标记为“已接受”。此后smellcheck只报告相对于基线“新增”的问题。这个基线文件如.smellcheck-baseline.json需要纳入版本控制。6. 实战案例为一个 Flask 项目引入 Smellcheck假设我们有一个中小型的 Flask Web 应用代码结构开始变得混乱我们决定引入smellcheck来改善代码质量。6.1 初始扫描与问题评估首先在项目根目录运行首次全面检查smellcheck app/ --format json --output initial_report.json。打开报告我们可能会发现一堆问题app/views.py中的order_processing函数长达 120 行圈复杂度 15。app/models.py中的User类有 25 个方法明显职责过重。app/utils/helpers.py和app/services/payment.py中存在两段处理折扣逻辑的代码相似度达 90%。6.2 制定修复策略与计划我们不可能一次性修复所有问题。根据报告的严重程度和修改影响范围我们制定计划高价值、低风险先解决“重复代码”问题。将两处的折扣逻辑提取到一个公共函数calculate_discount中放在一个公共模块里。这能立即减少重复且风险很小。高价值、中风险拆分过大的User类。分析其方法发现可以按职责拆分为UserAccountService处理登录、注册、UserProfileService处理个人信息、UserPermissions处理权限。这是一个重构需要仔细设计接口和更新调用方。中价值、高风险重构order_processing这个超长函数。它可能混合了参数校验、业务计算、数据库操作和邮件发送。需要将其拆分为validate_order、calculate_order_total、persist_order、notify_user等小函数。由于这是核心业务流程需要充分的单元测试覆盖。6.3 集成到开发流程在开始修复的同时我们将smellcheck集成到流程中在pyproject.toml或requirements-dev.txt中加入smellcheck依赖。创建.smellcheckrc配置文件根据项目情况调整阈值并排除migrations和tests目录。设置pre-commit钩子阻止新的坏味道引入。在 GitHub Actions 的 CI 配置中添加一个smellcheck步骤并将其设置为非阻塞步骤仅警告。等大部分历史问题修复后再将其改为阻塞步骤。6.4 效果跟踪与团队文化几周后我们通过 CI 收集的数据可以看到“重复代码”行数降为零“过长方法”的数量持续减少。团队在代码评审时也开始习惯性地引用smellcheck的报告作为讨论依据。“这个函数是不是有点长了”从一种模糊的感觉变成了一个可以量化和讨论的客观事实。smellcheck从一个外部的检查工具逐渐内化为团队共同追求代码质量文化的一部分。7. 常见问题与排查技巧7.1 误报太多干扰开发问题工具报告了大量团队认为不是问题或暂时无法修改的“坏味道”。解决调整阈值首先检查并调整.smellcheckrc中的各项阈值使其更符合团队当前的实际标准和代码现状。不要盲目追求“教科书”般的严格。使用基线为现有代码生成基线文件让工具只关注新增问题。命令如smellcheck . --generate-baseline .smellcheck-baseline.json然后在后续检查中使用--baseline参数。精确抑制对于确认为误报或需暂缓处理的特定实例使用行内注释# smellcheck: disablexxx进行精确忽略避免关闭整条规则。7.2 检查速度太慢影响提交和CI效率问题项目较大时全量检查耗时过长。解决增量检查优先使用--staged或类似功能只检查即将提交的改动文件。如果工具不支持可以自己写脚本用git diff --name-only --cached获取文件列表。并行处理检查工具是否支持并行分析-j或--jobs参数。现代多核CPU能大幅提升速度。缓存机制高级的检查工具会缓存文件的AST分析结果当文件未变更时直接使用缓存。检查是否启用缓存。目录排除确保配置文件正确排除了node_modules,vendor,__pycache__, 构建输出目录等无需检查的文件夹。7.3 规则冲突或与项目特定模式不符问题某些设计在特定框架或项目中被广泛使用但触发了通用坏味道规则。例如Django的models.Model子类可能有很多字段和方法触发了“过大的类”警告。解决自定义规则这是最根本的解决方案。为项目特有的、健康的模式编写白名单规则。例如可以写一个规则识别出 Django Model 类并为其调整“过大的类”的判定阈值。规则继承与覆盖在项目配置中可以禁用或修改从父配置如全局配置继承来的特定规则。模式识别在编写自定义规则或配置时不仅要看表面指标如行数还要结合代码的语义。例如一个类虽然方法多但如果这些方法都是简单的 getter/setter 或是由property装饰器生成的其复杂程度可能并不高。7.4 如何说服团队接受并使用挑战引入新工具总会遇到阻力尤其是这种会“挑毛病”的工具。策略从小处着手不要一开始就全量开启所有严格规则并阻塞CI。可以先作为“只报告不失败”的环节运行让团队熟悉报告内容。聚焦价值而非指责在团队内部分享时强调工具的目的是“帮助我们发现潜在的设计问题提升长期维护效率”而不是“给某个人挑错”。可以展示一个通过工具发现并重构后代码变得清晰易懂的正面案例。将修复与需求结合在规划新功能或修复bug时如果涉及smellcheck报告了问题的模块可以顺便将其重构作为任务的一部分这样重构就有了明确的业务价值驱动。赋予团队控制权让团队参与阈值和规则的制定过程。他们拥有调整规则以适应项目实际情况的权力这样工具的“主人翁”就从工具本身变成了团队。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595458.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…