Saltar al contenido principal

Constantes y Enums

Las constantes y enumeraciones ayudan a crear código legible y mantenible. Aquí se muestra cómo los diferentes lenguajes las manejan.

Constantes​

// const (block-scoped, not deeply immutable)
const PI = 3.14159;
const MAX_SIZE = 100;
const API_URL = "https://api.example.com";

// const objects can be mutated!
const config = { debug: true };
config.debug = false; // OK!

// Object.freeze (shallow immutable)
const frozen = Object.freeze({ a: 1, b: 2 });
// frozen.a = 3; // Silently fails (or error in strict)

// Deep freeze (recursive)
function deepFreeze(obj) {
Object.freeze(obj);
Object.values(obj).forEach(v => {
if (typeof v === 'object') deepFreeze(v);
});
return obj;
}

// Enum pattern (no native enums in JS)
const Status = Object.freeze({
ACTIVE: 'active',
INACTIVE: 'inactive',
BANNED: 'banned',
});

Puntos Clave​

  • Inmutabilidad real -- const de Rust, const de Zig y constexpr de C++ proporcionan constantes en tiempo de compilación que no pueden ser cambiadas. const de JavaScript solo previene la reasignación: const obj = {}; obj.x = 1 es permitido. Python no tiene constantes reales; PI = 3.14 puede ser reasignado. Usa Object.freeze() en JavaScript o typing.Final en Python para inmutabilidad basada en convención, pero estas no se aplican tan estrictamente como en Rust o Zig. Para máxima seguridad, prefiere lenguajes con constantes impuestas por el compilador.

  • Tipos de datos algebraicos -- Los enums de Rust y Swift pueden llevar valores asociados, habilitando tipos suma. Por ejemplo, enum Shape { Circle(f64), Rectangle(f64, f64) } en Rust permite que cada variante contenga datos. Las uniones etiquetadas de Zig y enum Shape { case circle(radius: Double) } de Swift funcionan de manera similar. Esto permite pattern matching exhaustivo y evita estados inválidos. Al modelar máquinas de estado o variantes con datos, prefiere Rust, Swift o Zig sobre enums de enteros simples.

  • Capacidades de enums por lenguaje -- Los enums de Java y C# soportan métodos y campos: enum Color { RED("#FF0000"); private String hex; Color(String h) { hex = h; } }. Go usa iota para enums enteros: const (Red = iota; Green; Blue). Los enums de C son enteros simples sin seguridad de tipos; contaminan el espacio de nombres global. PHP 8.1+ y el módulo enum de Python proporcionan enums de primera clase. Cuando necesites enums con comportamiento o seguridad de tipos, prefiere Java, C#, Rust, Swift o Python; para flags simples, C o iota de Go pueden ser suficientes.

  • Definición de constantes -- C usa #define para constantes del preprocesador; C++ agrega const y constexpr. Java y C# usan static final; Go usa const; Rust usa const (tiempo de compilación) o static (tiempo de ejecución, instancia única). Python y Ruby dependen de convenciones de nomenclatura (UPPER_CASE). Para evaluación en tiempo de compilación e inlining, prefiere constexpr (C++) o const (Rust, Zig); para constantes en tiempo de ejecución que se calculan una vez, usa static en Rust o static readonly en C#.