vamos la
tudo é possivel. o cliente pode ter pontuação pre calculada ou vc pode calcular em algum momento.
entretanto pense numa coisa: é bastante provavel que o seu cliente tenha uma pontuação, mas esta seja armazenada em outra entidade. o motivo é que as vezes existem algumas operações que vc pode querer fazer com a pontuação como
resgate de pontos
duplicar pontos em promoção
expirar pontos antigos
etc.
dessa forma, se existe uma chance disso evoluir, não armazene na classe Cliente diretamente a pontuação.
de repente no natal o serviço X vai dar o dobro de pontos. de repente o cara pode trocar dinheiro por mais pontos. de repente tudo pode acontecer.
ate pq vc poderia ter um erro no seu sistema e o tipo serviço X tinha menos pontos. ou entao o serviço X mudou e agora da mais pontos mas a galera que pegou no passado nao pode ser afetada.
parece interessante vc manter historico disso. onde vc pode emitir um extrato. a partir desse historico vc pode calcular os pontos sem erro e vc pode pre-calcular baseado no fato do historico não ter mudado.
uma maneira interessante é a seguinte
classe Historico tem
- identificador
- cliente
- data criacao
- data expiracao ( se existir )
- tipo servico ou operacao
- pontos
- alguma outra coisa que vc ache relevante
se um dia vc contabilizou menos, entao vc pode criar um serviço to tipo AJUSTE que vai dar os pontos que faltam.
se um dia o cara quer resgatar, vc cria um serviço do tipo RESGATE
de fato talvez vc precise de algo como Operacao, que pode ser Ajuste, Resgate, ou Servico e ai vc informa o Tipo.
se essa lista for imutavel, ou seja se der um erro vc faz uma transação compensatoria para ajustar, fica tranquilo de trabalhar.
tambem pode ser interessante vc ter soft delete ou seja um campo booleano ativo e vc pode inativar o que foi expirado (ou o que vc acha que foi fraude) sem perder o historico. nesse caso isso deixa de ser imutavel pois vc tem um estado ‘ativo’. tem pros e contras.
o que vc faz com o historico? cria uma classe Pontuacao que sabe calcular isso e salva isso baseado no identificador da transação mais recente. Esta atualizado? basta ver se tem uma transação mais nova.