Principio do Minimo Conhecimento

Ae galera, estou estudando padrões de projetos… e estava lendo sobre o padrão Facade (Livro Use a Cabeça)

O livro cita este principio de projeto: "Principio do Minimo Conhecimento - só fale com seus amigos mais proximos"
E cita este exemplo

Sem o principio public float getTemp() { Thermometer thermometer = station.getThermometer(); return thermometer.getTemperature(); }Comentário do livro: Aqui nos obtemos o objeto Thermometer de station e chamamos diretamente o seu metodo getTemperature();

Com o principio public float getTemp() { return station.getTemperature(); }Comentário do livro: Aplicando o principio, acrescentamos a classe Station um metodo que faz a solicitacao ao objeto Thermometer para nós. Isso reduz o numero de classes das quais dependemos

A duvida é o seguinte… pelo que eu entendi, no exemplo com principio, ele criou um metodo getTemperature, e la dentro faz a chamada ao objeto Thermometer…, se o que entendi está certo… não consegui perceber porque fazer isto… já que o objeto que implementa este metodo vai ter que ter conhecimento da classe Thermometer do mesmo jeito.

Alguem sabe os beneficios deste principio, o padrao facade eu entendi bem, mas este principio falado no mesmo capitulo não entendi o real beneficio do mesmo.

Att

Quando você cria um método ou um construtor que recebe um objeto (criado sei lá como) que implementa a interface Temperature, permite que você possa usar algum framework de inversão de controle ou injeção de dependências. São eles que usam, na prática, esse tal princípio. Nesse caso, você não deveria ter de saber que é necessário criar um objeto do tipo Temperature (poderia ser um objeto que lhe passassem que só implementasse a interface Temperature, tal como “FahrenheitTemperature”).

entanglement, este caso então, faltou um pouco mais de detalhe do proprio livro !!!

pois imaginei o metodo getTemperature(); assim

[code]public float getTemperature() {
Thermometer thermometer = station.getThermometer();
return thermometer.getTemperature();
}

public float getTemp() {
return station.getTemperature();
} [/code]Ou seja, apenas não está chamando no metodo getTemp, mas mesmo assim ainda preciso conhecero o Thermometer…

E segundo a sua explicação ficaria assim

public float getTemperature(InterfaceThermometer thermometer) { return thermometer.getTemperature(); }
Ou até passar o InterfaceThermometer no construtor etc… o que fica a mesma coisa que o metodo… seria isto?

Esse principio é para voce minimizar o acoplamento entre as classes… procure por Law of Demeter

Tem livros que falam sobre isso … Code Complete, Pragmatic Programmer, Clean Code…

Abraços

[quote=Astork]Ae galera, estou estudando padrões de projetos… e estava lendo sobre o padrão Facade (Livro Use a Cabeça)

O livro cita este principio de projeto: "Principio do Minimo Conhecimento - só fale com seus amigos mais proximos"
E cita este exemplo

Sem o principio public float getTemp() { Thermometer thermometer = station.getThermometer(); return thermometer.getTemperature(); }Comentário do livro: Aqui nos obtemos o objeto Thermometer de station e chamamos diretamente o seu metodo getTemperature();

Com o principio public float getTemp() { return station.getTemperature(); }Comentário do livro: Aplicando o principio, acrescentamos a classe Station um metodo que faz a solicitacao ao objeto Thermometer para nós. Isso reduz o numero de classes das quais dependemos

A duvida é o seguinte… pelo que eu entendi, no exemplo com principio, ele criou um metodo getTemperature, e la dentro faz a chamada ao objeto Thermometer…, se o que entendi está certo… não consegui perceber porque fazer isto… já que o objeto que implementa este metodo vai ter que ter conhecimento da classe Thermometer do mesmo jeito.

Alguem sabe os beneficios deste principio, o padrao facade eu entendi bem, mas este principio falado no mesmo capitulo não entendi o real beneficio do mesmo.

Att[/quote]

O principio é relacionado ao que vc está fazendo não ao como.
O que está sendo dito é: se vc quer saber a temperatura na estação, pergunte À estação. Não tente perguntar a alguem a estação tem.
Visto por outro lado : como a estação sabe a temperatura ? Resposta: não importa. O que importa é que eu posso saber a temperatura na estação. O como isso é feito na implementação é irrelevante. E é irrelevante porque ira´mudar. Desenhar as classes com base nesse principio nada mais é do que desacoplar corretamente.

No caso em particular a estação tem um termometro e o usa para saber a temperatura. em um outro caso a estação simplesmente retorna um valor fixo, etc…

Básicamente , o principio tem que ver com não navegar na estrutura de objetos associados. Quanto mais vc usa o operador ponto, mais acoplado vc estará

Outro exemplo seria saber a idade de uma pessoa
vc pode fazer pessoa.getIdade(hoje) ou vc pode fazer


Date data = pessoa.getDataNascimento();

Utils.calculaIDade(data, hoje);

Na segunda forma vc precisa saber que a pessoa tem uma propriedade data de nascimento. No primeiro não. Embora a pessoa continue tendo esse atributo, ele não é usado directamente.
Se eu resolver colocá-lo como privado isso não afetará em nada o codigo que quer saber a idade da pessoa. é por isso que se fala tanto que os get/set são "evil’. Eles são a forma mais forte de acoplamento.

Valeu pessoal pelas respostas/dicas… !!!

O Exemplo do livro acho que poderia ser um pouco mais detalhado… demonstrando assim como vcs citaram… mas é isto ae…

Valeu. Att