心学从0开始思考关于rust的Mod组织

rust中有几大概念

package,crate,mod

package主要包括crate和cargo.toml

关于mod的用法请看如下代码

rust 复制代码
mod app {
    mod models {
        pub struct User {
            name: String,
            email: String,
        }
    }

    mod services {
        use super::models::User;

        pub fn create_user(name: &str, email: &str) -> User {
            User {
                name: name.to_string(),
                email: email.to_string(),
            }
        }
    }
}

fn main() {
    let user = app::services::create_user("Alice", "alice@example.com");
}

不难看出,mod的本质就是封装

为了更好的组织代码,防止lib.rs文件过大,可读性较差,我们把lib下的mod直接存放在lib的同级目录下并用pub mod进行声明,这样我们可以更好的对代码进行管理。

编写lib的目标就是为了给别人使用

我们可以选择树状逻辑去构造mod,做一个主mod,然后把同级方法在这个mod中声明,但是写在一个同级rs文件中。

组织架构图

web服务器的组织架构

如果我需要构建一个web服务器,那么我该选择这样去组织架构。

src/
├── main.rs
├── server
│   ├── mod.rs
│   ├── handler.rs
│   ├── router.rs
│   └── middleware.rs
├── config
│   ├── mod.rs
│   ├── defaults.rs
│   └── loader.rs
└── utils
    ├── mod.rs
    ├── logging.rs
    └── validation.rs

server

这个模块是整个Web服务器功能的核心。它可能包含以下子模块:

mod.rs: 这个文件通常包含对server模块下其他模块的引用,以及可能的公共函数或结构体,这些公共项被用来在应用程序的其他部分与服务器模块进行交互。

handler.rs: 包含处理HTTP请求的逻辑,可能定义了请求处理器和相关的处理函数。

router.rs: 负责将传入的HTTP请求路由到相应的处理器。它可能包含定义路由和处理路径匹配的逻辑。

middleware.rs: 中间件是指在处理请求之前或之后执行的代码,可以用于日志记录、认证、请求修改等任务。
config

这个模块负责处理应用程序的配置。它可能包含:

mod.rs: 包含对配置模块下其他模块的引用,以及配置相关的公共接口。

defaults.rs: 定义应用程序的默认配置值,当用户没有提供自定义配置时使用。

loader.rs: 包含加载和解析配置文件(如JSON、YAML或TOML文件)的逻辑,可能还包含将配置值转换为Rust数据结构的逻辑。
utils

这个模块包含在整个应用程序中可能会用到的辅助工具和功能:

mod.rs: 包含对utils模块下其他模块的引用,以及一些可能被应用程序其他部分直接使用的公共工具函数或类型。

logging.rs: 包含日志记录相关的功能,可能定义了日志记录器、日志格式和日志级别。

validation.rs: 包含数据验证逻辑,可能用于验证传入的请求数据或配置文件。

通过将代码按照功能划分到不同的模块中,可以提高代码的可读性、可维护性,并促进代码重用。此外,这种结构也有助于团队协作,因为不同的开发者可以专注于不同的模块而互不干扰。

简易通用组织架构

如果上述还不够清晰你也可以这样去理解这个架构:

src/
│
├── main.rs            # 程序的入口点
├── lib.rs             # 库的根模块,如果有的话
│
├── my_module/         # 模块文件夹示例
│   ├── mod.rs        # 模块声明和公共接口
│   ├── file1.rs
│   ├── file2.rs
│   └── ...
│
├── utils/             # 辅助工具模块
│   ├── utils1.rs
│   ├── utils2.rs
│   └── ...
│
└── tests/             # 测试代码
    ├── test1.rs
    ├── test2.rs
    └── ...

从0开始做架构细分

struct结构体存放

src/
├── main.rs
└──models/
    ├── mod.rs
    ├── user.rs
    ├── product.rs
    └── order.rs
rust 复制代码
// src/models/user.rs
pub struct User {
    pub id: u32,
    pub name: String,
    // 其他字段...
}

impl User {
    pub fn new(id: u32, name: String) -> Self {
        User { id, name }
    }
}
rust 复制代码
// src/models/mod.rs
pub struct User; // 这只是为了示例,实际不需要这一行,因为user.rs已经声明了pub struct User

mod user;
pub use user::User; // 这行代码允许外部代码通过 models::User 来访问 User 结构体
rust 复制代码
// src/main.rs
mod models;

fn main() {
    // 使用 models 模块中的 User 结构体
    let user = models::User::new(1, "Alice".to_string());

    // 现在可以使用 user 对象了
    println!("User ID: {}, Name: {}", user.id, user.name);
}
相关推荐
菜鸟一枚在这8 分钟前
深度解析建造者模式:复杂对象构建的优雅之道
java·开发语言·算法
阿巴~阿巴~26 分钟前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
坚定信念,勇往无前37 分钟前
Spring Boot 如何保证接口安全
spring boot·后端·安全
奔跑吧邓邓子2 小时前
【Python爬虫(34)】Python多进程编程:开启高效并行世界的钥匙
开发语言·爬虫·python·多进程
程序员侠客行2 小时前
Spring事务原理详解 三
java·后端·spring·架构
Heris992 小时前
2.22 c++练习【operator运算符重载、封装消息队列、封装信号灯集】
开发语言·c++
----云烟----2 小时前
C/C++ 中 volatile 关键字详解
c语言·开发语言·c++
yuanpan2 小时前
23种设计模式之《组合模式(Composite)》在c#中的应用及理解
开发语言·设计模式·c#·组合模式
BanLul3 小时前
进程与线程 (三)——线程间通信
c语言·开发语言·算法
十八朵郁金香3 小时前
【JavaScript】深入理解模块化
开发语言·javascript·ecmascript