sábado, 1 de outubro de 2016

Os benefícios da generalização e da abstracção

Nestas primeiras aulas dissemos que em Python tudo são objectos. Cada objecto tem um conjunto determinado de atributos, como a identidade, o valor e o tipo, e um conjunto de operações em que podem participar. Os atributos num dado instante definem o estado do objecto, enquanto que as operações determinam o seu comportamento.
Podemos usar estes elementos para usar Python como se fosse um vulgar calculadora que me ajuda a saber o peso ideal de uma pessoa do género masculino.
1.>>> 72.7 * 1.81 - 58
2.        73.58700000000002
3.>>>
Podemos fazer o mesmo para calcular o peso-ideal de uma pessoa do género feminino. E até podemos escrever um único programa que nos permite calcular o peso ideal de qualquer pessoa.
01.# Definição
02.def peso_ideal(altura,genero):
03.    if genero == 'M':
04.        return round(72.7 * altura - 58,2)
05.    else:
06.        return round(62.1 * altura - 44.7,2)
07.       
08.# Uso
09.print(peso_ideal(1.81,'M'))
10.print(peso_ideal(1.74,'F'))
Este exemplo simples mostra a vantagem de soluções genéricas. Para as conseguir fazemos uso de uma abstracção procedimental, uma definição (def). Neste exemplo os dados são fornecidos ao programa no momento da chamada do programa através dos argumentos da definição, também designados de parâmetros formais, e o resultado é comunicado a quem o solicitou através do comando de regresso (return). Não tem que ser forçosamente assim.
01.# Definição
02. 
03.def peso_ideal_2():
04.    altura = float(input('A sua altura sff: '))
05.    genero = input('O seu género sff [M/F]: ')
06.    if genero == 'M':
07.        print(round(72.7 * altura - 58,2))
08.    else:
09.        print(round(62.1 * altura - 44.7,2))
10.     
11.     
12.# Uso
13.peso_ideal_2()
14. 
15.peso_ideal_2()
Como se pode ver a grande diferença entre as duas soluções reside no modo como se processa a entrada dos dados a a comunicação do resultado. Agora usamos input para introduzir os dados e print para comunicar o resultado. Neste exemplo, estão presentes o que designamos de instruções, que de um modo geral podem ser agrupadas em dois grandes grupos: destrutivas e de controlo. No primeiro grupo, estão as instruções de atribuição (=), entrada (input) e saída (print). No segundo grupo, as instruções de sequência (;), condicionais (if) e ciclos ou repetições (for). São os blocos construtores dos programas.
Outro exemplo que quer tratámos envolvia desenho de polígonos regulares. Mostrei como se podia passar de um programa muito simples para desenhar um quadrado:
01.# Definição
02.def quadrado():
03.    turtle.forward(50)
04.    turtle.right(90)
05.    turtle.forward(50)
06.    turtle.right(90)
07.    turtle.forward(50)
08.    turtle.right(90)
09.    turtle.forward(50)
10.    turtle.right(90)
11.        
12.# Uso
13.quadrado()
para outro programa mais completo.
01.import turtle
02. 
03.# Nova Definição
04.def vai_para(x,y):
05.    turtle.penup()
06.    turtle.goto(x,y)
07.    turtle.pendown()
08.     
09.def quadrado(x,y,orientacao,cor,lado):
10.    vai_para(x,y)
11.    turtle.setheading(orientacao)
12.    turtle.color(cor)
13.    turtle.begin_fill()
14.    for i in range(4):
15.        turtle.forward(lado)
16.        turtle.right(90)
17.    turtle.end_fill()
18.    turtle.hideturtle()
19.     
20.# Uso
21. 
22.quadrado(50, -50, 45,'red',50)
23.turtle.exitonclick()
Completámos a ideia de abstracção ao mostrar como um único programa podia ser usado para desenhar qualquer polígono regular.
01.import turtle
02. 
03.# Nova Definição
04.def vai_para(x,y):
05.    turtle.penup()
06.    turtle.goto(x,y)
07.    turtle.pendown()
08.     
09.def poligono_reg(num_lados,x,y,orientacao,cor,lado):
10.    vai_para(x,y)
11.    turtle.setheading(orientacao)
12.    turtle.color(cor)
13.    turtle.begin_fill()
14.    angulo = 360//num_lados
15.    for i in range(num_lados):
16.        turtle.forward(lado)
17.        turtle.right(angulo)
18.    turtle.end_fill()
19.    turtle.hideturtle()
20.     
21.# Uso
22.poligono_reg(7,50, -50, 45,'red',50)
23.turtle.exitonclick()
A moral desta história é simples: generalizar + abstrair compensa!

Sem comentários:

Enviar um comentário