[MÚSICA] [MÚSICA] Olá, bem vindo ao curso de orientação a objetos com Java. Eu sou o Clovis Fernandes. Hoje iremos falar de colaboração, dependência, e classes cliente e servidor. Você irá aprender a caracterizar e diferenciar cada desses conceitos. Nós vimos anteriormente os conceitos de responsabilidade e colaboração no contexto de cartões CRC. Agora iremos avançar pouco mais e caracterizar os conceitos de colaboração dependência, classe cliente e classe servidora. Iniciamos por "Dependência entre Classes". No nosso exemplo que tínhamos utilizado para falar de cartões CRC nós apresentamos o exemplo da "Classe Biblioteca", que dependia da "Classe Livro". A "Classe Biblioteca" dependia também da "Classe Usuario". Fizemos diagrama que nós mostramos essa dependência. Mas, o que é que é essa dependência então? Isso tem haver com a necessidade que uma classe tem relação a outras classes para realizar as suas responsabilidades. Se objeto "Biblioteca" não pode existir sem a colaboração de livro, então, existe uma dependência entre biblioteca e livro. Se ele não pode existir sem a colaboração do usuário, então existe uma dependência entre biblioteca e usuário. Vamos exemplificar pouco para tornar pouquinho mais concreto esse assunto. A responsabilidade "Empresta livro" da classe "Biblioteca" para realizar as, todas as suas ações, ela precisa da colaboração da classe colaboradora "Livro", especial da responsabilidade e da colaboração, que é uma responsabilidade de livro, que é o "Anexa, usuário do empréstimo". Então, para que o "empresta" livro possa ser realizado ele precisa dessa colaboração. Então existe uma dependência muito grande. Sem essa colaboração ele não consegue terminar as suas ações pelas quais ele é responsável. Dessa forma isso vai caracterizar então, que a "Classe Biblioteca" ela é uma classe cliente, tanto da classe livro, quanto da usuário, porque as suas responsabilidades, algumas delas dependem de "livro" outras dependem de "usuário". Quando o objeto ou classe cliente usa, o objeto ou classe "servidor" como argumento de construtor, como argumento de métodos, como parâmetros de criação de objeto, parâmetros de mensagens para outros objetos, como tipos das variáveis de instância e das variáveis locais ou temporárias que eu estou usando e também como tipo de retorno dos métodos, isso vai então caracterizar essa dependência da classe ou objeto cliente relação à classe servidora. Neste ponto, cabe perguntar, quais são as classes servidoras de uma dada classe termos de colaboração e dependência? Nós vamos caracterizar três tipos diferentes de classes servidoras: Uma "outra classe", a "superclasse" e "A própria classe". As três classes poderão ser classes servidoras. Vamos começar então pela "Outra classe". Nesse exemplo nós temos a classe "Empresa" e ela produz só para exemplificar, uma mercadoria. A classe "Empresa" é cliente, e a classe "Mercadoria" ela é servidora. Já existe uma dependência aí, porque, quando eu coloco aí "-mercadoria", começando com letra minuscula, eu estou querendo dizer que na classe "Empresa" eu tenho que relacionar atributo que eu já vou chamar de "Mercadoria" para guardar essa associação com objeto "mercadoria". Mas como é que isso fica no geral relação à construtora, métodos, tipos de retornos de métodos e variáveis de instância? Como é que fica isso? Eu vou mostrar para vocês uma coisa que a gente chama de código arquitetural ou implícito que se refere a essa estrutura, a essa associação que está aí mostrada entre "Empresa" e "Mercadoria". Olhamos aqui que a classe "Empresa" ela tem construtor que eu estou passando parâmetro que tem haver com a sua associação, que no caso é objeto da classe "Mercadoria". Então "Mercadoria", ali nesse construtor, ele é argumento, o argumento do construtor. Dentro, eu estou usando, passando uma mensagem que é o "associaMercadoria" que eu estou passando o "Mercadoria" que era argumento, agora ele passa-se a chamar "parâmetro". Ele é parâmetro dessa mensagem. Eu tenho aí também, o método privado "associaMercadoria" que "Mercadoria" é o parâmetro, é o argumento que eu vou usar para fazer essa associação de "Mercadoria" com "Empresa". O método "getMercadoria" tem tipo de retorno que é "mercadoria". A variável "Mercadoria" que eu tinha colocado já naquela descrição de classes "UML". O tipo da variável de instância também é "Mercadoria" e é do tipo privado. Essa estrutura que acabamos de ver, a gente chama de "Código arquitetural ou implícito" e iremos tratar disso ao longo também do curso. O segundo tipo, tem haver com "Superclasse". No exemplo que eu estou mostrando aí, eu estou usando mercadoria e o "Item de venda". Pelo simples fato de haver uma herança o "Item de Venda", ele já depende da "Superclasse". Então existe uma dependência, porque ele vai herdar todos os métodos públicos que o "Mercadoria" tem aí. Certo? Mas mais do que isso, o que é que se fez nessa classe "Item de venda"? O método "Imprimir Tíquete" do "Item de venda", na lógica do "Item de imprimir tíquete" usa o método de "Atualizar Estoque" que ele herdou da classe "Mercadoria". Exemplo de uma dupla dependêcia; depende da classe que vai herdar e ao mesmo tempo eu estou usando o método da "Superclasse" dentro, na lógica do meu próprio método. Então isso é segundo tipo de dependêcia. Terceiro tipo de classe servidora é a própria classe de "cliente". Também vai ser servidora dela mesma, ou seja, vai ter algumas necessidades, algumas responsabilidades que eu vou complementar com base nas responsabilidades da própria classe. Uma alternativa que eu estou mostrando aí, eu estou olhando a parte da associação com mercadoria e eu tenho o método privado "associaMercadoria" passando o parâmetro a uma mercadoria da classe "mercadoria". A mensagem que faz o acesso ao próprio objeto está ali dentro do construtor e está representado pelo pelo nome "this". Então "this.associaMercadoria(mercadoria)". Isso é uma mensagem que eu estou fazendo e eu estou usando o próprio objeto da classe. Então isso está dentro do próprio construtor, mas poderia estar dentro de qualquer dos métodos da classe "Empresa". Há outro tipo de associação, é a de "Empresa" com uma própria "Empresa". Então, eu por exemplo estou querendo representar, que a empresa tem concorrente, por exemplo. Ela tem uma mercadoria e ela vai ter concorrente. Então, eu estou fazendo que o concorrente dele é o quê? É uma empresa também. Então eu vou representar dentro da classe "Empresa" o seu concorrente que vai ser também da classe "Empresa". Está certo? Pelo fato de ser empresa e estar representado lá dentro, não quer dizer que eu tenho acesso às coisas internas da outra empresa concorrente. Não, só através dos métodos. E como é que a gente representa isso? A outra associação anterior com mercadoria, eu fiz através do construtor. Agora eu vou fazer uma associação com uma outra empresa, através de método "associaPúblico". Vamos dar uma olhada. Então o acesso a outro objeto da mesma classe é feito através do "associa", desse método que é público e se não for público, eu não vou conseguir acessar objeto, mesmo sendo da empresa eu não vou acessar o objeto "Empresa" se o "associa" não for público e passo qual é a empresa. Então eu estou passando para o objeto "Empresa" qual é que é o seu concorrente. Eu vou exemplificar logo de seguida. E também eu fico sabendo através do "getEmpresa" quem é essa empresa. E tenho o método privado "Empresa", da classe "Empresa". Continuando, agora eu vou mostrar como é que eu uso isso. Eu vou exemplificar o acesso a outro objeto da classe, sendo que é a mesma classe, mas são objetos distintos, embora o objeto esteja dentro do outro neste exemplo aqui. Então eu crio uma mercadoria, "new Mercadoria", crio uma empresa, e ao criar a empresa eu faço associação com a mercadoria porque essa empresa só tem uma mercadoria neste exemplo. Aí eu crio uma empresa concorrente. Ao criar empresa concorrente, ela também tem uma mercadoria. Se é concorrente vai ser o mesmo tipo de mercadoria provavelmente, por isso é que eu estou repetindo aqui. Aí, eu associo empresa.associaEmpresa(concorrente) Então nesse momento, eu estou fazendo essa associação e lá dentro do objeto empresa, agora o concorrente é essa nova empresa que eu acabei de criar. Com isso acabamos de mostrar os conceitos de colaboração, dependência, classes clientes e classes servidoras. Falamos muito superficialmente sobre código arquitetural. Isso vai ser tratado futuramente. Obrigado. [MÚSICA]