Incorporar as regras de empréstimo ao objeto

JavaBeginner
Pratique Agora

Introdução

Um balcão comunitário empresta ferramentas físicas a membros cadastrados. Duas furadeiras podem ter o mesmo nome e pertencer a empréstimos diferentes. Uma ferramenta em manutenção deve continuar indisponível, e somente o membro registrado no empréstimo pode devolver uma ferramenta emprestada.

Você incorporará essas regras a um objeto Java e usará um pequeno laço de comandos preparado. Este primeiro laboratório mantém as alterações na memória; o próximo ensina a salvá-las. Você já deve conhecer classes, métodos, campos privados, listas e exceções básicas de Java. Tempo de leitura e prática estimado pelo autor: 45 minutos.

Emprestar uma ferramenta sem perder sua identidade

Nesta etapa, você executará um empréstimo normal, lerá o objeto preparado e acrescentará a pequena regra que o protege de um segundo empréstimo.

Abra a aba Terminal. cd seleciona a pasta do projeto; todos os comandos posteriores deste laboratório partem dela. Se uma linha digitada incorretamente ainda não foi executada, pressione Ctrl+U para apagá-la e digite novamente. Se aparecer “file not found”, execute este cd outra vez em vez de redefinir o ambiente.

cd /home/labex/project/tool-library

A aplicação preparada já compila. javac é o compilador Java, -encoding UTF-8 seleciona a codificação do código-fonte, -d out coloca as classes compiladas em out e *.java seleciona os arquivos-fonte Java desta pasta.

javac -encoding UTF-8 -d out *.java

Uma compilação bem-sucedida não imprime nada. Após editar, compile com sucesso antes de cada inicialização; caso contrário, Java poderá executar classes antigas. java inicia o programa, -Dfile.encoding=UTF-8 seleciona a codificação do texto, -cp out seleciona as classes compiladas e Desk é a classe de entrada. desk.tsv fornece os registros; --memory desativa o salvamento neste laboratório.

java -Dfile.encoding=UTF-8 -cp out Desk desk.tsv --memory

Agora você está dentro do programa do balcão, e não no shell. Digite cada linha e pressione Enter:

borrow A11 M01
list
quit

Você deve ver Accepted: A11 BORROWED M01. A12 é outra Drill e continua AVAILABLE: o ID identifica uma ferramenta física, enquanto o nome pode se repetir. quit volta ao shell. Esse empréstimo normal funciona antes do reparo, mas o código ainda não impede um segundo empréstimo da mesma ferramenta. Como a execução usou --memory, o arquivo original permanece inalterado e a próxima execução começa do estado inicial.

Leia o código-fonte preparado com cat, que exibe um arquivo sem editá-lo:

cat Tool.java

Uma ferramenta armazena um id estável, um name de exibição, state, borrower e note. Um enum tem um conjunto fixo de valores nomeados: AVAILABLE significa que ninguém está com a ferramenta, BORROWED que um membro está com ela e MAINTENANCE bloqueia empréstimos. O hífen - representa a ausência de um membro responsável pelo empréstimo. Os campos privados só podem mudar por meio de métodos. Leia borrow: atualmente ele atribui BORROWED e um novo membro sem verificar o estado anterior. Preveja o que um segundo empréstimo sobrescreveria. O construtor, os getters e o enum já estão completos; preserve-os.

A estrutura de comandos também está preparada:

cat Desk.java

Encontre a chamada found.borrow(c[2]) e o try/catch ao redor dela. O laço verifica se o ID do membro existe, mas um Tool deve proteger seu próprio estado. Uma IllegalArgumentException se transforma em Rejected: ... e o laço continua aberto. A verificação de estado precisa acontecer antes de qualquer uma das atribuições; lançar a exceção após alterar o objeto deixaria um empréstimo recusado parcialmente aplicado.

Antes de editar, faça uma cópia de segurança apenas do código-fonte. mkdir -p cria uma pasta se necessário; cp copia um arquivo. Essas são suas próprias cópias de segurança, não respostas completas. Não copie nem restaure os dados do balcão ou dos membros.

mkdir -p work
cp Tool.java work/Tool-before-borrow.java.txt

Abra o arquivo existente no nano, um editor de texto para terminal:

nano Tool.java

No nano, ^ na barra de atalhos significa Ctrl. Mantenha Ctrl pressionado enquanto aperta a outra tecla; não digite o circunflexo. Pressione Ctrl+W, digite state = State.BORROWED; e pressione Enter para encontrar a atribuição em borrow. Pressione Ctrl+A para ir ao início dessa linha. Use as setas para posicionar o cursor e Backspace para corrigir caracteres. Insira esta condição de proteção acima da atribuição, mantendo as duas atribuições existentes e o restante da classe:

        if (state != State.AVAILABLE) {
            throw new IllegalArgumentException("Tool is not available");
        }

Aqui, != significa “não é igual a”. A condição recusa tanto um empréstimo existente quanto a manutenção; não altera a identidade, o nome nem a observação. Escreva a condição no método existente em vez de substituir a classe. Confira as chaves e o ponto e vírgula.

Pressione Ctrl+O para salvar, Enter para confirmar o nome existente e Ctrl+X para sair. Para abandonar um erro ainda não salvo, pressione Ctrl+X e responda N à pergunta sobre salvar. Reabra o arquivo para tentar novamente. No shell, nano Tool.java o abre outra vez; Ctrl+W encontra o mesmo trecho. Se houver erro de compilação, leia o arquivo e a linha indicados, corrija esse local no nano, salve e recompile. Não inicie após uma compilação malsucedida.

Se precisar desfazer todas as edições de código-fonte desta etapa, o comando de recuperação abaixo restaura apenas sua cópia anterior de Tool.java. Ele descarta essas edições, então use-o somente quando quiser recomeçar esta edição do código; ele nunca redefine os dados. Esta é uma opção de recuperação, não a próxima etapa normal:

cp work/Tool-before-borrow.java.txt Tool.java

Depois de salvar a condição de proteção (ou refazê-la após a recuperação), compile e inicie:

javac -encoding UTF-8 -d out *.java
java -Dfile.encoding=UTF-8 -cp out Desk desk.tsv --memory

Digite estes comandos do balcão em ordem:

borrow A11 M01
list
borrow A11 M02
borrow A13 M01
borrow TYPO M01
borrow A12 M02
list
quit

O primeiro empréstimo é aceito. O empréstimo duplicado e o da ferramenta em manutenção são recusados intencionalmente com Rejected: Tool is not available. TYPO produz uma recusa de ID desconhecido; corrija o ID na próxima linha sem redefinir o ambiente. A12 ainda pode ser emprestada independentemente a M02. A lista final deve preservar A11 → M01 e o estado e a observação de manutenção de A13. quit volta ao shell; desk.tsv permanece inalterado. O método de devolução ainda está incompleto e será o trabalho da próxima etapa.

Permitir que apenas o membro registrado devolva a ferramenta

Nesta etapa, você concluirá a transição inversa e preservará os demais empréstimos.

Comece no prompt do shell da mesma aba Terminal. A devolução só é válida a partir de BORROWED e quando o membro informado corresponde a borrower. Para strings Java, .equals() compara o conteúdo; ! inverte essa comparação. Depois de passar pelas duas verificações, defina o estado como AVAILABLE e limpe o membro responsável, atribuindo -. Lançar a exceção primeiro impede que uma devolução malsucedida altere o objeto parcialmente.

Preserve a condição de proteção do empréstimo. Antes da próxima edição, faça uma nova cópia de segurança apenas do código-fonte para que a recuperação preserve o método de empréstimo concluído:

cp Tool.java work/Tool-before-return.java.txt
nano Tool.java

Pressione Ctrl+W, procure state = State.AVAILABLE; e pressione Enter. Esta é a primeira atribuição em giveBack. Pressione Ctrl+A para ir ao início dessa linha. Insira as duas verificações abaixo antes dela; mantenha a atribuição de estado existente e borrower = "-"; depois das duas verificações. Não substitua a classe nem remova a proteção do empréstimo.

        if (state != State.BORROWED) {
            throw new IllegalArgumentException("Tool is not borrowed");
        }
        if (!borrower.equals(member)) {
            throw new IllegalArgumentException("Borrower does not match");
        }

A primeira condição rejeita uma ferramenta disponível ou em manutenção. Somente uma ferramenta emprestada chega à verificação de identidade. Compare o membro com o responsável registrado no empréstimo, não com um nome de exibição. Confira as chaves e use Ctrl+O, Enter, Ctrl+X para salvar e sair. Se houver um erro ainda não salvo, Ctrl+X, N o descarta. Corrija erros de compilação reabrindo e procurando o método relevante; compile com sucesso antes de iniciar. Para descartar intencionalmente as edições desta etapa preservando a proteção do empréstimo, use cp work/Tool-before-return.java.txt Tool.java e refaça somente a edição de devolução. Não restaure a cópia mais antiga, anterior ao empréstimo.

Recompile para que o programa use o código-fonte atual e abra um novo balcão em memória. Neste laboratório, cada execução começa com o arquivo original.

javac -encoding UTF-8 -d out *.java
java -Dfile.encoding=UTF-8 -cp out Desk desk.tsv --memory

Digite estes comandos do balcão em ordem:

list
return A14 M01
return A13 M03
return A14 M03
borrow A14 M02
list
quit

A primeira lista mostra o empréstimo existente A14 → M03. O membro incorreto recebe Rejected: Borrower does not match. Devolver a ferramenta em manutenção produz Rejected: Tool is not borrowed. Nenhuma das recusas altera o objeto. A devolução correta produz Accepted: A14 AVAILABLE -, e M02 pode então pegar a ferramenta emprestada. A13 continua em manutenção; A11 e A12 mantêm IDs e observações independentes.

Você expressou duas transições permitidas: AVAILABLE → BORROWED e BORROWED → AVAILABLE. Não existe uma transição de devolução a partir de MAINTENANCE, e esta aplicação não fornece um comando de gerenciamento de manutenção. Uma recusa é um resultado normal do negócio; não encerra o laço de comandos. Você pode executar o programa novamente para praticar. Neste laboratório, as mudanças desaparecem deliberadamente após quit; preserve o código-fonte e continue no laboratório independente de persistência para entender o motivo.

Resumo

Você usou um enum e o estado privado do objeto para proteger empréstimos de ferramentas. Ferramentas com o mesmo nome mantiveram IDs distintos, ações inválidas preservaram o objeto e uma devolução válida permitiu um novo empréstimo a outro membro. Salvar resultados entre execuções é o próximo objetivo.