Pular para o conteúdo principal

Objetos & Structs

Diferentes linguagens têm diferentes formas de representar dados estruturados. Veja como objetos, structs e construções similares funcionam em diferentes linguagens.

Criação 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);

Trabalhando com 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);

Principais Conclusões​

  • Struct vs classe vs dicionário -- Swift, Rust, Go, Zig e C usam structs como contêineres de dados primários para campos nomeados. JavaScript, Python, PHP e Ruby frequentemente usam objetos simples ou dicionários (ex: { name: "John", age: 30 }) para dados ad-hoc. Java e C# favorecem classes para dados estruturados. Use structs quando precisar de schemas fixos e verificação em tempo de compilação; use dicionários quando o schema é dinâmico ou você está construindo configuração ou dados similares a JSON.

  • Semântica de valor vs referência -- Structs de Swift e Rust são tipos de valor: let b = a copia os dados. Objetos de Java, C# e JavaScript são tipos de referência: b = a compartilha a mesma instância. Structs de Go são valores, mas são comumente passados como ponteiros (*Person) para mutação. Semântica de valor evita mutação compartilhada acidental; semântica de referência reduz cópias. Escolha tipos de valor (Swift, Rust) para comportamento previsível e segurança de threads; tipos de referência quando precisar de estado mutável compartilhado.

  • Anexação de métodos -- Rust usa impl Person { fn greet(&self) {...} }; Go usa sintaxe de receiver func (p Person) Greet() string; Zig incorpora funções dentro de structs. JavaScript e Python anexam métodos a classes. C usa funções externas como greet(&person). O padrão afeta como você organiza o código: blocos impl co-localizam lógica com dados em Rust; Go separa métodos de definições de tipo. Prefira linguagens com sintaxe de métodos ao construir modelos de domínio.

  • Alternativas leves -- @dataclass de Python, record de C# e record de Java fornecem definições compactas para contêineres de dados sem boilerplate. JavaScript e Ruby usam object literals ou hashes. Para DTOs, objetos de configuração ou payloads de API, prefira dataclasses ou records; para lógica de negócio rica, use classes ou structs completas com métodos.

  • Serialização e reflexão -- Rust e Go usam tags de struct (#[derive(Serialize)], `json:"name"`) para JSON. dataclass de Python e asdict() tornam a serialização fácil. C e Zig exigem mapeamento manual. Se você frequentemente serializa para JSON ou outros formatos, favoreça linguagens com suporte built-in (Go, Rust com serde, Python, C#); para runtime mínimo, C ou Zig podem ser aceitáveis.