Guia de Engenharia de Prompt: Economize Tokens com Comandos Precisos

Imagem
Foto: Google DeepMind / Pexels Resumo rápido Entenda o que são tokens e por que cada fragmento de texto impacta o custo e o processamento. Aprenda o método dos 4 pilares para criar instruções técnicas diretas e sem redundâncias. Descubra como o uso de delimitadores substitui frases explicativas longas e economiza recursos. Veja exemplos práticos de como reduzir o tamanho de um prompt em mais de 50% mantendo a precisão. Se você já sentiu que está gastando "munição" à toa ao interagir com uma IA, este guia é para você. No nosso dia a dia de desenvolvimento, tratar o prompt como uma conversa de bar é um erro comum que consome recursos preciosos. Cada palavra que enviamos para o modelo é processada e cobrada, e entender essa mecânica é a diferença entre um sobrevivente eficiente e alguém que fica sem suprimentos no meio da missão. Neste artigo, vamos mergulhar na Engenharia de Prompt com foco total em eficiência. Vamos aprender a cortar o que é irrelevante, estruturar o que é v...

Propriedades em C#: get e set para proteger a vida do personagem

Mascote do Devs na Prática de braços cruzados ao lado do título Propriedades em C#

Resumo rápido

  • Propriedade parece um campo por fora, mas por dentro tem código que controla a leitura e a escrita.
  • get roda quando alguém lê o valor; set roda quando alguém muda.
  • Dentro do set, value é o valor que tentaram colocar.
  • Propriedade automática ({ get; set; }) é o atalho quando não há regra.
  • private set deixa ler de fora, mas só a própria classe muda.

No post de classes e objetos, o personagem tinha um campo public int Vida. Funciona, mas qualquer parte do código pode fazer isto:

Mascote desconfiado diante de vida negativa e munição infinita

C#

Personagem leon = new Personagem();
leon.Vida = -500;    // nada impede
leon.Balas = 9999;   // nem isso
Console.WriteLine($"Vida: {leon.Vida} | Balas: {leon.Balas}");

class Personagem
{
    public int Vida = 100;
    public int Balas = 6;
}

Saída esperada

Vida: -500 | Balas: 9999

Vida negativa e munição infinita: um bug esperando para acontecer. As propriedades colocam um porteiro na frente do dado, que confere tudo o que entra e sai.

get e set: o porteiro do dado

Mascote explicando o get e o set de uma propriedade

Uma propriedade tem um campo private guardando o valor de verdade e dois blocos que controlam o acesso:

C#

Personagem leon = new Personagem();
leon.Vida = 150;
Console.WriteLine($"Tentou 150, ficou {leon.Vida}");

leon.Vida = -30;
Console.WriteLine($"Tentou -30, ficou {leon.Vida}");

class Personagem
{
    private int vida = 100;   // o dado de verdade, escondido

    public int Vida           // a porta de entrada
    {
        get { return vida; }
        set
        {
            if (value > 100) vida = 100;
            else if (value < 0) vida = 0;
            else vida = value;
        }
    }
}

Saída esperada

Tentou 150, ficou 100
Tentou -30, ficou 0
ParteQuando rodaNo exemplo
getquando alguém lê: leon.Vidadevolve o campo vida
setquando alguém escreve: leon.Vida = 150confere e guarda
valuedentro do seto valor que tentaram colocar (150)
campo privatenunca é acessado de foravida, com v minúsculo

Por fora, leon.Vida continua parecendo um campo comum. Quem usa a classe nem percebe a regra, mas ela nunca deixa a vida sair de 0 a 100.

Propriedade automática

Quando não existe regra nenhuma, escrever campo + get + set é trabalho à toa. A propriedade automática faz tudo em uma linha; o C# cria o campo escondido sozinho:

Mascote confiante ao lado de propriedades automáticas

C#

Personagem jill = new Personagem();
jill.Nome = "Jill";
jill.Classe = "Sobrevivente";
Console.WriteLine($"{jill.Nome}, {jill.Classe}");

class Personagem
{
    public string Nome { get; set; } = "";
    public string Classe { get; set; } = "Civil";
}

Saída esperada

Jill, Sobrevivente

O = "" e o = "Civil" no fim são valores iniciais. É o jeito mais comum de escrever dados de uma classe em C#: se depois aparecer uma regra, você troca a automática pela completa e quem usa a classe não precisa mudar nada.

private set: todo mundo lê, só a classe muda

A munição não deve ser alterada direto de fora. Ela só muda quando o personagem atira ou recarrega. O private set faz exatamente isso:

C#

Personagem leon = new Personagem();
leon.Atirar();
leon.Atirar();
Console.WriteLine($"Balas: {leon.Balas}");

leon.Recarregar();
Console.WriteLine($"Depois de recarregar: {leon.Balas}");

class Personagem
{
    public int Balas { get; private set; } = 6;

    public void Atirar()
    {
        if (Balas > 0) Balas--;
    }

    public void Recarregar()
    {
        Balas = 6;
    }
}

Saída esperada

Balas: 4
Depois de recarregar: 6

De fora, leon.Balas = 9999; agora dá erro de compilação. A única forma de mudar as balas é pelas ações do próprio personagem.

Propriedade calculada (só get)

Algumas propriedades não guardam nada: calculam o valor na hora a partir de outros dados. Elas só têm get, e o atalho => deixa tudo numa linha:

C#

Personagem claire = new Personagem { Vida = 25 };
Console.WriteLine($"Ferida? {claire.EstaFerida}");
Console.WriteLine(claire.BarraDeVida);

class Personagem
{
    public int Vida { get; set; } = 100;

    public bool EstaFerida => Vida < 50;
    public string BarraDeVida => "[" + new string('#', Vida / 10) + new string('.', 10 - Vida / 10) + "]";
}

Saída esperada

Ferida? True
[##........]

O new Personagem { Vida = 25 } é um inicializador de objeto: cria o objeto e já preenche as propriedades públicas, sem precisar de construtor.

Quando usar cada tipo

Você precisaUse
Guardar um dado sem regrapublic int X { get; set; }
Validar o valor que entrapropriedade completa com campo private e set com regra
Deixar ler, mas mudar só por métodos da classe{ get; private set; }
Valor definido só na criação{ get; init; } ou { get; } preenchido no construtor
Valor calculado a partir de outrospublic bool X => ...;

Erros comuns

1. A propriedade chamando a si mesma. Este é o clássico que trava o programa:

C#

public int Vida
{
    get { return Vida; }       // chama o get de novo, para sempre
    set { Vida = value; }      // StackOverflowException
}

O get e o set precisam usar o campo (vida, minúsculo), nunca a própria propriedade.

2. Campo público "porque é mais rápido". Comece com propriedade automática. O custo é zero e você pode colocar regra depois sem quebrar quem usa a classe.

3. Esquecer o value. Um set { vida = 100; } ignora o que tentaram colocar. Use value para pegar o valor novo.

DESAFIO

Tente resolver antes de abrir a resposta. Sobreviveu? Vá para o próximo.

  1. Escreva uma propriedade Fome com campo privado que nunca passe de 10 nem fique abaixo de 0.

    Ver resposta

    private int fome; public int Fome { get { return fome; } set { fome = Math.Clamp(value, 0, 10); } }. O Math.Clamp prende o valor entre o mínimo e o máximo.

  2. Com public int Ervas { get; private set; }, a linha jogador.Ervas = 5; fora da classe compila?

    Ver resposta

    Não. O set é privado: só métodos da própria classe podem mudar Ervas.

  3. Crie uma propriedade calculada PodeCorrer que é true quando a vida é maior que 30.

    Ver resposta

    public bool PodeCorrer => Vida > 30;

Conclusão

Com propriedades, o seu personagem se protege sozinho: a vida não fica negativa, a munição não aparece do nada e quem usa a classe nem precisa saber das regras. Isso é encapsulamento, um dos pilares da orientação a objetos.

Você já viu public e private várias vezes por aqui. No próximo post eles ganham a explicação completa.

📖 Continue a série: Modificadores de acesso em C#.

Comentários

Postagens mais visitadas deste blog

Classes e objetos em C#: criando o seu personagem do jeito certo

Console.WriteLine e Console.ReadLine em C#: conversando com o jogador

Modificadores de acesso em C#: public, private, protected e internal