Clase Programcion II
Clase Programcion II
45 idiomas
Artículo
Discusión
Leer
Editar
Ver historial
Herramientas
La programación estructurada es un paradigma de programación orientado a
mejorar la claridad, calidad y tiempo de desarrollo de un programa de
computadora recurriendo únicamente a subrutinas y a tres estructuras de
control básicas: secuencia, selección (if y switch) e iteración (bucles for y while);
asimismo, se considera innecesario y contraproducente el uso de la transferencia
incondicional (GOTO); esta instrucción suele acabar generando el llamado código
espagueti, mucho más difícil de seguir y de mantener, además de originar
numerosos errores de programación.
Surgió en la década de 1960, particularmente del trabajo de Böhm y Jacopini,1 y
un famoso escrito de 1968: «La sentencia goto, considerada perjudicial»,
de Edsger Dijkstra.2 Sus postulados se verían reforzados, a nivel teórico, por
el teorema del programa estructurado y, a nivel práctico, por la aparición de
lenguajes como ALGOL, dotado de estructuras de control consistentes y bien
formadas.3
Elementos[editar]
Estructuras de control[editar]
Siguiendo el teorema del programa estructurado, todos los programas se ven
como compuestos de estructuras de control:
Sequence: declaraciones ordenadas o subrutinas ejecutadas en
secuencia.
Selection: una o varias instrucciones se ejecutan dependiendo del
estado del programa. Esto generalmente se expresa con la palabra
clave como if..then..else..endif . La declaración condicional debe
tener al menos una condición verdadera y cada condición debe tener un
punto de salida como máximo.
Iteration: una instrucción o bloque se ejecuta hasta que el programa
alcanza un cierto estado, o se han aplicado operaciones a cada
elemento de una colección. Esto generalmente se expresa con palabras
clave como while , repeat , for o do..until . A menudo, se
recomienda que cada bucle solo tenga un punto de entrada (y en la
programación estructural original, también solo un punto de salida, y
algunos lenguajes lo imponen).
Recursion: una declaración se ejecuta llamándose repetidamente a sí
misma hasta que se cumplen las condiciones de terminación. Si bien en
la práctica son similares a los bucles iterativos, los bucles recursivos
pueden ser más eficientes desde el punto de vista computacional y se
implementan de manera diferente como una pila en cascada.
Secuencia.
Instrucción condicional.
Iteración (bucle de instrucciones) con condición inicial.
Solamente con estas tres estructuras se pueden escribir todos los programas y
aplicaciones posibles. Si bien los lenguajes de programación tienen un mayor
repertorio de estructuras de control, estas pueden ser construidas mediante las
tres básicas citadas.
Historia[editar]
Fundamentación teórica[editar]
El teorema del programa estructurado proporciona la base teórica de la
programación estructurada. Señala que la combinación de las tres estructuras
básicas, secuencia, selección e iteración, son suficientes para expresar
cualquier función computable. Esta observación no se originó con el movimiento
de la programación estructurada. Estas estructuras son suficientes para describir
el ciclo de instrucción de una unidad central de procesamiento, así como el
funcionamiento de una máquina de Turing. Por lo tanto, un procesador siempre
está ejecutando un «programa estructurado» en este sentido, incluso si las
instrucciones que lee de la memoria no son parte de un programa estructurado.
Sin embargo, los autores usualmente acreditan el resultado a un documento
escrito en 1966 por Böhm y Jacopini, posiblemente porque Dijkstra había citado
este escrito.4 El teorema del programa estructurado no responde a cómo escribir y
analizar un programa estructurado de manera útil. Estos temas fueron abordados
durante la década de 1960 y principio de los años 1970, con importantes
contribuciones de Dijkstra, Robert W. Floyd, Tony Hoarey y David Gries.
Debate[editar]
P. J. Plauger, uno de los primeros en adoptar la programación estructurada,
describió su reacción con el teorema del programa estructurado:
Nosotros los conversos ondeamos esta interesante pizca de noticias bajo las
narices de los recalcitrantes programadores de lenguaje ensamblador que
mantuvieron trotando adelante retorcidos bits de lógica y diciendo, 'Te apuesto
que no puedes estructurar esto'. Ni la prueba por Böhm y Jacopini, ni nuestros
repetidos éxitos en escribir código estructurado, los llevaron un día antes de lo que
estaban listos para convencerse.5
Donald Knuth aceptó el principio de que los programas deben adaptarse con
asertividad, pero no estaba de acuerdo (y aún está en desacuerdo)[cita requerida] con la
supresión de la sentencia GOTO. En su escrito de 1974 «Programación
estructurada con sentencias Goto», dio ejemplos donde creía que un salto directo
conduce a código más claro y más eficiente sin sacrificar demostratividad. Knuth
propuso una restricción estructural más flexible: debe ser posible establecer un
diagrama de flujo del programa con todas las bifurcaciones hacia adelante a la
izquierda, todas las bifurcaciones hacia atrás a la derecha, y sin bifurcaciones que
se crucen entre sí. Muchos de los expertos en teoría de grafos y compiladores han
abogado por permitir solo grafos de flujo reducible[¿quién?][¿cuándo?].
Los teóricos de la programación estructurada se ganaron un aliado importante en
la década de 1970 después de que el investigador de IBM Harlan Mills aplicara su
interpretación de la teoría de la programación estructurada para el desarrollo de un
sistema de indexación para el archivo de investigación del New York Times. El
proyecto fue un gran éxito de la ingeniería, y los directivos de otras empresas lo
citaron en apoyo de la adopción de la programación estructurada, aunque Dijkstra
criticó las maneras en que la interpretación de Mills difería de la obra publicada.
Habría que esperar a 1987 para que la cuestión de la programación estructurada
llamara la atención de una revista de ciencia de la computación. Frank Rubin lo
hizo en ese año, con el escrito: «¿“La sentencia GOTO considerada dañina” se
considera dañina?». A este le siguieron numerosas objeciones, como una
respuesta del propio Dijkstra que criticaba duramente a Rubin y las concesiones
que otros autores hicieron cuando le respondieron.
Resultado[editar]
A finales del siglo XX, casi todos los científicos están convencidos de que es útil
aprender y aplicar los conceptos de programación estructurada. Los lenguajes de
programación de alto nivel que originalmente carecían de estructuras de
programación, como FORTRAN, COBOL y BASIC, ahora las tienen.
Los programas son más fáciles de entender, pueden ser leídos de forma
secuencial y no hay necesidad de tener que rastrear saltos de líneas
(GOTO) dentro de los bloques de código para intentar entender la lógica
interna.
La estructura de los programas es clara, puesto que las instrucciones
están más ligadas o relacionadas entre sí.
Se optimiza el esfuerzo en las fases de pruebas y depuración. El
seguimiento de los fallos o errores del programa (debugging), y con él
su detección y corrección, se facilita enormemente.
Se reducen los costos de mantenimiento. Análogamente a la
depuración, durante la fase de mantenimiento, modificar o extender los
programas resulta más fácil.
Los programas son más sencillos y más rápidos de confeccionar.
Se incrementa el rendimiento de los programadores.
Nuevos paradigmas[editar]
Con posterioridad a la programación estructurada se han creado nuevos
paradigmas tales como la programación modular, la programación orientada a
objetos, la programación por capas y otras, así como nuevos entornos de
programación que facilitan la programación de grandes aplicaciones y sistemas.
Herramientas
Introducción[editar]
Los objetos son entidades que tienen un determinado estado, comportamiento e
identidad:
Origen[editar]
Los conceptos de la POO tienen origen en Simula 67, un lenguaje diseñado para
hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard, del Centro de
Cómputo Noruego en Oslo. En este centro se trabajaba en simulaciones de naves,
que fueron confundidas por la explosión combinatoria de cómo las diversas
cualidades de diferentes naves podían afectar unas a las otras. La idea surgió al
agrupar los diversos tipos de naves en diversas clases de objetos, siendo
responsable cada clase de objetos de definir sus "propios" datos y
comportamientos. Fueron refinados más tarde en Smalltalk, desarrollado en
Simula en Xerox PARC (cuya primera versión fue escrita sobre Basic) pero
diseñado para ser un sistema completamente dinámico en el cual los objetos se
podrían crear y modificar "sobre la marcha" (en tiempo de ejecución) en lugar de
tener un sistema basado en programas estáticos.
La POO se fue convirtiendo en el estilo de programación dominante a mediados
de los años 1980, en gran parte debido a la influencia de C++, una extensión
del lenguaje de programación C. Su dominación fue consolidada gracias al auge
de las interfaces gráficas de usuario, para las cuales la POO está particularmente
bien adaptada. En este caso, se habla también de programación dirigida por
eventos.
Las características de orientación a objetos fueron agregadas a muchos lenguajes
existentes durante ese tiempo, incluyendo Ada, BASIC, Lisp más Pascal, entre
otros. La adición de estas características a los lenguajes que no fueron diseñados
inicialmente para ellas condujo a menudo a problemas de compatibilidad y en la
capacidad de mantenimiento del código. Los lenguajes orientados a objetos
"puros", por su parte, carecían de las características de las cuales muchos
programadores habían venido a depender. Para saltar este obstáculo, se hicieron
muchas tentativas para crear nuevos lenguajes basados en métodos orientados a
objetos, pero permitiendo algunas características imperativas de maneras
"seguras". El lenguaje de programación Eiffel de Bertrand Meyer fue un temprano
y moderadamente acertado lenguaje con esos objetivos, pero ahora ha sido
esencialmente reemplazado por Java, en gran parte debido a la aparición
de Internet y a la implementación de la máquina virtual Java en la mayoría
de navegadores web. PHP en su versión 5 se ha modificado; soporta una
orientación completa a objetos, cumpliendo todas las características propias de la
orientación a objetos.
Historia[editar]
UML notation for a class. This Button class has variables for
data, and functions. Through inheritance a subclass can be created as subset of
the Button class. Objects are instances of a class.
La terminología "objetos" y "orientada" en el sentido moderno de la programación
orientada a objetos hizo su primer aparición en el MIT a finales del 1950s y
principio de 1960s. Ya en 1960 en el entorno del grupo de inteligencia artificial, el
término "objeto" era usado para referirse a elementos (LISP atomos) con
propiedades (atributos);23
Otro ejemplo temprano de programación orientada en el MIT
fue Sketchpad creado por Ivan Sutherland en 1960–1961; en el glosario del
informe técnico de 1963, Sutherland define la noción de "objeto" y de "instancia".
Simula introdujo conceptos importantes que hoy en día son una parte esencial de
la programación orientada a objetos, como clases, objetos, herencia y dynamic
binding.4
Mas recientemente ha surgido una serie de lenguajes que están principalmente
orientados a objetos pero que también son compatibles con la programación
procedural. Dos ejemplos de estos lenguajes son Python y Ruby. Probablemente
los lenguajes orientados a objetos recientes con más importancia comercialmente
son Java, desarrollado por Sun Microsystems y C# junto a Visual
Basic.NET (VB.NET), diseñado por Microsoft's.
Conceptos fundamentales[editar]
La POO es una forma de programar que trata de encontrar una solución a estos
problemas. Introduce nuevos conceptos, que superan y amplían conceptos
antiguos ya conocidos. Entre ellos destacan los siguientes:
Clase
Una clase es una especie de "plantilla" en la que se definen los atributos y
métodos predeterminados de un tipo de objeto. Esta plantilla se crea para
poder crear objetos fácilmente. Al método de crear nuevos objetos
mediante la lectura y recuperación de los atributos y métodos de una clase
se le conoce como instanciación.
Herencia
Por ejemplo, herencia de la clase C a la clase D, es la facilidad mediante la
cual la clase D hereda en ella cada uno de los atributos y operaciones de C,
como si esos atributos y operaciones hubiesen sido definidos por la misma
D. Por lo tanto, puede usar los mismos métodos y variables registrados
como "públicos" (public) en C. Los componentes registrados como
"privados" (private) también se heredan pero se mantienen escondidos al
programador y solo pueden ser accedidos a través de otros métodos
públicos. Para poder acceder a un atributo u operación de una clase en
cualquiera de sus subclases pero mantenerla oculta para otras clases es
necesario registrar los componentes como "protegidos" (protected), de esta
manera serán visibles en C y en D pero no en otras clases.
Objeto
Instancia de una clase. Entidad provista de un conjunto de propiedades o
atributos (datos) y de comportamiento o funcionalidad (métodos), los
mismos que consecuentemente reaccionan a eventos. Se corresponden
con los objetos reales del mundo que nos rodea, o con objetos internos del
sistema (del programa).
Método
Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución
se desencadena tras la recepción de un "mensaje". Desde el punto de vista
del comportamiento, es lo que el objeto puede hacer. Un método puede
producir un cambio en las propiedades del objeto, o la generación de un
"evento" con un nuevo mensaje para otro objeto del sistema.
Evento
Es un suceso en el sistema (tal como una interacción del usuario con la
máquina, o un mensaje enviado por un objeto). El sistema maneja el evento
enviando el mensaje adecuado al objeto pertinente. También se puede
definir como evento la reacción que puede desencadenar un objeto; es
decir, la acción que genera.
Atributos
Características que tiene la clase.
Mensaje
Una comunicación dirigida a un objeto, que le ordena que ejecute uno de
sus métodos con ciertos parámetros asociados al evento que lo generó.
Propiedad o atributo
Contenedor de un tipo de dato asociado a un objeto (o a una clase de
objetos), que hace los datos visibles desde fuera del objeto y esto se define
como sus características predeterminadas, y cuyo valor puede ser alterado
por la ejecución de algún método.
Estado interno
Es una variable que se declara privada, que puede ser únicamente
accedida y alterada por un método del objeto, y que se utiliza para indicar
distintas situaciones posibles para el objeto (o clase de objetos). No es
visible al programador que maneja una instancia de la clase.
Miembros de un objeto
Atributos, identidad, relaciones y métodos.
Identificación de un objeto
Un objeto se representa por medio de una tabla o entidad que esté
compuesta por sus atributos y funciones correspondientes.
En comparación con un lenguaje
imperativo, una "variable" no es más que
un contenedor interno del atributo del
objeto o de un estado interno, así como la
"función" es un procedimiento interno del
método del objeto.
Características de la
POO[editar]
Existe un acuerdo acerca de qué
características contempla la "orientación a
objetos". Las características siguientes son
las más importantes:5
Abstracción
Denota las características esenciales de un objeto, donde se capturan sus
comportamientos. Cada objeto en el sistema sirve como modelo de un
"agente" abstracto que puede realizar trabajo, informar y cambiar su estado,
y "comunicarse" con otros objetos en el sistema sin revelar "cómo" se
implementan estas características. Los procesos, las funciones o los
métodos pueden también ser abstraídos, y, cuando lo están, una variedad
de técnicas son requeridas para ampliar una abstracción. El proceso de
abstracción permite seleccionar las características relevantes dentro de un
conjunto e identificar comportamientos comunes para definir nuevos tipos
de entidades en el mundo real. La abstracción es clave en el proceso de
análisis y diseño orientado a objetos, ya que mediante ella podemos llegar
a armar un conjunto de clases que permitan modelar la realidad o el
problema que se quiere atacar.
Encapsulamiento
Significa reunir todos los elementos que pueden considerarse
pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto
permite aumentar la cohesión (diseño estructurado) de los componentes del
sistema. Algunos autores confunden este concepto con el principio de
ocultación, principalmente porque se suelen emplear conjuntamente.
Polimorfismo
Comportamientos diferentes, asociados a objetos distintos, pueden
compartir el mismo nombre; al llamarlos por ese nombre se utilizará el
comportamiento correspondiente al objeto que se esté usando. O, dicho de
otro modo, las referencias y las colecciones de objetos pueden contener
objetos de diferentes tipos, y la invocación de un comportamiento en una
referencia producirá el comportamiento correcto para el tipo real del objeto
referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última
característica se llama asignación tardía o asignación dinámica. Algunos
lenguajes proporcionan medios más estáticos (en "tiempo de compilación")
de polimorfismo, tales como las plantillas y la sobrecarga de operadores de
C++.
Herencia
Las clases no se encuentran aisladas, sino que se relacionan entre sí,
formando una jerarquía de clasificación. Los objetos heredan las
propiedades y el comportamiento de todas las clases a las que pertenecen.
La herencia organiza y facilita el polimorfismo y el encapsulamiento,
permitiendo a los objetos ser definidos y creados como tipos especializados
de objetos preexistentes. Estos pueden compartir (y extender) su
comportamiento sin tener que volver a implementarlo. Esto suele hacerse
habitualmente agrupando los objetos en clases, y estas en árboles o
enrejados que reflejan un comportamiento común. Cuando un objeto
hereda de más de una clase, se dice que hay herencia múltiple; siendo de
alta complejidad técnica por lo cual suele recurrirse a la herencia virtual
para evitar la duplicación de datos.
Modularidad
Se denomina "modularidad" a la propiedad que permite subdividir una
aplicación en partes más pequeñas (llamadas módulos), cada una de las
cuales debe ser tan independiente como sea posible de la aplicación en sí y
de las restantes partes. Estos módulos se pueden compilar por separado,
pero tienen conexiones con otros módulos. Al igual que la encapsulación,
los lenguajes soportan la modularidad de diversas formas.
Principio de ocultación
Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de
objeto expone una "interfaz" a otros objetos que detalla cómo pueden
interactuar con los objetos de la clase. El aislamiento protege a las
propiedades de un objeto contra su modificación por quien no tenga
derecho a acceder a ellas; solamente los propios métodos internos del
objeto pueden acceder a su estado. Esto asegura que otros objetos no
puedan cambiar el estado interno de un objeto de manera inesperada,
eliminando efectos secundarios e interacciones inesperadas. Algunos
lenguajes relajan esto, permitiendo un acceso directo a los datos internos
del objeto de una manera controlada y limitando el grado de abstracción. La
aplicación entera se reduce a un agregado o rompecabezas de objetos.
Recolección de
basura
La recolección de basura (garbage collection) es la técnica por la cual el
entorno de objetos se encarga de destruir automáticamente, y por tanto
desvincular la memoria asociada, los objetos que hayan quedado sin
ninguna referencia a ellos. Esto significa que el programador no debe
preocuparse por la asignación o liberación de memoria, ya que el entorno la
asignará al crear un nuevo objeto y la liberará cuando nadie lo esté usando.
En la mayoría de los lenguajes híbridos que se extendieron para soportar el
Paradigma de Programación Orientada a Objetos como C++ u Object
Pascal, esta característica no existe y la memoria debe desasignarse
expresamente.
Cabe destacar
que para que un
lenguaje se
pueda tratar
como orientado a
objetos, debe
cumplir que:
Esté b
asado
en
objeto
s, es
decir,
que
tenga
el
concep
to de
objeto
incluido
dentro
del
lenguaj
e base
como
colecci
ón de
atributo
sy
método
s que
reaccio
nan a
evento
s.
Esté b
asado
en
clases,
es
decir,
que
tenga
el
concep
to de
clase.
Permit
a la
aplicaci
ón
de her
encia y
polimo
rfismo.
Críticas[editar
]
El paradigma
POO ha sido
criticado por
varias razones,
incluyendo no
cumplir con las
metas de
reusabilidad y
modularidad,67 y
por
sobreenfatizar un
aspecto de
diseño y
modelación de
software
(datos/objetos) a
expensas de
otros aspectos
importantes
(computación/alg
oritmos).89
Resumen[edi
tar]
La POO es un
paradigma
surgido en
los años 1970,
que utiliza objetos
como elementos
fundamentales en
la construcción
de la solución. Un
objeto es una
abstracción de
algún hecho o
ente del mundo
real, con atributos
que representan
sus
características o
propiedades, y
métodos que
emulan su
comportamiento o
actividad. Todas
las propiedades y
métodos
comunes a los
objetos se
encapsulan o
agrupan en
clases. Una clase
es una plantilla,
un prototipo para
crear objetos; en
general, se dice
que cada objeto
es una instancia
o ejemplar de una
clase.
Tipos[editar]
Para realizar
programación
orientada a
objetos existen 3
corrientes
principales:1011
Basada
en
clases.
- Es la
más
amplia
mente
usada
por los
lenguaj
es de
progra
mación
orienta
da a
objetos
. Por
ejempl
o es
usada
por
Java,
C++ y
C#. Se
basa
en
crear
una
estruct
ura
molde
llamad
a clase
donde
se
especifi
can los
campo
sy
método
s que
tendrán
nuestro
s
objetos
. Cada
vez
que
necesit
amos
un
objeto
creamo
s una
instanci
a (o
copia
del
objeto)
usando
la clase
como
molde.
Basada
en
prototip
os.- Es
soporta
do en
Javasc
ript,
Python
y Ruby.
No hay
clases,
solo
hay
objetos
. El
mecani
smo
para la
reutiliz
ación
está
dado
por
la clon
ación
de
objetos
. Se
crean
directa
mente
los
objetos
y
cuando
se
quiere
genera
r otro
con la
misma
estruct
ura se
usa
clonaci
ón.
Una
vez
clonad
o si
querem
os
podem
os
agrega
r los
campo
sy
método
s
necesa
rios.
Un obj
eto
prototíp
ico es
un
objeto
que se
utiliza
como
una
plantilla
a partir
de la
cual se
obtiene
el
conjunt
o inicial
de
propied
ades
de un
objeto.
Cualqui
er
objeto
puede
ser
utilizad
o como
el
prototip
o de
otro
objeto,
permiti
endo al
segund
o
objeto
compar
tir las
propied
ades
del
primero
.
Basada
en
estruct
uras.-
Soport
ado por
Go,
Rust,
Nim y
alguno
s otros
lenguaj
es
compil
ados.
Este
enfoqu
e está
basado
en la
constru
cción
de
tipos
definid
os por
el
usuario
(struct
type),
llamad
os
estruct
uras
con
sus
respect
ivas
propied
ades o
atributo
s y se
le
añade
una
variabl
e de
tipo
puntero
a las
funcion
es o
método
s de
esa
estruct
ura.
Tiene
soporte
de
método
s
público
sy
privado
s, así
como
Genéri
cos.
Tambié
n tiene
soporte
para
interfac
es;
pilar de
apoyo
para
polimor
fismo y
herenci
a.
Algunos
lenguajes
orientados
a
objetos[editar]
Simula (1967) es
aceptado como el
primer lenguaje
que posee las
características
principales de un
lenguaje
orientado a
objetos. Fue
creado para
hacer programas
de simulación, en
donde los
"objetos" son la
representación de
la información
más importante.
Smalltalk (1972 a
1980) es
posiblemente el
ejemplo
canónico, y con el
que gran parte de
la teoría de la
programación
orientada a
objetos se ha
desarrollado.
Entre los
lenguajes
orientados a
objetos se
destacan los
siguientes:
ABAP12
ABL13
Action
Script
Action
Script 3
C#
Clarion
Clipper
14
D
Object
Pascal
(Embar
cadero
Delphi)
Gamba
s
GObjec
t
Genie
Harbou
r
Eiffel
Fortran
90/95
Java
JavaSc
ript15
Léxico1
6
Objecti
ve-C
Ocaml
Oz
R
Pausca
l (en
españo
l)
Perl1718
Perl 6
PHP19
Power
Script
Proces
sing.20
Python
Ruby
Self
Smallta
lk21
Swift
Magik
Vala
VB.NE
T
Visual
FoxPro
22
Visual
Basic 6
.0
Visual
DataFl
ex
Visual
Objects
XBase
++
DRP
Scala23
24
Muchos de estos
lenguajes de
programación no
son puramente
orientados a
objetos, sino que
son híbridos que
combinan la POO
con otros
paradigmas.
Al igual que C++,
otros lenguajes,
como
OOCOBOL,
OOLisp,
OOProlog
y Object REXX,
han sido creados
añadiendo
extensiones
orientadas a
objetos a un
lenguaje de
programación
clásico.
Un nuevo paso
en la abstracción
de paradigmas de
programación es
la Programación
Orientada a
Aspectos (POA).
Aunque es
todavía una
metodología en
estado de
maduración, cada
vez atrae a más
investigadores e
incluso proyectos
comerciales en
todo el mundo.
PILARES FUNDAMENTALES DE LA PROGRAMACION
1. Abstracción
De este término ya unos párrafos más arriba. ¿Te acuerdas? cuando queríamos
crear un usuario. El proceso de abstracción es pensar que atributos y qué
métodos iba a tener.
Cuando creamos un sistema, tenemos que hacer una abstracción para todas las
clases. Por ejemplo, en EDteam, serían los cursos, las clases, las suscripciones,
las publicaciones en la comunidad. Cada uno de estos elementos sería una clase,
y tenemos que hacer ese proceso mental: qué atributos y qué métodos van a tener
cada uno. Esos conceptos hay que llevarlos y convertirlos en clases.
2. Encapsulamiento
Como ya hemos visto, los objetos se comunican entre ellos. Esto podría traer
problemas de seguridad si un objeto puede modificar los datos de cualquier otro.
Por eso, se necesita proteger la información de manipulaciones no autorizadas.
De esta manera, cuando se comunican los objetos, hay caminos que se pueden
seguir y hay caminos que no, datos protegidos, datos privados o públicos,
métodos para acceder a cierta información, entre otros. Así se mantiene
organizado el sistema.
3. Polimorfismo
Cuando pasas a premium, se notifica vía tres canales en EDteam: slack, web y
correo. La primera es privada para nuestro equipo, mientras que las últimas dos,
es visible para el usuario, confirmándole que ya es premium.
Por ejemplo, si le decimos al tía Alexys y a mí que bailemos, cada uno lo hará de
forma diferente, cada uno a su modo. Sin embargo, nos dieron una orden y lo
cumplimos, aunque a nuestra manera particular. Eso es el polimorfismo, poder
darle la misma orden a diferentes objetos y que cada uno de ellos respondan a su
propia manera.
4. Herencia
Este pilar de la POO es, quizás, el más fácil de entender porque tiene relación con
el mundo real. Por ejemplo, mis hijos han heredado muchas cosas de mí, tanto
atributos como funcionalidades. En atributos, podemos decir que el color de ojos,
el cabello o el color de piel. En la funcionalidad, el carácter o personalidad. Sin
embargo, ninguno es una copia exacta de mí. Sobre esas cosas que han
heredado, tienen sus propios atributos y funcionalidad.
Por ejemplo, si tenemos una clase para crear usuarios genéricos, pero luego
necesitamos un usuario diferente, de staff, solamente para el equipo de EDteam y
que tenga diferentes funcionalidades y atributos que un usuario normal ¿Qué
podemos hacer? crear una nueva clase que herede de la clase padre, y esa sería
el staff.
Sin embargo, los lenguajes modernos como C#, Java o... en realidad casi
cualquiera, utilizan otros paradigmas para definir los programas. Entre éstos,
el paradigma más popular es el que se refiere a la Programación
Orientada a Objetos o POO.
En este paradigma, los programas se modelan en torno a objetos que
aglutinan toda la funcionalidad relacionada con ellos. De este modo en lugar
de crear una serie de funciones sin conexión alguna entre ellas, en POO se
crean clases, que representan entidades que quieres manejar en tu
programa. Por ejemplo, facturas, líneas de factura, clientes, coches... o
cualquier entidad que necesites gestionar conceptualmente. En ese sentido, la
POO gira más en torno a los datos que en torno a la lógica , que se
delega a un segundo plano, ya que forma parte de dichos datos como veremos
enseguida.
La POO puede resultar confusa para mucha gente al principio, cuando se
entra en contacto con ella. Por eso me he animado a grabar el vídeo que
tienes al principio, y a escribir este artículo, en los que te voy a explicar con las
palabras más sencillas posibles los principales conceptos de la
Programación Orientada a Objetos, independientemente del lenguaje de
programación que utilices.
La clase define de forma genérica cómo son las personas, y los objetos
son personas concretas.
La POO es muy potente porque nos permite modelar de manera sencilla datos
y comportamientos complejos del mundo real. Al poder manejar los datos y
los comportamientos de cada objeto de manera independiente nos evita tener
que mantener datos globales y coordinar todo eso. En su momento fue una
verdadera revolución.
Vamos a verlos
Pilar 1: Encapsulación
Pilar 2: Abstracción
Este concepto está muy relacionado con el anterior.
Así, una clase (y por lo tanto todos los objetos que se crean a partir de ella)
debe exponer para su uso solo lo que sea necesario. Cómo se haga "por
dentro" es irrelevante para los programas que hagan uso de los objetos de esa
clase.
Otro ejemplo incluso más claro podría ser la acción Hablar(). Ésta puede
suponer que se genere una voz sintética a partir de un texto que se le indica
como parámetro de la acción para lo cual quizá ocurran un montón de cosas:
se llama a un componente para síntesis de voz que está en la nube, se lanza la
síntesis de voz en el dispositivo local de audio y se anota en una base de datos
la frase que se ha pronunciado para guardar un histórico entre otras cosas.
Pero todo esto es indiferente para el programa que hace uso de esta
funcionalidad. El programa simplemente tiene acceso a un objeto Cristina y
llama a la función Hablar(). No tiene ni idea de toda la complejidad interna
que puede suponer. Si mañana cambiamos el modo de sintetizar la voz o
cualquier otra acción interna, es indiferente para el programa que usa
nuestros objetos de tipo Persona.
Por ejemplo, los objetos de la clase Pirata tienen un método nuevo que
es Abordar() que en el juego sirve para asaltar un barco enemigo. Pero
además presentan una propiedad que solo tienen los piratas
llamada Sobrenombre, que es el nombre por el que se les conoce (un pirata
puede ser de nombre Hızır y de apellido bin Yakup pero su sobrenombre
es Barbaroja).
frase y que así parezca más un pirata 😆. Para que el pirata hable no tendríamos
que volver a hacer todo el código relacionado con hablar. Eso ya sabe cómo
hacerlo por el mero hecho de ser una persona (por heredar de la
clase Persona). Lo único que tendríamos que hacer es añadir esas
interjecciones de pirata a la frase y luego delegar la síntesis de voz y todo lo
demás a la clase base. Sería facilísimo y conseguiríamos consistencia entre
todas las clases a la hora de particularizar la forma de hablar.
La herencia es una de las características más potentes de la POO ya que
fomenta la reutilización del código permitiendo al mismo tiempo la
particularización o especialización del mismo.
Pilar 4: Polimorfismo
Cada lenguaje tiene su sintaxis específica para crear objetos y expresar los
cuatro pilares, pero estos conocimientos genéricos te valdrán para cualquiera
de ellos. La próxima vez que te los pregunten en una entrevista de trabajo
diego.coder
·
Follow
5 min read
·
Aug 24, 2022
10
Photo by Chris Ried on Unsplash
Análisis de la solución.
Tabla de contenidos
¡Vamos a aprender!
secret_number = 20
while True:
number = input('Guess the number: ')
try:
number = int(number)
except:
print('Sorry that is not a number')
continue
if number != secret_number:
if number > secret_number:
print(number, 'is greater than the secret number')
Clasificar los temas considerados «básicos» puede ser difícil. Por ello, hemos
diseñado una hoja de trucos con los principales conceptos necesarios para aprender
programación orientada a objetos en Python.
Variable: Nombre simbólico que apunta a un objeto específico (veremos
qué significan los objetos a lo largo del artículo).
Operadores aritméticos: Suma (+), resta (-), multiplicación (*), división
(/), división entera (//), módulo (%).
Tipos de datos incorporados: Numéricos (enteros, flotantes, complejos),
Secuencias (cadenas, listas, tuplas), Booleanos (Verdadero, Falso),
Diccionarios y Conjuntos.
Expresiones booleanas: Expresiones en las que el resultado
es True o False.
Condicional: Evalúa una expresión booleana y realiza algún proceso
dependiendo del resultado. Se maneja mediante sentencias if/else.
Bucle: Ejecución repetida de bloques de código. Pueden ser
bucles for o while.
Funciones: Bloque de código organizado y reutilizable. Se crean con la
palabra clave def.
Argumentos: Objetos que se pasan a una función. Por ejemplo: sum([1,
2, 4])
Ejecuta un script de Python: Abre un terminal o línea de comandos y
escribe «python <nombre del archivo>».
Abre un shell de Python: Abre un terminal y
escribe python o python3 dependiendo de tu sistema.
Ahora que tienes estos conceptos muy claros, puedes avanzar en la comprensión
de la programación orientada a objetos.
Java
PHP (asegúrate de leer la comparación entre PHP y Python)
Ruby
Javascript
C#
Kotlin
Codificar más rápido no significa escribir menos líneas de código. Significa que
puedes implementar más funciones en menos tiempo sin comprometer la
estabilidad de un proyecto.
Una vez que tengas algo de experiencia con la POO, podrás pensar en los
problemas como objetos pequeños y específicos.
small = 2
regular = 5
big = 6
try:
user_budget = int(user_budget)
except:
print('Please enter a number')
exit()
if user_budget > 0:
if user_budget >= big:
print('You can afford the big coffee')
if user_budget == big:
print('It\'s complete')
else:
print('Your change is', user_budget - big)
elif user_budget == regular:
print('You can afford the regular coffee')
print('It\'s complete')
elif user_budget >= small:
print('You can buy the small coffee')
if user_budget == small:
print('It\'s complete')
else:
print('Your change is', user_budget - small)
class Coffee:
# Constructor
def __init__(self, name, price):
self.name = name
self.price = float(price)
def check_budget(self, budget):
# Check if the budget is valid
if not isinstance(budget, (int, float)):
print('Enter float or int')
exit()
if budget < 0:
print('Sorry you don\'t have money')
exit()
def get_change(self, budget):
return budget - self.price
small = Coffee('Small', 2)
regular = Coffee('Regular', 5)
big = Coffee('Big', 6)
try:
user_budget = float(input('What is your budget? '))
except ValueError:
exit('Please enter a number')
Pequeños trozos de código reutilizados en muchos Una gran cantidad de código en pocos
lugares lugares
Atributos y métodos
Los atributos son variables internas dentro de los objetos, mientras que los
métodos son funciones que producen algún comportamiento.
Shell de Python
Ahora, vamos a trabajar con el shell de Python para descubrir métodos y tipos.
>>> kinsta
'Kinsta, Premium Application, Database, and Managed WordPress hosting'
>>> type(kinsta)
# class 'str'
>>> dir(kinsta)
['__add__', '__class__', ........... 'upper', 'zfill']
Esto devolverá la clase a la que pertenece el objeto kinsta. Así que podemos
decir que lo único que devuelve la función type es el atributo __class__ de un
objeto.
Puedes experimentar con todos los tipos de datos, descubriendo todos sus
atributos y métodos directamente en el terminal. Puedes obtener más información
sobre los tipos de datos incorporados en la documentación oficial.
Tu primer objeto en Python
Una clase es como una plantilla. Te permite crear objetos personalizados basados
en los atributos y métodos que definas.
Puedes pensar en él como un cortador de galletas que modificas para hornear
las galletas perfectas (objetos, no galletas de seguimiento), con características
definidas: Forma, tamaño y otros.
Por otro lado, tenemos las instancias. Una instancia es un objeto individual de
una clase, que tiene una dirección de memoria única.
Instancias en Python
Ahora que sabes lo que son las clases y las instancias, ¡definamos algunas!
Para definir una clase en Python, se utiliza la palabra clave class, seguida de su
nombre. En este caso, crearás una clase llamada Cookie.
Nota: En Python, utilizamos la convención de nombres en mayúsculas para nombrar
las clases.
class Cookie:
pass
Abre tu shell de Python y escribe el código anterior. Para crear una instancia de
una clase, solo tienes que escribir su nombre y un paréntesis después. Es el
mismo proceso que invocar una función.
cookie1 = Cookie()
type(cookie1)
<class '__main__.Cookie'>
isinstance(cookie1, Cookie)
# True
isinstance(cookie1, int)
# False
isinstance('a string', Cookie)
# False
Método constructor
El método __init__() también se llama «constructor». Es llamado por Python
cada vez que instanciamos un objeto.
El constructor crea el estado inicial del objeto con el conjunto mínimo de
parámetros que necesita para existir. Modifiquemos la clase Cookie, para que
acepte parámetros en tu constructor.
class Cookie:
# Constructor
def __init__(self, name, shape, chips='Chocolate'):
# Instance attributes
self.name = name
self.shape = shape
self.chips = chips
En la clase Cookie, cada cookie debe tener un nombre, una forma y unas virutas.
Hemos definido esta última como «Chocolate».
Por otro lado, self se refiere a la instancia de la clase (el objeto en sí).
Para acceder a los atributos de una instancia, debes utilizar la notación de puntos.
cookie2.name
# 'Awesome cookie'
cookie2.shape
# 'Star'
cookie2.chips
# 'Chocolate'
Por ahora, la clase Cookie no tiene nada demasiado jugoso. Vamos a añadir un
método de ejemplo bake() para hacer las cosas más interesantes.
class Cookie:
# Constructor
def __init__(self, name, shape, chips='Chocolate'):
# Instance attributes
self.name = name
self.shape = shape
self.chips = chips
1. Abstracción
Cuadrado
Rectángulo
Triángulo
Círculo
Hexágono
Clase de base de la forma
En primer lugar, crea un archivo calculator.py y ábrelo. Como ya tenemos los
objetos para trabajar, será fácil abstraction en una clase.
Puedes analizar las características comunes y descubrir que todas ellas
son formas 2D. Por lo tanto, la mejor opción es crear una clase Shape con un
método get_area() del que heredará cada forma.
Nota: Todos los métodos deben ser verbos. Eso es porque este método se
llama get_area() y no area().
class Shape:
def __init__(self):
pass
def get_area(self):
pass
El código anterior define la clase; sin embargo, todavía no hay nada interesante
en ella.
class Shape:
def __init__(self, side1, side2):
self.side1 = side1
self.side2 = side2
def get_area(self):
return self.side1 * self.side2
def __str__(self):
return f'The area of this {self.__class__.__name__} is:
{self.get_area()}'
Clase cuadrada
Podemos hacer una excelente aproximación al polimorfismo con la
clase Square.
Recuerda que un cuadrado es solo un rectángulo cuyos cuatro lados son iguales.
Eso significa que podemos utilizar la misma fórmula para obtener el área.
# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle):
def __init__(self, side):
super().__init__(side, side)
Como puedes ver, la función super pasa el parámetro side dos veces a
la superclase. En otras palabras, está pasando side tanto
como side1 como side2 al constructor previamente definido.
Clase de triángulo
# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle):
def __init__(self, base, height):
super().__init__(base, height)
def get_area(self):
area = super().get_area()
return area / 2
# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def get_area(self):
return pi * (self.radius ** 2)
# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
class Circle(Shape): …
def get_area(self):
return (3 * sqrt(3) * self.side1 ** 2) / 2
breakpoint()
Ahora, ejecuta el archivo Python y juega con las clases que has creado.
$ python calculator.py
Resumen
La programación orientada a objetos es un paradigma en el que resolvemos
problemas pensando en ellos como objetos. Si entiendes la POO de Python,
también puedes aplicarla fácilmente en lenguajes como Java, PHP, Javascript
y C#.
Consigue todas tus aplicaciones, bases de datos, and Sitios de WordPress online y bajo
un mismo techo. Nuestra plataforma en la nube de alto rendimiento y repleta de
funciones incluye:
Fácil configuración y gestión en el panel de MyKinsta
Soporte experto 24/7
El mejor hardware y red de Google Cloud Platform, con tecnología
Kubernetes para una escalabilidad máxima
Una integración de Cloudflare a nivel empresarial para mayor velocidad y
seguridad
Alcance de audiencia global con hasta 35 centros de datos y 260 PoPs en
todo el mundo
Empieza con una prueba gratuita de nuestro Alojamiento de
Aplicaciones o Alojamiento de Bases de Datos. Explora nuestros %planes o habla con
el departamento de ventas para encontrar el que mejor se adapte a ti.
¿Qué diferencia hay entre programación del lado del servidor y procesamiento del
lado del cliente?
Ahora ya has aprendido que el código de lado-servidor se ejecuta en
un servidor web y que su papel principal es controlar qué información se envía al
usuario (mientras que el código de lado-cliente gestiona principalmente la
estructura y presentación de esos datos al usuario).
En este artículo, definimos el desarrollo del lado del cliente y del lado del servidor y
exploramos las diferencias entre ambos.
¿Qué es el desarrollo de la relación con
el cliente?
La parte de un sitio web que desarrolla un desarrollador del lado del cliente es la
parte con la que el usuario puede interactuar. Un programa del lado del cliente es el
que se ejecuta en un cliente o dispositivo de usuario. Los desarrolladores del lado
del cliente se centran en desarrollar la parte del front-end de un sitio web que los
usuarios pueden ver. Además del desarrollo del lado del cliente, los desarrolladores
del lado del cliente también pueden denominarse desarrolladores del front-end. Los
desarrolladores del lado del cliente realizan una serie de actividades, entre ellas:
Guiones
La forma en que se ejecutan los scripts es otra diferencia entre el desarrollo del lado
del cliente y del lado del servidor. En los scripts del lado del cliente, los scripts
simplemente se ejecutan en un dispositivo. A menudo, los scripts del lado del cliente
se ejecutan en un navegador. Los scripts del lado del servidor, sin embargo, se
ejecutan en un servidor web. El desarrollo del lado del cliente y del lado del servidor
también utilizan algunos lenguajes de scripting diferentes. Los lenguajes de scripting
del lado del cliente más comunes son JavaScript y jQuery, y algunos lenguajes de
scripting del lado del servidor más comunes son Python y PHP.
Propósitos
El desarrollo del lado del cliente y del lado del servidor también tienen propósitos
diferentes. El objetivo principal del desarrollo del lado del cliente es crear los
efectos visuales de los sitios web, incluidos los diseños, las interfaces de usuario, la
validación de formularios y otros elementos visuales. El desarrollo del lado del
servidor, sin embargo, se centra más en el contenido real de una página web, y
realiza tareas como la interacción con bases de datos y la recuperación de
información de un servidor web.
Seguridad
Los programas del lado del cliente y del lado del servidor también tienen diferentes
niveles de seguridad. Los programas del lado del cliente tienden a ser menos
seguros, ya que los usuarios suelen poder verlos e interactuar con ellos. Sin
embargo, como los usuarios no pueden ver ni interactuar con el código fuente del
lado del servidor, los programas del lado del servidor suelen tener niveles de
seguridad más altos que los del lado del cliente.