|
| 1 | +--- |
| 2 | +title: 'Cargo' |
| 3 | +description: '' |
| 4 | +draft: true |
| 5 | +data: |
| 6 | + type: 'custom' |
| 7 | + topicLevel: 'start' |
| 8 | + position: |
| 9 | + x: 200 |
| 10 | + y: 750 |
| 11 | + sourcePosition: |
| 12 | + error-handling: 'right' |
| 13 | + targetPosition: |
| 14 | + traits: 'bottom' |
| 15 | +--- |
| 16 | +# Organizando Proyectos en Rust: Módulos y Visibilidad |
| 17 | + |
| 18 | +Cuando desarrollamos en Rust, mantener el código organizado es esencial para la escalabilidad y la mantenibilidad. Rust ofrece un sistema de módulos flexible que nos ayuda a dividir el código en componentes más manejables. En este artículo exploraremos cómo crear y gestionar módulos, controlar su visibilidad, y estructurar proyectos de manera eficiente, abordando las prácticas más recomendadas en la comunidad. |
| 19 | + |
| 20 | +--- |
| 21 | + |
| 22 | +## Introducción a los módulos |
| 23 | + |
| 24 | +Los módulos en Rust agrupan código relacionado bajo un espacio de nombres, permitiendo: |
| 25 | + |
| 26 | +- **Organización lógica:** Divide el código en archivos o directorios. |
| 27 | +- **Encapsulación:** Restringe qué partes del código son accesibles externamente. |
| 28 | +- **Reutilización:** Facilita la modularidad y el uso compartido de código. |
| 29 | + |
| 30 | +Un módulo puede contener funciones, estructuras, enumeraciones, constantes e incluso otros módulos. |
| 31 | + |
| 32 | +--- |
| 33 | + |
| 34 | +## Crear y gestionar módulos |
| 35 | + |
| 36 | +### Módulos en el mismo archivo |
| 37 | +La forma más sencilla de declarar un módulo es hacerlo directamente en el archivo: |
| 38 | + |
| 39 | +```rust |
| 40 | +mod math { |
| 41 | + pub fn add(a: i32, b: i32) -> i32 { |
| 42 | + a + b |
| 43 | + } |
| 44 | +} |
| 45 | +``` |
| 46 | + |
| 47 | +Luego accedes a los elementos públicos con el prefijo del módulo: |
| 48 | +```rust |
| 49 | +fn main() { |
| 50 | + let sum = math::add(2, 3); |
| 51 | + println!("Suma: {}", sum); |
| 52 | +} |
| 53 | +``` |
| 54 | + |
| 55 | +### Módulos en archivos separados |
| 56 | +Para mantener el código limpio, puedes mover los módulos a archivos independientes: |
| 57 | + |
| 58 | +En `main.rs`: |
| 59 | +```rust |
| 60 | +mod math; |
| 61 | + |
| 62 | +fn main() { |
| 63 | + let sum = math::add(5, 7); |
| 64 | + println!("Suma: {}", sum); |
| 65 | +} |
| 66 | +``` |
| 67 | + |
| 68 | +En `math.rs`: |
| 69 | +```rust |
| 70 | +pub fn add(a: i32, b: i32) -> i32 { |
| 71 | + a + b |
| 72 | +} |
| 73 | +``` |
| 74 | + |
| 75 | +### Módulos como directorios |
| 76 | +Si un módulo incluye submódulos, puedes organizarlo en un directorio con un archivo `mod.rs` o estructurarlo usando archivos con el mismo nombre que los submódulos. |
| 77 | + |
| 78 | +Estructura de ejemplo: |
| 79 | +``` |
| 80 | +src/ |
| 81 | +├── main.rs |
| 82 | +├── math/ |
| 83 | +│ ├── mod.rs |
| 84 | +│ ├── add.rs |
| 85 | +│ └── multiply.rs |
| 86 | +``` |
| 87 | + |
| 88 | +En `math/mod.rs`: |
| 89 | +```rust |
| 90 | +pub mod add; |
| 91 | +pub mod multiply; |
| 92 | +``` |
| 93 | + |
| 94 | +--- |
| 95 | + |
| 96 | +## Control de visibilidad |
| 97 | + |
| 98 | +Por defecto, los módulos y sus elementos son privados. Para hacerlos accesibles, usa `pub`. |
| 99 | + |
| 100 | +```rust |
| 101 | +mod shapes { |
| 102 | + pub struct Rectangle { |
| 103 | + pub width: u32, |
| 104 | + pub height: u32, |
| 105 | + } |
| 106 | + |
| 107 | + impl Rectangle { |
| 108 | + pub fn area(&self) -> u32 { |
| 109 | + self.width * self.height |
| 110 | + } |
| 111 | + } |
| 112 | +} |
| 113 | +``` |
| 114 | + |
| 115 | +El acceso desde otro módulo o función será así: |
| 116 | +```rust |
| 117 | +fn main() { |
| 118 | + let rect = shapes::Rectangle { width: 10, height: 20 }; |
| 119 | + println!("Área: {}", rect.area()); |
| 120 | +} |
| 121 | +``` |
| 122 | + |
| 123 | +--- |
| 124 | + |
| 125 | +## Estructuración recomendada para proyectos Rust |
| 126 | + |
| 127 | +La organización de un proyecto depende de su propósito. Aquí hay patrones comunes: |
| 128 | + |
| 129 | +### 1. **Proyectos ejecutables simples** |
| 130 | +Los proyectos pequeños suelen tener un único archivo `main.rs`: |
| 131 | + |
| 132 | +``` |
| 133 | +src/ |
| 134 | +└── main.rs |
| 135 | +``` |
| 136 | + |
| 137 | +### 2. **Proyectos ejecutables grandes** |
| 138 | +A medida que crece, puedes mover lógica a módulos: |
| 139 | + |
| 140 | +``` |
| 141 | +src/ |
| 142 | +├── main.rs |
| 143 | +├── config.rs |
| 144 | +├── handlers.rs |
| 145 | +└── utils.rs |
| 146 | +``` |
| 147 | + |
| 148 | +En `main.rs`: |
| 149 | +```rust |
| 150 | +mod config; |
| 151 | +mod handlers; |
| 152 | +mod utils; |
| 153 | +``` |
| 154 | + |
| 155 | +### 3. **Bibliotecas** |
| 156 | +Las bibliotecas usan un archivo `lib.rs` para exponer su API pública: |
| 157 | + |
| 158 | +``` |
| 159 | +src/ |
| 160 | +├── lib.rs |
| 161 | +└── utils.rs |
| 162 | +``` |
| 163 | + |
| 164 | +En `lib.rs`: |
| 165 | +```rust |
| 166 | +pub mod utils; |
| 167 | +``` |
| 168 | + |
| 169 | +### 4. **Híbridos (ejecutable + biblioteca)** |
| 170 | +Un proyecto puede tener `main.rs` para la aplicación y `lib.rs` para lógica reutilizable: |
| 171 | + |
| 172 | +``` |
| 173 | +src/ |
| 174 | +├── lib.rs |
| 175 | +└── main.rs |
| 176 | +``` |
| 177 | + |
| 178 | +En `main.rs`: |
| 179 | +```rust |
| 180 | +use mycrate::utils::some_function; |
| 181 | + |
| 182 | +fn main() { |
| 183 | + some_function(); |
| 184 | +} |
| 185 | +``` |
| 186 | + |
| 187 | +En `lib.rs`: |
| 188 | +```rust |
| 189 | +pub mod utils { |
| 190 | + pub fn some_function() { |
| 191 | + println!("Función compartida"); |
| 192 | + } |
| 193 | +} |
| 194 | +``` |
| 195 | + |
| 196 | +### 5. **Proyectos con múltiples binarios** |
| 197 | +Usa un directorio `src/bin/` para incluir otros ejecutables: |
| 198 | + |
| 199 | +``` |
| 200 | +src/ |
| 201 | +├── main.rs |
| 202 | +├── lib.rs |
| 203 | +└── bin/ |
| 204 | + ├── tool1.rs |
| 205 | + └── tool2.rs |
| 206 | +``` |
| 207 | + |
| 208 | +--- |
| 209 | + |
| 210 | +## Puntos de entrada: `main.rs` y `lib.rs` |
| 211 | + |
| 212 | +### `main.rs` |
| 213 | +Es el punto de entrada de los ejecutables. Aquí defines la lógica inicial de tu programa. |
| 214 | + |
| 215 | +### `lib.rs` |
| 216 | +Sirve como punto de entrada para bibliotecas. Aquí defines qué módulos y funciones serán públicos para los usuarios de la biblioteca. |
| 217 | + |
| 218 | +### Coexistencia de `main.rs` y `lib.rs` |
| 219 | +En proyectos híbridos, `lib.rs` puede contener la lógica principal reutilizable y `main.rs` consumirla: |
| 220 | + |
| 221 | +En `lib.rs`: |
| 222 | +```rust |
| 223 | +pub fn greet(name: &str) { |
| 224 | + println!("Hola, {}!", name); |
| 225 | +} |
| 226 | +``` |
| 227 | + |
| 228 | +En `main.rs`: |
| 229 | +```rust |
| 230 | +use mycrate::greet; |
| 231 | + |
| 232 | +fn main() { |
| 233 | + greet("Mundo"); |
| 234 | +} |
| 235 | +``` |
| 236 | + |
| 237 | +--- |
| 238 | + |
| 239 | +## Buenas prácticas y convenciones |
| 240 | + |
| 241 | +1. **Divide y vencerás:** Usa módulos para separar responsabilidades. |
| 242 | +2. **Restricción de visibilidad:** Haz públicos solo los elementos necesarios. |
| 243 | +3. **Nombres consistentes:** Usa nombres descriptivos para módulos y archivos. |
| 244 | +4. **Centraliza lo común:** Mueve funciones reutilizables a `lib.rs`. |
| 245 | + |
| 246 | +--- |
| 247 | + |
| 248 | +## Configuraciones adicionales para módulos |
| 249 | + |
| 250 | +- **Agrupación lógica:** Usa directorios para módulos con múltiples submódulos. |
| 251 | +- **Macros compartidas:** Crea un módulo separado para macros reutilizables, por ejemplo, `src/macros.rs`. |
| 252 | + |
| 253 | +--- |
| 254 | + |
| 255 | +## Conclusión |
| 256 | + |
| 257 | +Organizar proyectos con módulos en Rust no solo mejora la claridad del código, sino que también facilita su escalabilidad. Ya sea que trabajes en un ejecutable, una biblioteca o ambos, seguir estas prácticas te ayudará a mantener un código limpio, reutilizable y fácil de entender. ¡Experimenta con estas técnicas y lleva tus proyectos al siguiente nivel! 🚀 |
0 commit comments