Percursos
/
Python
Python
/
Exercícios
/
Conta bancária
Conta bancária

Conta bancária

Médio

Introdução

Depois de anos a preencher formulários e à espera, conseguiste finalmente a tua licença bancária. Isto significa que tens agora oficialmente o direito de abrir o teu próprio banco, viva!

A tua primeira prioridade é pôr os sistemas informáticos a funcionar. Depois de um dia de trabalho árduo, já consegues abrir e fechar contas, e ainda tratar de levantamentos e depósitos.

Como não te apetecia escrever testes, convidas uns amigos para ajudar a testar o sistema. No entanto, ao fim de apenas cinco minutos, um dos teus amigos afirma ter perdido dinheiro! Embora tenhas a certeza de que o teu code está livre de bugs, começas a percorrer os registos para investigar.

Ah, pois, exatamente como suspeitavas, a culpa é do teu amigo! Partilhou as credenciais de teste com outro amigo e, juntos, conspiraram para fazer depósitos e levantamentos na mesma conta em paralelo. Quem faria uma coisa dessas?

Enquanto argumentas que é fisicamente impossível que alguém aceda à sua conta em paralelo, o teu amigo avisa-te, com um ar presunçoso, de que as regras bancárias exigem que dês apoio a isso. Ou seja: sem suporte para operações bancárias em paralelo, não há sinal de lançamento. Suspiras e fazes uma nota mental para tratar disto amanhã. Isto vai adiar a tua data de lançamento em pelo menos mais um dia, mas enfim...

Instruções

A tua tarefa é implementar contas bancárias que suportem a abertura e o fecho, levantamentos e depósitos de dinheiro.

Como as contas bancárias podem ser acedidas de muitas formas diferentes (internet, telemóveis, cobranças automáticas), o teu software bancário tem de permitir que se aceda às contas em segurança a partir de múltiplas threads/processos (a terminologia depende da tua linguagem de programação) em paralelo. Por exemplo, pode haver muitos depósitos e levantamentos a acontecer em paralelo; tens de garantir que não existem condições de corrida entre o momento em que lês o saldo da conta e o momento em que defines o novo saldo.

Deve ser possível fechar uma conta; as operações sobre uma conta fechada têm de falhar.

Note

O Python não suporta concorrência "verdadeira" devido ao Global Interpreter Lock. Embora estejam a decorrer trabalhos para criar suporte para free-threading em Python, isso ainda é experimental. As soluções atuais da biblioteca padrão, como multiprocessing e threading, são difíceis de implementar com as ferramentas atuais da track.

Por isso, o requisito de concorrência foi posto de lado neste exercício. As operações de conta são sequenciais num único thread, e não são executados testes de concorrência nem de "condições de corrida".

Se quiseres experimentar free-threading ou testes de concorrência, pedimos-te que o faças localmente. Para obteres ajuda a descarregar e a trabalhar nos exercícios localmente, recomendamos a CLI do Exercism.


Mensagens de exceção

Por vezes é necessário lançar uma exceção. Quando o fazes, deves incluir sempre uma mensagem de erro significativa para indicar qual é a origem do erro. Isto torna o teu código mais legível e ajuda imenso a depurar. Em situações em que sabes que a origem do erro será de um determinado tipo, podes optar por lançar um dos tipos de erro incorporados, mas deves continuar a incluir uma mensagem significativa.

Este exercício em particular exige que uses a instrução raise para "lançar" um ValueError quando uma conta está ou não está aberta, ou quando os valores de levantamento/depósito estão incorretos. Os testes só passam se fizeres raise da exception e incluíres uma mensagem com ela.

Para lançar um ValueError com uma mensagem, escreve a mensagem como argumento do tipo exception:

# account is not open
raise ValueError('account not open')

# account is already open
raise ValueError('account already open')

# incorrect withdrawal/deposit amount
raise ValueError('amount must be greater than 0')

# withdrawal is too big
raise ValueError('amount must be less than balance')
Editar via GitHub A ligação abre numa nova janela ou separador
Python Exercism

Estás pronto para começar Conta bancária?

Inscreve-te no Exercism para aprenderes e dominares Python com 17 conceitos146 exercícios, e mentoria humana real, tudo grátis.