Elixir学习笔记——编写文档

news2024/12/23 21:59:10

Elixir 将文档视为一等级别类。文档必须易于编写且易于阅读。在本指南中,您将学习如何在 Elixir 中编写文档,涵盖模块属性、样式实践和文档测试等结构。

Markdown

Elixir 文档是使用 Markdown 编写的。网上有很多关于 Markdown 的指南,我们推荐 GitHub 上的指南作为入门指南:基本写作和格式化语法

模块属性

Elixir 中的文档通常附加到模块属性中。让我们看一个例子:

@moduledoc 属性用于向模块添加文档。@doc 用于函数之前,为其提供文档。除了上述属性之外,@typedoc 还可用于将文档附加到作为 typespecs 一部分定义的类型,我们将在后面进行探讨。Elixir 还允许将元数据附加到文档中,方法是将关键字列表传递给 @doc 和朋友。

函数参数

在记录函数时,编译器会推断参数名称。例如:

编译器会将此参数推断为 map。有时推断结果可能不太理想,尤其是当函数包含多个子句,且每次参数都匹配不同的值时。您可以在实现之前的任何时刻仅声明函数头,从而为文档指定正确的名称:

文档元数据

Elixir 允许开发人员将任意元数据附加到文档中。这是通过将关键字列表传递给相关属性(例如 @moduledoc、@typedoc 和 @doc)来完成的。常用的元数据是 :since,它注释了在哪个版本中添加了特定模块、函数、类型或回调,如上例所示。

另一个常见的元数据是 :deprecated,它会在文档中发出警告,解释不鼓励使用它:

请注意,当开发人员调用函数时,:deprecated 键不会发出警告。如果您希望代码也发出警告,则可以使用 @deprecated 属性:

元数据可以有任何键。文档工具通常使用元数据向读者提供更多数据并丰富用户体验。

建议

编写文档时:

1. 保持文档的第一段简洁明了,通常只有一行。ExDoc 等工具使用第一行生成摘要。
2. 使用模块的全名引用模块。
3.Markdown 使用反引号 (`) 来引用代码。Elixir 在此基础上构建,在引用模块或函数名称时自动生成链接。因此,请始终使用完整的模块名称。如果您有一个名为 MyApp.Hello 的模块,请始终将其引用为 `MyApp.Hello`,而不要引用为 `Hello`。
4. 如果函数是本地的,则按名称和参数引用函数,例如 `world/1`;如果指向外部模块,则按模块、名称和参数引用函数:`MyApp.Hello.world/1`。
5. 通过添加前缀 c: 来引用 @callback,例如 `c:world/1`。
6. 通过添加前缀 t: 来引用 @type,例如 `t:values/0`。
7. 使用第二级 Markdown 标题 ## 开始新章节。第一级标题保留用于模块和函数名称。
8. 将文档放在多子句函数的第一个子句之前。文档始终按函数和元数而不是按子句进行。
9. 使用文档元数据中的 :since 键进行注释,只要有新函数或模块添加到您的 API 中即可。

Doctests

我们建议开发人员将示例包含在他们的文档中,通常放在他们自己的 ## 示例标题下。为了确保示例不会过时,Elixir 的测试框架 (ExUnit) 提供了一项名为 doctests 的功能,允许开发人员测试他们文档中的示例。Doctests 的工作原理是从文档中解析出以 iex> 开头的代码示例。您可以在 ExUnit.DocTest 上阅读有关它们的更多信息。

文档 != 代码注释

Elixir 将文档和代码注释视为不同的概念。文档是您与应用程序编程接口 (API) 用户之间的明确的说明书,无论是第三方开发人员、同事还是您未来的自己。如果模块和函数是 API 的一部分,则必须始终对其进行文档化。

代码注释面向阅读代码的开发人员。它们可用于标记改进、留下注释(例如,为什么由于库中的错误而不得不求助于解决方法)等。它们与源代码相关联:您可以完全重写函数并删除所有现有代码注释,并且它将继续保持相同的行为,而不会改变其行为或文档。

由于私有函数无法从外部访问,因此如果私有函数具有 @doc 属性,Elixir 会发出警告并丢弃其内容。但是,您可以像任何其他代码一样向私有函数添加代码注释,我们建议开发人员在他们认为这会为此类代码的读者和维护者添加相关信息时这样做。

总而言之,文档是与 API 用户的说明书,这些用户不一定有权访问源代码,而代码注释则适用于直接与源代码交互的人。通过区分这两个概念,您可以了解和表达有关软件的不同保证。

隐藏内部模块和函数

除了库作为其公共接口的一部分提供的模块和函数之外,库还可以实现不属于其 API 的重要功能。虽然这些模块和函数可以访问,但它们是库内部的,因此不应该为最终用户提供文档。

Elixir 允许开发人员通过设置 @doc false 来隐藏特定函数,或设置 @moduledoc false 来隐藏整个模块,从而方便地隐藏文档中的模块和函数。如果模块被隐藏,您甚至可以记录模块中的函数,但模块本身不会在文档中列出:

如果您不想隐藏整个模块,您可以单独隐藏函数:

但是,请记住 @moduledoc false 或 @doc false 不会将函数设为私有。上面的函数仍然可以作为 MyApp.Sample.add(1, 2) 调用。不仅如此,如果导入了 MyApp.Sample,add/2 函数也将导入到调用者中。出于这些原因,在向函数添加 @doc false 时要小心,而是使用以下两个选项之一:

1.将未记录的函数移动到带有 @moduledoc false 的模块,如 MyApp.Hidden,确保函数不会被意外暴露或导入。请记住,您可以使用 @moduledoc false 隐藏整个模块,同时仍使用 @doc 记录每个函数。工具仍将忽略该模块。

2.函数名称以一个或两个下划线开头,例如 __add__/2。以下划线开头的函数会自动被视为隐藏,但您也可以明确添加 @doc false。编译器不会导入带有前导下划线的函数,它们会向阅读代码的任何人提示其预期的私有用途。

Code.fetch_docs/1

Elixir 将文档存储在字节码中预定义的块内。加载模块时不会将文档加载到内存中,而是可以使用 Code.fetch_docs/1 函数从磁盘中的字节码中读取文档。缺点是,内存中定义的模块(例如 IEx 中定义的模块)无法访问其文档,因为它们不会将其字节码写入磁盘。

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

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

相关文章

洗护用品行业怎么做到数据安全管理?迅软DSE加密软件避免数据泄露

项目背景 公司全研发中心内部专家联合外部专家组织,充分发挥联合研究、探讨技术发展带来的重要性,产品开发、核心技术开发、工艺技术研究和创新,已形成了坚实的研发后盾,已拥有了大量的核心信息数据,为防患于未然&…

ml307A模块连接阿里云(详细版)

1、需要的信息 MQTT连接参数、订阅或发布的主题、服务器地址、端口1883 服务器地址: alFMz7jnArW.iot-as-mqtt.cn-shanghai.aliyuncs.com 注:重要的信息阿里云信息大家不要透露,写完笔记会及时删除产品及设备,大家用自己的信息…

数据库原理(数据库设计)——(3)

一、数据库设计概述 1.数据库设计的基本任务和目标 基本任务 根据用户的信息需求、数据库操作需求,设计一个结构合理、使用方便、效率高的数据库。 设计目标 满足用户的应用要求;准确模拟现实世界;能背某个DBMS(数据库管理系统…

【ARMv8/ARMv9 硬件加速系列 3.3 -- SVE LD2D 和 ST2D 使用介绍】

文章目录 SVE 多向量操作LD2D(加载)LD2D 操作说明LD2D 使用举例ST2D(存储)ST2D 使用举例ST2D 存储示例代码ld2d 和 st2d 小结SVE 多向量操作 在ARMv8/9的SVE (Scalable Vector Extension) 指令集中,st2d和ld2d指令用于向量化的存储和加载操作,具体地,它们允许同时对两个…

ezButton-按钮库

ezButton-按钮库 使用按钮时,初学者通常会遇到以下麻烦: Floating input issue 浮动输入问题Chattering issue 抖动问题Detecting the pressed and released events 检测按下和释放的事件Managing timestamp when debouncing for multiple buttons 在多…

【乳业巨擘·数字革命先锋】光明乳业:上市公司科技蜕变,搭贝低代码引领未来新纪元

在这个由科技编织的未来世界里,光明乳业股份有限公司以巨人之姿,傲立于乳业之巅,以其无与伦比的胆识与魄力,引领了一场震撼业界的数字化革命。与低代码领域的创新领袖——搭贝的强强联合,不仅标志着光明乳业在数字化转…

通用视频模板解决方案,视频生产制作更轻松

对于许多企业来说,视频制作往往面临着技术门槛高、制作周期长、成本投入大等难题。为了解决这些问题,美摄科技凭借其领先的跨平台视频技术和完善的工具链,推出了面向企业的视频通用模板解决方案,为企业视频制作带来了全新的革命性…

【C#项目】使用百度ai人脸库实现人脸识别

1. 项目介绍 本项目利用百度AI的人脸识别技术,开发了一个可以进行人脸识别的应用程序。项目涉及网络连接、文件处理、图像处理、数据库管理及音视频处理等多个技术领域。本文将详细介绍项目的整体架构和实现过程。 2. 技术栈 本项目使用了以下技术: …

xxe漏洞学习

一、什么是xxe漏洞 XXE就是XML外部实体注入,当允许引用外部实体时, XML数据在传输中有可能会被不法分子被修改,如果服务器执行被恶意插入的代码,就可以实现攻击的目的攻击者可以通过构造恶意内容,就可能导致任意文件读…

C#聊天室客户端完整③

窗体 进入聊天室界面(panel里面,label,textbox,button): 聊天界面(flowLayoutPanel(聊天面板)): 文档大纲(panel设置顶层(登录界面),聊天界面在底层) 步骤:设置进入聊天室→输入聊天→右边自己发送的消息→左边别人发的消息 MyClient.cs(进入聊天室类) …

MySQL Explain 关键字详解

概述 explain 关键字可以模拟执行 sql 查询语句,输出执行计划,分析查询语句的执行性能 使用方式如下:explain sql explain select * from t1执行计划各字段含义 1. id 如果 id 序号相同,从上往下执行如果 id 序号不同&#…

项目实施文档(Word原件项目直接套用)

软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施 获取方式:本文末个人名片直接获取。

关于el-date-picker组件,如何隐藏时间组件底部清空按钮

工作中可能会遇到el-date-picker组件隐藏时间组件底部清空按钮 分为两种 : 如果你想要实现全部的el-date-picker的清空隐藏 和 某一个页面的el-date-picker的清空隐藏 1 全局隐藏 步骤1:在element-ui.scss中添加如下代码: .el-picker-pane…

Excel VLOOKUP 使用记录

Excel VLOOKUP 使用记录 VLOOKUP简单使用 VLOOKUP(lookup_value,table_array,col_index_num,[range-lookup]) 下面是excel对VLOOKUP 的解释 lookup_value(查找值):要匹配查找的值 table_array(数据表)&#xff1…

想上币的项目方怎么去选择交易所

在区块链和加密货币蓬勃发展的今天,许多项目方都渴望通过交易所上线其代币,以扩大影响力、提升流动性和市场认可度。然而,选择合适的交易所并非易事,它关乎项目的未来发展和市场地位。那么,对于有上币意向的项目来说&a…

从0进入微服务需要了解的基础知识

文章目录 系统架构演化过程为什么要了解系统架构的演化过程技术发展认知技术选型与创新 演变过程单体架构分层-分布式集群微服务 分布式\集群\微服务 微服务中的核心要素-拆分原则项目拆分与复杂度微服务的拆分维度有哪些小结 微服务中的核心要素服务化进行拆分后一定是微服务&…

Flink 窗口函数

一、Window 概述 Flink 流式计算是一种被设计用于处理无限数据集的数据处理引擎,而无限数据集是指一种不断增长的本质上无限的数据集,而 window 是一种切割无线数据为有限块进行处理的手段。 二、Window 分类 Window 可以分为两类: Count…

利用Python语言调用讯飞星火认知大模型接口实战指南

什么是API接口 API(应用程序编程接口)是一组规则,允许不同的软件系统相互通信。通过API,开发者可以访问外部系统的功能和数据,而无需了解其内部实现。 API接口就像一座桥梁,连接应用程序和服务。例如&…

车企高管组团“出道”,汽车营销已经Next level了?

汽车进入了“卷”老板、“卷”高管的时代! 谁能想到,雷军凭一己之力,在一定程度上重塑了汽车的竞争策略。价格战之外,车市又开启了流量之战。 云略曾在《雷军20天吸粉500w!……》一文中,提到继雷军之后&…

敏捷开发时代,彻底结束了

最近,我收到一位读者的私信,他最近“内耗”得非常厉害,他可能一时兴起把我的私信当作了吐槽箱。 他们公司一直实行敏捷的管理模式,复盘发现了一个问题:发布与迭代具有强相关性,一个迭代就发布一次&#xf…