Campos e visibilidade
Declarar o que o objeto tem, e decidir quem enxerga.
Campos declarados#
blueprint Contador:
valor: Integer := 0
passo: Integer := 1
action somar():
self.valor += self.passo
yield self.valorDeclarar o campo separa o que o objeto tem de como ele nasce. Antes do 4.1, para saber a forma de um objeto era preciso ler o setup inteiro.
- Sem padrão, o campo nasce
void— não é erro, é o valor que diz "ainda não tem" - Campos são herdados; o filho enxerga os do pai sem redeclarar
- A anotação de tipo é verificada pelo analisador estático
Visibilidade#
blueprint Conta:
private saldo: Float := 0.0 // só dentro de Conta
protected titular: String := "" // Conta e seus herdeiros
numero: String := "" // públicoEm DataForge, private impede de verdade — não é convenção. O acesso de fora é recusado, dizendo de onde partiu:
erro[DF0301]: 'Conta.saldo' is private and was accessed outside any blueprint.
Only 'Conta' can read it.| Quem enxerga | |
|---|---|
| (nada) | qualquer código |
protected | o blueprint e seus herdeiros |
private | só o próprio blueprint |
O que fica público é a promessa que você mantém. O resto pode mudar sem avisar ninguém — e é essa liberdade que a visibilidade compra.
Modificadores combinam#
blueprint Conta:
private static contador: Integer := 0
private action registrar_operacao(tipo):
…A ordem não importa: private static action f() e static private action f() são a mesma coisa.
Palavras contextuais#
private, protected, get, set, operator, final e abstract não são reservadas. Só têm significado dentro do corpo de um blueprint:
final := 10 // uma variável chamada 'final'
action get(chave): // uma ação chamada 'get'
yield chave
blueprint Conta:
private saldo: Float := 0.0 // aqui 'private' é modificadorFoi deliberado: get e final são nomes bons demais para tirar de quem escreve. Reservá-los globalmente quebrou três arquivos do próprio repositório na primeira tentativa.