Saltar al contenido principal

Objetos y Structs

Diferentes lenguajes tienen diferentes formas de representar datos estructurados. Así es como funcionan los objetos, structs y construcciones similares en diferentes lenguajes.

Creación de Objetos/Structs​

// Object literal
const person = {
name: "John",
age: 30,
greet: function() {
return "Hello, " + this.name;
}
};

// Access properties
person.name;
person["age"];

// Add properties
person.city = "NYC";

// Object methods
Object.keys(person);
Object.values(person);

Trabajando con Objetos​

// Object destructuring
const {name, age} = person;

// Spread operator
const updated = {...person, age: 31};

// Object methods
Object.assign({}, person, {city: "NYC"});
Object.freeze(person); // Immutable
Object.seal(person); // Prevent adding/deleting
Object.keys(person); // ["name", "age"]
Object.values(person); // ["John", 30]
Object.entries(person); // [["name", "John"], ["age", 30]]

// Check property exists
"name" in person; // true
person.hasOwnProperty("name"); // true

// Delete property
delete person.age;

// Iterate over properties
for (const key in person) {
console.log(key, person[key]);
}
Object.keys(person).forEach(key => {
console.log(key, person[key]);
});

// Merge objects
const merged = Object.assign({}, person, {city: "NYC"});
const merged2 = {...person, ...{city: "NYC"}};

// Compare objects
JSON.stringify(obj1) === JSON.stringify(obj2);

// Check if empty
Object.keys(person).length === 0;

// JSON
JSON.stringify(person);
JSON.parse(jsonString);

Puntos Clave​

  • Struct vs clase vs diccionario -- Swift, Rust, Go, Zig y C usan structs como contenedores de datos principales para campos con nombre. JavaScript, Python, PHP y Ruby a menudo usan objetos planos o diccionarios (e.g., { name: "John", age: 30 }) para datos ad-hoc. Java y C# favorecen las clases para datos estructurados. Usa structs cuando necesites esquemas fijos y verificación en tiempo de compilación; usa diccionarios cuando el esquema sea dinámico o estés construyendo configuración o datos tipo JSON.

  • Semántica de valor vs referencia -- Los structs de Swift y Rust son tipos por valor: let b = a copia los datos. Los objetos de Java, C# y JavaScript son tipos por referencia: b = a comparte la misma instancia. Los structs de Go son valores pero comúnmente se pasan como punteros (*Person) para mutación. La semántica de valor evita mutación compartida accidental; la semántica de referencia reduce las copias. Elige tipos por valor (Swift, Rust) para comportamiento predecible y seguridad en hilos; tipos por referencia cuando necesites estado mutable compartido.

  • Asociación de métodos -- Rust usa impl Person { fn greet(&self) {...} }; Go usa sintaxis de receptor func (p Person) Greet() string; Zig embebe funciones dentro de structs. JavaScript y Python adjuntan métodos a clases. C usa funciones externas como greet(&person). El patrón afecta cómo organizas el código: los bloques impl co-localizan la lógica con los datos en Rust; Go separa los métodos de las definiciones de tipo. Prefiere lenguajes con sintaxis de métodos al construir modelos de dominio.

  • Alternativas ligeras -- El @dataclass de Python, el record de C# y el record de Java proporcionan definiciones compactas para contenedores de datos sin código repetitivo. JavaScript y Ruby usan literales de objetos o hashes. Para DTOs, objetos de configuración o payloads de API, prefiere dataclasses o records; para lógica de negocio rica, usa clases completas o structs con métodos.

  • Serialización y reflexión -- Rust y Go usan etiquetas de struct (#[derive(Serialize)], `json:"name"`) para JSON. El dataclass de Python y asdict() facilitan la serialización. C y Zig requieren mapeo manual. Si serializas frecuentemente a JSON u otros formatos, favorece lenguajes con soporte incorporado (Go, Rust con serde, Python, C#); para runtime mínimo, C o Zig pueden ser aceptables.