DEV Community

Cover image for Programação Orientada a Objetos: Encapsulamento
Fabiano Santos Florentino
Fabiano Santos Florentino

Posted on

Programação Orientada a Objetos: Encapsulamento

Encapsulamento

é um dos princípios fundamentais da programação orientada a objetos (POO). O encapsulamento consiste em ocultar os detalhes internos de um objeto e expor apenas a interface necessária. Essa prática tem como objetivo proteger o estado interno do objeto contra acessos diretos e não autorizados, promovendo a modularidade e facilitando a manutenção do código.

Principais Conceitos

Atributos Privados: Variáveis que armazenam o estado interno de um objeto e são acessíveis apenas dentro da classe onde são definidas. Em linguagens como Java e Python, usa-se o modificador de acesso private ou o prefixo _ para denotar atributos privados.

Métodos Públicos: Funções que permitem a interação com o objeto e seu estado de forma controlada. Estes métodos expõem a funcionalidade do objeto sem revelar os detalhes de implementação.

Getters e Setters: Métodos específicos para acessar e modificar atributos privados. Um getter permite ler o valor de um atributo privado, enquanto um setter permite modificá-lo.

Como funciona em Go

Campos e Funções não Exportados: Em Go, se um campo ou uma função começa com uma letra minúscula, ele é acessível apenas dentro do pacote onde foi definido. Esse é o modo como Go implementa encapsulamento.

Campos e Funções Exportados: Se um campo ou uma função começa com uma letra maiúscula, ele é exportado e pode ser acessado de outros pacotes.

package main

import "fmt"

// Conta é uma estrutura que representa uma conta bancária.
type Conta struct {
    numero int
    saldo  float64
}

// Depositar é um método que adiciona um valor ao saldo da conta.
func (c *Conta) Depositar(valor float64) {
    c.saldo += valor
}

// Sacar é um método que subtrai um valor do saldo da conta.
func (c *Conta) Sacar(valor float64) {
    c.saldo -= valor
}

// Saldo é um método que retorna o saldo da conta.
func (c *Conta) Saldo() float64 {
    return c.saldo
}

func main() {
    // Cria uma nova conta com saldo inicial de 100.0.
    conta := Conta{numero: 123, saldo: 100.0}

    // Tell, Don't Ask - Princípio de design de software.
    // Depositar e Sacar são métodos que informam a conta sobre as ações a serem realizadas.
    conta.Depositar(50.0)
    conta.Sacar(25.0)

    fmt.Println(conta.Saldo())
}
Enter fullscreen mode Exit fullscreen mode
encampulamento ➜ go run main.go
125
Enter fullscreen mode Exit fullscreen mode

Neste exemplo, a estrutura Conta possui dois campos privados (numero e saldo) e três métodos públicos (Depositar, Sacar e Saldo). Dessa forma, o estado interno da conta é protegido contra acessos diretos e não autorizados, garantindo que as operações de depósito e saque sejam realizadas de forma segura.

Tell, Don't Ask

Tell, Don't Ask é um princípio de design de software que sugere que os objetos devem ser responsáveis por realizar ações e não por fornecer informações. Em vez de perguntar a um objeto sobre seu estado interno e tomar decisões com base nesse estado, o princípio Tell, Don't Ask recomenda que o objeto seja informado sobre o que deve ser feito e tome as ações necessárias.

Afirmando o Princípio

No mesmo exemplo acima, a estrutura Conta possui três métodos públicos (Depositar, Sacar e Saldo) que permitem interagir com o objeto sem acessar diretamente seu estado interno. Dessa forma, o princípio Tell, Don't Ask é seguido, pois o objeto Conta é informado sobre as ações a serem realizadas (depósito e saque) e toma as ações necessárias.

Conclusão

O encapsulamento é um conceito fundamental da programação orientada a objetos que visa proteger o estado interno de um objeto contra acessos diretos e não autorizados. Em Go, o encapsulamento é implementado por meio de campos e funções não exportados, que são acessíveis apenas dentro do pacote onde foram definidos. Dessa forma, é possível garantir a integridade e a segurança do objeto, promovendo a modularidade e facilitando a manutenção do código.

Projeto

Github

Agradecimento

Deixo aqui meu agradecimento ao @moretoend (fala comigo!), como sempre ajudando a melhorar o conteúdo dos meus artigos, e nesse em especial, me ajudando a entender melhor o conceito de Tell, Don't Ask. vlw!

Referências

Top comments (0)