> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/mutable-data.md).

# Dados Mutáveis

Saiba como lidar com dados somente leitura e mutáveis de components

Ao referenciar dados de um [component](/creator/content-creator-pt/scenes-sdk7/arquitetura/entities-components.md), você pode obter a versão mutável ou a versão somente leitura (imutável).

Você deve sempre lidar com as versões somente leitura dos dados, quando possível. Essa prática pode trazer uma melhoria muito significativa no desempenho da sua scene, em comparação com lidar sempre com versões mutáveis desses mesmos dados.

O `.get()` A função em um component retorna uma versão somente leitura (imutável) do component. Você só pode ler seus valores, mas não pode alterar nenhuma de suas propriedades.

O `.getMutable()` A função retorna uma versão do component que permite alterar seus valores. Use versões mutáveis apenas quando você planejar fazer alterações em um component; caso contrário, use sempre `get()`.

```ts
// obter uma versão somente leitura (imutável)
const immutableTransform = Transform.get(myEntity)

// o seguinte NÃO funciona:
// immutableTransform.position.y = 2

const mutableTransform = Transform.getMutable(myEntity)

// a linha a seguir ALTERA a posição da entity
mutableTransform.position.y = 2
```

Uma boa prática é iterar sobre components somente leitura para verificar valores e, então, buscar a versão mutável de um component individual apenas quando for necessária uma alteração.

```ts
// altura máxima codificada
const MAX_HEIGHT = 10

// Defina o system
function HeightLimitSystem(dt: number) {
	// iterar sobre todas as entities que possuem um component Transform
	for (const [entity] of engine.getEntitiesWith(Transform)) {
		// obter valores somente leitura
		const currentHeight = Transform.get(entity).position.y

		// comparar valores
		if (currentHeight > MAX_HEIGHT) {
			// buscar a versão mutável para fazer uma alteração
			const mutableTransform = Transform.getMutable(entity)

			// alterar o Transform
			mutableTransform.position.y = MAX_HEIGHT
		}
	}
}

// adicionar system ao engine
engine.addSystem(HeightLimitSystem)
```

No exemplo acima, um system verifica os valores somente leitura de um `Transform` component. A cada tick ele verifica se a posição *y* está acima de uma altura máxima codificada. Se a altura no Transform acabar estando acima desse limite, então, e somente então, buscamos a versão mutável do Transform. Isso pode parecer trabalho extra para a scene, mas em uma scene em que estamos verificando valores a cada tick do game loop e fazendo alterações apenas ocasionalmente, isso resulta em enormes ganhos de desempenho.

Essa prática segue os princípios de [programação orientada a dados](/creator/content-creator-pt/scenes-sdk7/arquitetura/data-oriented-programming.md). Também está sendo gradualmente adotada como uma prática padrão da indústria em jogos, devido à grande melhoria que proporciona.

{% hint style="warning" %}
**📔 Observação**: Nas versões antigas do SDK (6.x ou anteriores), os components eram sempre tratados como mutáveis. Esse padrão pode ser um pouco mais simples de aprender, mas era muito menos eficiente de executar.
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/mutable-data.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
