[MÚSICA] [MÚSICA] Olá, bem vindo ao curso de Orientação a Objetos com Java, eu sou o Clovis Fernandes e nessa aula iremos dar continuidade ao hands-on sobre Modelagem CRC. Vamos apresentar o passo 6 e dar fecho na modelagem da aplicação SAB. No passo 5 nós identificamos as responsabilidades completamente para a classe Biblioteca. Então, eu tenho aqui verde a responsabilidade do tipo sabe, amarelo as as responsabilidades do tipo faz, que foram responsabilidades óbvias e as restantes são responsabilidades que foram identificadas na especificação através de verbos e predicados. O passo 6 eu vou pegar cada uma das responsabilidades de cada classe e vou dar a lógica para elas, certo? Eu vou exemplificar aqui, algumas dessas responsabilidades. Então, por exemplo, a responsabilidade: "Empresta livro" da classe Biblioteca tem a seguinte lógica, que é algoritmo, não é, mostra o que é que faz essa responsabilidade. Então, tem livro para empréstimo para dado usuário, e é isso que é o objetivo do emprestar o livro, emprestar o livro para dado usuário. A primeira coisa que eu faço é marcar o livro como emprestado, eu anexo o usuário, que eu acabo de emprestar o livro, como alvo do empréstimo do livro e anexo o livro à lista de livros emprestados pelo usuário, ou seja, o livro, quando eu marco o livro como emprestado, ele deixa de ser disponÃvel, ele fica indisponÃvel para emprestar para outro, porque ele já não vai existir no catálogo para emprestar. E eu represento isso anexando o usuário ao livro, que é alvo do meu empréstimo, para que eu saiba quem aquele livro está, está certo? Se eu precisar algum momento e eu anexo o livro à lista de livros emprestados pelo usuário para que o usuário saiba e fique registrado quais são os livros que ele tem emprestado da biblioteca. O que é que acontece com essas 3 últimas linhas aqui? Elas são responsabilidades novas, está? Então, eu tenho a responsabilidade, posso olhá-las como responsabilidades. Da mesma maneira que eu olhava os verbos e predicados na especificação do sistema SAB, agora eu olho na lógica de cada responsabilidade de classes existentes, eu vou descobrir novas responsabilidades. Então, eu tenho aÃ, marca livro como emprestado, é uma responsabilidade, anexa usuário como alvo do empréstimo do livro, é outra responsabilidade e anexa livro à lista de livros emprestados pelo usuário é outra responsabilidade e o que é que acontece? Eu agora faço a atribuição dessas responsabilidades à s classes existentes. Então marca livro como emprestado e anexa usuário como alvo do empréstimo do livro, eu faço a atribuição à classe Livro, faz sentido pertencer à classe Livro. Já a responsabilidade anexa livro à lista de livros emprestados pelo usuário, faz todo o sentido estar na classe Usuário e é isso que eu faço, eu faço essa atribuição. Suponha no meu caso, nesse exemplo, as atribuições são classes já existentes, suponha que nenhuma das classes existente fizesse sentido para eu fazer atribuição, então o que é que eu teria que fazer? Criar uma classe nova, então, pode ser que eu não tenha chegado a uma classe pela análise CRC até aos passos anteriores, mas agora comecaria a chegar a uma classe nova, porquê? Eu teria na mão uma responsabilidade e não teria uma classe que eu pudesse atribuir, neste caso, essa classe nova receberia a atribuição dessa responsabilidade e faria parte do meu sistema. Seria a quarta classe se fosse o caso, não é o caso aqui. Vamos olhar agora outra lógica. Agora dá "Devolve livro" da Biblioteca. Ela é exatamente o oposto da anterior. O anterior eu estava emprestando o livro para usuário, agora é usuário que está devolvendo livro para a biblioteca. Então, devolve o livro da classe Biblioteca. Qual é a lógica dela? A primeira coisa que eu faço eu desanexo o livro da lista de livros emprestados pelo usuário, ou seja, eu devolvo livro de dado usuário, então eu já sei quem é o usuário, aà eu desanexo o livro desse objeto usuário, da lista de livros dele. Desanexo o usuário como alvo do empréstimo do livro, então, estou devolvendo livro, ele está marcado lá que esse usuário como o detentor do livro, eu vou desanexar e marco o livro como disponÃvel, porquê? Eu acabei de devolver, então agora, se aparecer no instante seguinte novo usuário querendo emprestar esse mesmo livro, o livro estará disponÃvel. Então o que aconteceu? O desanexa livro da lista de livros emprestado pelo usuário, eu atribuo à classe Usuário, porque faz sentido, não é? É uma operação que eu vou fazer lá na classe Usuário, lá na classe Usuário, eu tenho, a classe Usuário sabe a lista dos livros que ele emprestou, então ele poderá facilmente desanexar o livro da lista de livros emprestados. Já o desanexa o usuário como alvo do empréstimo do livro, ele marca o livro como disponÃvel, esses 2 pertencem à classe Livro, eu vou fazer a atribuição dessas novas responsabilidades à classe Livro. Então, para que vocês percebam que à medida que eu vou descrevendo as lógicas, eu vou tendo mais informação sobre o que o meu sistema faz e vão aparecendo novas responsabilidades, eventualmente novas classes, está certo? No caso aqui não apareceu porque eu estou fazendo exemplo bastante simples, nesse momento. A próxima coisa que eu vou fazer é apresentar a lógica da responsabilidade "Exibe livros disponÃveis" para empréstimo de Biblioteca. Então ele é uma lógica que ele vai varrer o catálogo de livros, não é? Então para cada livro do catálogo de livros ele simplesmente pergunta se o livro, que ele está à mão naquele momento, está disponÃvel ou não. Se estiver disponÃvel, ele coloca na lista para exibir, está certo? Passa para o próximo livro, pergunta se está disponÃvel, se não estiver passa para o próximo livro, se estiver, coloca para exibir, está certo? Com isso eu vou montando o catálogo de, a lista de livros disponÃveis. O que é que aparece aqui? Uma nova responsabilidade. Livro está disponÃvel? É uma pergunta que é uma responsabilidade do tipo pergunta booleana, vai responder sim ou não, verdadeiro ou falso e eu vou atribuir à classe Livro. Então, é uma responsabilidade que eu vou agora, apareceu agora e eu vou atribuir, procuro lá, faz sentido ser na classe Livro, então eu coloco na classe Livro. "Exibir livros não disponÃveis", basicamente é a mesma coisa do anterior, só que eu inverto a pergunta, antes eu perguntava: livro está disponÃvel? Agora eu pergunto livro não disponÃvel, mas basicamente a responsabilidade é a mesma da anterior, o livro está disponÃvel? Basta eu negar a anterior, então, não é uma responsabilidade nova. É a mesma responsabilidade antiga que eu estou usando aqui e já tinha sido atribuÃdo à classe Livro. Agora a lógica para "Registra usuário" de Biblioteca, se o usuário não está na lista de usuários da biblioteca, eu vou registrar novo usuário. Se ele já existir, eu estou fazendo algo errado, não é, está certo? Estou querendo colocar, registrar usuário que já existe está certo? Então, se o usuário existir, eu vou avisar que o usuário já existe. Agora se ele não existe, então eu vou criar uma nova instância, novo objeto do usuário, está certo? E vou adicionar a esse objeto à lista de usuários da biblioteca e aviso que ele é novo usuário. Coloco também o nome único dele, não é, está certo? São informações que veio junto comigo quando registra usuário vem com informações sobre o nome, aà eu coloco essa informação no objeto novo usuário. O adiciona esse objeto à lista de usuários da biblioteca e avisa "Novo usuário" ele está marcado aà como preto, poderia ser considerado uma nova responsabilidade se for realmente muito difÃcil fazer essa adição desse novo elemento. Se for uma coisa simples, ele é código comum, se não realmente poderia ser uma responsabilidade nova e aqui eu não estou nem considerando isso. A outra lógica é o "Adiciona livro" está certo? Já no caso do "Adiciona livro", eu crio novo número único de catálogo. Isso pode ser uma coisa simples, no meu exemplo, vai ser uma coisa simples, porque eu estou simplesmente fazendo uma numeração simples, a cada vez que entra livro ele recebe número, ele tem contador muito simples. Mas no caso real da biblioteca, pode ser que isso se transformasse numa responsabilidade que ia dar origem, uma parte do meu sistema, que iria ser responsável para colocar os números apropriados de biblioteca, que seguem regras de biblioteconomia e que os números são complicados para identificar se o livro é de ação, se o livro é cientÃfico, se o livro cientÃfico é de medicina, de computação ou de não sei o quê. Então, eventualmente esse Cria novo número único de catálogo, seria uma responsabilidade que daria origem a uma nova classe, que estaria cuidando dessa problemática de dar número único de catálogo. Cria, no nosso caso aqui, ele é uma coisa muito simples, é contador muito simples, ele sempre vai apontando o próximo número que esteja disponÃvel para servir de seu número único do catálogo do livro. Aà eu crio uma instância do objeto usuário e adiciono esse objeto ao catálogo de livros da biblioteca. No nosso caso também, adicionar objetos é uma coisas muito simples porque estamos com uma lista muito simples mas poderia ser uma coisa mais complicada também e se transformar numa responsabilidade atribuÃda a uma classe provavelmente nova aqui. Como ficamos então com a classe livro? Se vocês lembram, nos só estávamos usando responsabilidades verdes do tipo Sabe. Sabe tÃtulo, Sabe autor, Sabe número único de usuário, Sabe disponibilidade empréstimo, Sabe usuário, se emprestado. A partir do momento que começamos a listar as lógicas das responsabilidades das classes biblioteca, livro e usuário, começaram a aparecer novas responsabilidades e que elas foram sendo atribuÃdas, a maioria delas, algumas delas para livro e outras para usuário. Então aparecem então Marca livro como emprestado, Anexa usuário como alvo do empréstimo do livro, Desanexa usuário como alvo do empréstimo do livro, Marca livro como disponÃvel. Livro está disponÃvel? Aqui existe uma redundância que eu não eliminei ainda mas numa fase posterior eu poderia eliminar. É o Sabe disponibilidade de empréstimo, ela corresponde muito ao Livro está disponÃvel. Algum momento eu ia ver que elas são a mesma e eliminaria uma das duas. Já a classe usuário: antes só tinha o Sabe nome e Sabe lista de livros emprestados. Eu consegui então identificar nas responsabilidades da classe biblioteca duas responsabilidades que foram atribuÃdas aos olhos, faz sentido isso aqui. Uma delas é o Anexo lista de livros emprestados, a outra é Desanexa livro da lista de livros emprestados. Olhando agora como cartão, está certo, eu estou agora resumindo a classe biblioteca, aqui eu não estou colocando a descrição dela, mas poderia colocar a descrição. Não estou colocando também os atributos nem as responsabilidades do tipo SAT, só por simplicidade. Então aqui eu tenho só responsabilidades do tipo Faz e com as suas colaborações, por exemplo: registro do usuário, a coloboração é com o usuário apenas porque eu vou criar objeto usuário e para isso a colaboração é o construtor da classe usuária. Ele vai e constrói para mim objeto. Só para mudar pouquinho, por exemplo, o empresta livro colabora com as classes, as classes colaboradoras são classe livro e usuário. Então por exemplo, na classe livro ele precisa da colaboração da marca livro. O usuário precisa de anexa livro à lista de livros do usuário. E assim para cada uma delas eu vou descrevendo e isso mostra, por exemplo, que eu tenho as classes colaboradoras e as suas responsabilidades especÃficas listadas aqui. Já no caso da classe livro as responsabilidades nesse exemplo, que é muito simples, elas não precisam de colaboração nenhuma. Então eu listei aà as responsabilidades que foram do tipo Faz. A classe usuário também é muito simples neste momento. Não quer dizer que ao longo da modelagem, à medida que entram novos requisitos eu vou melhorando a minha especificação do meu sistema SAB, vai havendo mudança nisso aqui dinamicamente mas nesse momento ela não tem colaboração nenhuma, tá certo? Então ela não tem colaboração nenhuma, ela só tem as suas responsabilidades. E como está isso termos de colaboração? Eu posso indicar que a classe biblioteca ela depende da classe livro e depende da classe usuário. Agora está muito claramente definido isso, como é que está definido? Através das classes colaboradoras que são citadas vários momentos, livro, livro, livro, tá certo? E na classe empresta livro e devolve livro, ali também tinha que ter usuário. Então nós também temos essas dependências, isso mostra que dependências são colaborações e estou acoplando as classes biblioteca à s classes livro e usuário. Uma representação UML no diagrama de colaboração, é dessa forma que está marcado aÃ. Aquela representação que nós estávamos vendo dos cartões pode ser simplificada usando anotação UML de classes, que eu uso diagrama de colaborações. Basta aparecer o nome da classe. Então eu tenho a classe biblioteca que depende da classe livro e que depende da classe usuário, ou seja, essas classes estão fortemente acopladas. Uma colabora com outra: a classe biblioteca, ela é uma classe cliente das classes livro e usuário. Finalmente então acabamos de apresentar o passo 6, mostramos o diagrama de colaboração das classes que nós identificamos completamente, todas as responsabilidades e colaborações das 3 classes: classe biblioteca livro e usuário, tá certo? Nós identificamos tudo e vimos como elas se relacionam através de colaboração e o diagrama de colaboração que mostramos a sua dependência, tá certo? Muito obrigado! [MÚSICA]