VinBR

LP 24/10/2011

Oct 27th, 2011
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.91 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. Hoje vamos falar de orientação à objetos.
  9.  
  10. O que é orientação a objetos?
  11.  
  12. Quando dizemos que uma implementação é orientada a objetos, queremos dizer que os tipos são inteligentes, eles sabem realizar ações sobre sí mesmos.
  13. Ou seja, a orientação a objetos quer dizer que dado o objeto C eu tenho um conjunto de operações sobre ele, que estão aninhadas dentro da própria estrutura.
  14.  
  15. ex: c.imprimaValor();
  16.  
  17. Assim se em um programa eu não associar o código das ações relativas ao objeto X ao objeto sí propriamente dito, a programação não é orientada a objetos.
  18.  
  19. // Nota em python o primeiro parametro de um metodo definido em uma classe recebera uma instanciação da classe como parâmetro.
  20.  
  21. Porque isso é interessante?
  22.  
  23. Para minimizar o custo de modificação de um programa.
  24. Já que de fato, a interface de um programa muda pouco, porém a implementação muda frequentemente.
  25. E pode precisar de edição com mais frequencia.
  26.  
  27. // Smalltalk foi a linguagem que popularizou o termo "orientação a objetos"
  28. // Simula 67 foi a linguagem que primeiramente surgiu com a idéia "orientação a objetos" e com a idéia de "classe" e "herança"
  29. // Simula 1 era originalmente uma linguagem extremamente semelhante a fortran.
  30. // Os dois noruegueses que criaram Simula, morreram pouco depois de ganharem o premio turing, mas morreram antes da cerimonia.
  31.  
  32.  
  33. Linguagens orientadas a objetos:
  34. - C++, Java, Object Pascal, C# -> linguagens estáticas
  35. - Python, Ruby, PHP S.O, Smalltalk -> linguagens dinâmicas
  36. - Lua, JavaScript (Self) -> não possuem classes
  37.  
  38. Caracteristicas em comum:
  39.  
  40. C - Objetos
  41. - Classes +-
  42. - Herança, Delegação +-
  43. C - Subtipagem
  44. C - Todas usam muito o HEAP
  45. - Coletor de lixo. (C++ é o único que não possuí um)
  46. C - Reflexão (pode-se perguntar qual o tipo ou a classe de um objeto)
  47. C - Invocação Dinâmica
  48. C - Menssagens
  49.  
  50. CONCEITO:
  51. Objeto é um dado que existe em tempo de execução,
  52. mas é um dado inteligente, que consegue realizar operações.
  53. Eles tem estado, e tempo de vida.
  54.  
  55. CONCEITO:
  56. Uma Classe é uma implementação de um TAD.
  57. // Mas existem outras implementações de TADs que não poderiam ser consideradas TADs então essa definição é insuficiente =P
  58. Uma classe é uma forma, pela qual se descreve o conjunto de dados contidos em um tipo, e de operações que operam sobre tal.
  59.  
  60. Uma classe também pode ser pensada (como no caso de python) como uma tabela de dados, e de ponteiros para funções.
  61. Em java Script não se tem "classes" porque na verdade só se tem o conceito de "tabela".
  62.  
  63. Ex: de classe em python:
  64.  
  65. class Animal:
  66. "The base class of the whole object zoo."
  67.  
  68. def init (self, name):
  69. sel.name = name
  70.  
  71. def str (self):
  72. return self.name + " is an animal"
  73.  
  74. def eat(self):
  75. print self.name + ", which is an animal, is eating."
  76.  
  77. class Mammal(Animal): // o animal entre parenteses indica que essa classe extende animal.
  78. "Mammals are animals that know how to suck milk."
  79. // mammals = mamiferos =]
  80.  
  81. def str(self):
  82. return self.name + " is a mammal"
  83.  
  84. def suck(self):
  85. printf self.name + ", which is a mammal, is sucking milk."
  86.  
  87. // Assim com o sistema de heranças cada sub-classe torna-se mais especializada, apesar de não perder qualidades.
  88.  
  89. class Dog(Mammal):
  90. "Dogs are mammals that can bark, and bite when they eat."
  91.  
  92. def str (self):
  93. return self.name + " is a dog"
  94.  
  95. def bark(self):
  96. print self.name + " is barking rather loudly."
  97.  
  98. def eat(self):
  99. print self. name + " barks when it eats."
  100. self.bark
  101.  
  102. // ps: bark = latir
  103.  
  104. def test0():
  105. a = Animal("Tigrinho")
  106. b = Mammal("Oncinha")
  107. c = Dog("Beduino")
  108. print a
  109. print b
  110. print c
  111.  
  112. (quando voce chama a função print, por default a função buscada é a str)
  113.  
  114. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  115.  
  116. Em java o método que se imprime quando se dá um System.out.println(a) é o método "toString"
  117.  
  118. O professor mostrou o mesmo código que copiei acima a respeito de python, em java.
  119. E foi listando as diferenças, dos objetos de uma linguagem de tipagem dinâmica para uma de tipagem estática.
  120.  
  121. O professor desenhou as tabelas de cada uma das tres classes e mostrou uma lista contendo todas as implementações de funções do código,
  122. e mostrou em seguida que cada elemento das tabelas aponta para uma implementação especifica de uma função.
  123.  
  124. Então começou a discutir a possibilidade de se atribuir um mamifero a um objeto do tipo estatico animal.
  125. Mas eu não poderia atribuir esse animal ( Agora com um objeto do tipo mamifero ) a uma variável do tipo mamifero.
  126. Pois nessas atribuições o que é considerado é o tipo estático, e não o dinâmico.
  127.  
  128. Ele mostrou também que se eu chamo um tipo estatico mamifero, e chamo o toString dele, a implementação que será chamada é a propria.
  129. Agora, se eu igualar esse objeto a um do tipo dog e realizar a mesma chamada, agora o tipo dinâmico é do tipo dog, e a mesma chamada
  130. chamara o toString do Dog.
  131.  
  132. Qual a vantagem desse polimorfismo de implementação? (se é que eu posso falar isso)
  133. Uma das máximas de computação é que cada programa deve ser implementado sempre para a interface mais externa possível.
  134. Assim eu tenho uma caixa preta, extremamente versátil, que pode ser usada para várias funcionalidades, sem precisar-se
  135. editar a implementação da própria caixa preta.
  136.  
  137. Assim eu posso ter por exemplo uma lista, que conterá cachorros, capivaras, planarias e outros animais, já que a lista é do tipo animal.
  138. É mais generico, é mais flexível.
  139.  
  140. Cada animal irá comer, da forma que eles sabem.
  141.  
  142. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  143.  
  144. O professor chamou a atenção para a ordenação dos nomes de funções na tabela.
  145. Se x extend y então as funções de x que são herdadas de y tem na tabela o mesmo endereço relativo!
  146. Ou seja é fácil encontrar a implementação da função batata, em um objeto do tipo y, mesmo que o tipo dinâmico seja x.
  147.  
  148. Então para encontrar uma função especifica, basta realizar duas derreferencias:
  149. uma para encontrar o objeto (ou seja a tabela).
  150. outra para encontrar o indice da função (ou seja a posição na tabela).
  151.  
  152. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  153.  
  154. CONCEITO:
  155. Herança multipla é a caracteristica de uma classe extender mais de uma única outra classe.
  156.  
  157. Onde isso seria útil? Suponha que voce quer a classe "Flier" de animais que voam.
  158. Essa classe poderia extender tanto mamiferos (morcego) quanto aves
  159. Porém em java isso não é possível.
  160.  
  161. Agora suponha que eu queira chamar uma função que existe em ambas as classes pais.
  162. Em python por default usa-se a primeira implementação a ser extendida.
  163.  
  164. em C++ se há 2 metodos iguais há erro de compilação.
  165. Exceto quando o caso é a respeito da função construtora, e nesse caso chama-se ambas as construtoras.
  166.  
  167. Outra ambiguidade:
  168. Seja A extendido por B e C, e D extende B e C, e todos tem o metodo init, se eu chamo D.init() o que acontece?
  169. python sempre chama a primeira como já disse acima.
  170. A maioria das linguagens de tipagem estatica não permite a compilação nesse caso.
  171.  
  172.  
  173. Como identificar o tipo dinâmico de um objeto em python?
  174.  
  175. if isinstance(a, Mammal):
  176.  
  177. Na implementação isso é feito com um ponteiro para o nome da classe.
  178.  
  179. // Fim da aula.
Advertisement
Add Comment
Please, Sign In to add comment