quarta-feira, 7 de abril de 2021

Definindo Módulos para Controle de Escopo e Privacidade

Nesta seção, falaremos sobre módulos e outras partes do sistema de módulos, nomeadamente caminhos que permitem nomear itens; a palavra-chave use que traz um caminho ao escopo; e a palavra-chave pub para tornar os itens públicos. Também discutiremos a palavra-chave as, os pacotes externos e o operador glob. Por enquanto, vamos nos concentrar nos módulos!

Os módulos nos permitem organizar o código dentro de um crate em grupos para facilitar a leitura e reutilização. Os módulos também controlam a privacidade dos itens, que é se um item pode ser usado por código externo (público) ou é um detalhe de implementação interno e não está disponível para uso externo (privado).

Como exemplo, vamos escrever um crate de biblioteca que fornece a funcionalidade de um restaurante. Definiremos as assinaturas das funções, mas deixaremos seus corpos vazios para nos concentrar na organização do código, em vez de realmente implementar um restaurante no código.

Na indústria de restaurantes, algumas partes de um restaurante são chamadas de frente da casa e outras de fundos. A frente da casa é onde os clientes estão; é onde os anfitriões acomodam os clientes, os servidores anotam os pedidos e os pagamentos e os bartenders fazem as bebidas. A parte de trás da casa é onde os chefs e cozinheiros trabalham na cozinha, os lava-louças limpam e os gerentes fazem o trabalho administrativo.

Para estruturar nosso crate da mesma maneira que um restaurante real funciona, podemos organizar as funções em módulos aninhados. Crie uma nova biblioteca nomeada restaurant executando cargo new --lib restaurant; em seguida, coloque o código da Listagem 7-1 em src / lib.rs para definir alguns módulos e assinaturas de função.

Nome do arquivo: src / lib.rs

mod frente_da_casa {
    mod hospedagem {
        fn adicionar_a_lista_de_espera() {}

        fn sentar_a_mesa() {}
    }

    mod servindo {
        fn anotar_pedido() {}

        fn servir_pedido() {}

        fn receber_pagamento() {}
    }
}

Listagem 7-1: Um módulo frente_da_casa contendo outros módulos que contêm funções

Definimos um módulo começando com a palavra-chave mod e, em seguida, especificamos o nome do módulo (neste caso, frente_da_casa) e colocamos chaves ao redor do corpo do módulo. Dentro dos módulos, podemos ter outros módulos, como neste caso com os módulos hospedagem e servindo. Os módulos também podem conter definições para outros itens, como structs, enums, constantes, características ou - como na Listagem 7-1 - funções.

Usando módulos, podemos agrupar definições relacionadas e nomear por que estão relacionadas. Os programadores que usam esse código teriam mais facilidade em encontrar as definições que desejam usar, porque eles poderiam navegar no código com base nos grupos, em vez de ter que ler todas as definições. Os programadores que adicionam novas funcionalidades a este código sabem onde colocar o código para manter o programa organizado.

Anteriormente, mencionamos que src / main.rs e src / lib.rs são chamados de raízes de crates. O motivo do nome é que o conteúdo de qualquer um desses dois arquivos forma um módulo nomeado crate na raiz da estrutura do módulo do crate, conhecido como árvore de módulos.

A Listagem 7-2 mostra a árvore do módulo para a estrutura da Listagem 7-1.

crate
 └── frente_da_casa
     ├── hospedagem
     │   ├── adicionar_a_lista_de_espera
     │   └── sentar_a_mesa
     └── servindo
         ├── anotar_pedido
         ├── servir_pedido
         └── receber_pagamento

Listagem 7-2: A árvore do módulo para o código na Listagem 7-1

Esta árvore mostra como alguns dos módulos se aninham uns nos outros (por exemplo, hospedagem aninhado dentro de frente_da_casa). A árvore também mostra que alguns módulos são irmãos entre si, o que significa que eles estão definidos no mesmo módulo (hospedagem e servindo são definidos dentro de frente_da_casa). Para continuar a metáfora da família, se o módulo A está contido dentro do módulo B, dizemos que o módulo A é filho do módulo B e que o módulo B é o pai do módulo A. Observe que toda a árvore do módulo está enraizada no módulo implícito denominado crate.

A árvore de módulos pode lembrá-lo da árvore de diretórios do sistema de arquivos em seu computador; esta é uma comparação muito apropriada! Assim como os diretórios em um sistema de arquivos, você usa módulos para organizar seu código. E, assim como os arquivos em um diretório, precisamos encontrar nossos módulos.

Traduzido por Acervo Lima. O original pode ser acessado aqui.

Licença

0 comentários:

Postar um comentário