Skip to content

Latest commit

 

History

History
390 lines (317 loc) · 11.6 KB

2.5-slides.md

File metadata and controls

390 lines (317 loc) · 11.6 KB
title description duration
Module 2.5 - Package Management & How to structure your Rust project
Package Management & How to structure your Rust project
30 minutes

External Modules

  • Allows code to be compartmentalized
    • Organized source code management
    • Better collaboration
  • More intuitive coding
  • Quickly identify where imported code is used

Notes: External Modules giúp mã nguồn của bạn được tổ chức và quản lý tốt hơn. Dưới đây là những lợi ích cụ thể của việc sử dụng các module bên ngoài:

Cho phép mã nguồn được phân chia thành các phần nhỏ hơn:

Quản lý mã nguồn một cách tổ chức: Mã nguồn được phân chia thành các module nhỏ hơn, dễ quản lý và bảo trì. Hợp tác tốt hơn: Khi mã nguồn được chia thành nhiều phần nhỏ, các thành viên trong nhóm có thể làm việc trên các module khác nhau mà không ảnh hưởng đến phần của nhau. Lập trình trực quan hơn:

Việc sử dụng các module giúp mã nguồn rõ ràng hơn, dễ hiểu và dễ đọc hơn. Nhanh chóng xác định nơi sử dụng mã nguồn nhập khẩu:

Bạn có thể dễ dàng tìm ra các phần mã nguồn sử dụng các module được nhập khẩu, giúp việc gỡ lỗi và bảo trì trở nên đơn giản hơn. Sử dụng các module bên ngoài không chỉ giúp mã nguồn của bạn sạch sẽ và dễ quản lý, mà còn giúp cải thiện hiệu suất làm việc nhóm và nâng cao chất lượng của mã nguồn.


Module Details

  • Can have any name
  • Hierarchical organization
  • Private by default
    • Use pub keyword to make a module public
  • External modules can be a:
    • Directory
      • contain additional modules
    • File

Notes: Chi tiết về Modules

Có thể có bất kỳ tên nào (Can have any name):

Bạn có thể đặt tên cho module theo bất kỳ cách nào mà bạn thấy phù hợp với quy ước đặt tên của bạn. Tổ chức phân cấp (Hierarchical organization):

Modules có thể được tổ chức theo một cấu trúc phân cấp, cho phép chia nhỏ mã nguồn thành các phần nhỏ hơn và dễ quản lý hơn. Mặc định là riêng tư (Private by default):

Các module mặc định là riêng tư và chỉ có thể truy cập được từ bên trong module đó. Sử dụng từ khóa pub để làm cho module trở nên công khai và có thể truy cập từ các module khác. Modules bên ngoài có thể là (External modules can be a):

Thư mục (Directory): Một thư mục chứa các module bổ sung khác. Tập tin (File): Một tập tin chứa mã nguồn của module. Sử dụng modules giúp bạn quản lý mã nguồn một cách có tổ chức, dễ dàng duy trì và nâng cấp mã nguồn, đồng thời cải thiện khả năng làm việc nhóm.


Directory Structure

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

# Cargo.toml
[lib]
name = "demo"
path = "src/lib/mod.rs"

Module Declaration

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

pub mod codec;
pub mod transcode;

Module Declaration

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

pub mod codec;
pub mod transcode;
mod inner {
    // ...
}

Module Declaration

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

pub mod audio;
pub mod video;
pub mod codec;
pub mod transcode;

Module Declaration

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

pub mod audio;
pub mod video;
pub mod codec;
pub mod transcode;

Module Declaration

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

pub mod h264;
pub mod vp9;
pub mod audio;
pub mod video;
pub mod codec;
pub mod transcode;

Module Declaration

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

pub mod flac;
pub mod mp3;
pub mod h264;
pub mod vp9;
pub mod audio;
pub mod video;
pub mod codec;
pub mod transcode;

Accessing Functionality

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

// flac.rs
use super::mp3;
pub fn sample() {
    mp3::some_fn();
    super::mp3::some_fn();
    crate::codec::audio::mp3::some_fn();
    super::super::video::h264::some_fn();
}

Module Aliases

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

// flac.rs
pub fn sample() {
    use crate::transcode as tc;
    tc::some_fn();
}

Re-exporting Modules

.
├── 📦 bin
│   └── 📜 app.rs
│
└── </> lib
    ├── 📁 codec
    │   ├── 📁 audio
    │   │   ├── 📜 flac.rs
    │   │   └── 📜 mp3.rs
    │   ├── 📜 audio.rs
    │   └── 📁 video
    │       ├── 📜 h264.rs
    │       └── 📜 vp9.rs
    │   ├── 📜 video.rs
    ├── 📜 codec.rs
    ├── 📜 mod.rs
    └── 📜 transcode.rs

use crate::codec::mp3;

pub mod audio;
pub mod video;
pub use audio::mp3;

Recap

  • Modules are organized hierarchically
    • Use super to go up one level
    • Use crate to start from the top
  • The as keyword can be used to create an alias for a module
  • The mod keyword is used to declare a module
    • No curly braces for external modules
  • Modules can be re-exported with the use keyword
  • pub indicates the module may be accessed from anywhere
    • Omitting pub restricts access to only the containing module and sub-modules

Notes: Tóm tắt về Modules

Modules được tổ chức theo cấu trúc phân cấp (Modules are organized hierarchically):

Sử dụng super để đi lên một cấp (Use super to go up one level): super được sử dụng để tham chiếu đến module cha của module hiện tại. Sử dụng crate để bắt đầu từ đầu (Use crate to start from the top): crate được sử dụng để tham chiếu từ gốc của crate, thường là điểm bắt đầu của dự án. Từ khóa as có thể được sử dụng để tạo một bí danh cho module (The as keyword can be used to create an alias for a module):

Ví dụ: use std::io::Result as IoResult; Từ khóa mod được sử dụng để khai báo một module (The mod keyword is used to declare a module):

Không sử dụng dấu ngoặc nhọn cho các module bên ngoài (No curly braces for external modules): Ví dụ: mod my_module; thay vì mod my_module { } cho các module nằm trong file khác. Modules có thể được tái xuất khẩu bằng từ khóa use (Modules can be re-exported with the use keyword):

Ví dụ: pub use crate::my_module; giúp module có thể được truy cập từ bên ngoài. Từ khóa pub cho biết module có thể được truy cập từ bất kỳ đâu (pub indicates the module may be accessed from anywhere):

Bỏ qua pub giới hạn quyền truy cập chỉ trong module chứa và các sub-modules (Omitting pub restricts access to only the containing module and sub-modules): Nếu không sử dụng pub, module sẽ chỉ có thể truy cập từ trong module đó và các module con của nó. Hy vọng rằng phần tóm tắt này đã giúp bạn hiểu rõ hơn về cách tổ chức và sử dụng modules trong Rust.