Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 72

Programación estructurada

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.

Representación gráfica de los tres patrones básicos (secuencia, selección y


repetición) utilizando diagramas NS (azul) y diagramas de flujo (verde).
Subrutinas[editar]
Subrutinas son las unidades a las que se puede llamar, como procedimientos,
funciones, métodos o subprogramas. Se utilizan para permitir que una sola
declaración haga referencia a una secuencia.
Bloques[editar]
Los bloques se utilizan para permitir que grupos de declaraciones se traten como
si fueran una sola declaración. Los lenguajes "estructurados en bloques" tienen
una sintaxis para encerrar estructuras de alguna manera formal, como una
declaración if entre paréntesis. if..fi como en ALGOL 68, o una sección de
código entre corchetes BEGIN..END , como en PL/I y Pascal, sangría de espacio en
blanco como en Python, o las llaves {...} de C y muchos lenguajes posteriores.

Orígenes de la programación estructurada[editar]


A finales de los años 1970 surgió una nueva forma de programar que no
solamente permitía desarrollar programas fiables y eficientes, sino que además
estos estaban escritos de manera que se facilitaba su comprensión en fases de
mejora posteriores.
El teorema del programa estructurado, propuesto por Böhm-Jacopini, demuestra
que todo programa puede escribirse utilizando únicamente las tres instrucciones
de control siguientes:

 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.

Ventajas de la programación estructurada[editar]


Entre las ventajas de la programación estructurada sobre el modelo anterior (hoy
llamado despectivamente código espagueti), cabe citar las siguientes:

 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.

Lenguajes de programación estructurada[editar]


Si bien es posible desarrollar la programación estructurada en cualquier lenguaje
de programación, resulta más idóneo un lenguaje de programación procedimental.
Algunos de los lenguajes utilizados inicialmente para programación estructurada
incluyen ALGOL, Pascal, PL/I y Ada, pero la mayoría de los nuevos lenguajes de
programación procedimentales desde entonces han incluido características para
fomentar la programación estructurada y a veces, deliberadamente, omiten
características6 en un esfuerzo para hacer más difícil la programación no
estructurada.

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.

Programación orientada a objetos


77 idiomas
 Artículo
 Discusión
 Leer
 Editar
 Ver historial

Herramientas












Este artículo o sección necesita referencias que aparezcan en una publicación


acreditada.
Este aviso fue puesto el 14 de febrero de 2015.

La programación orientada a objetos (POO, en español); es un paradigma de


programación que parte del concepto de "objetos" como base, los cuales
contienen información en forma de campos (a veces también referidos
como atributos o propiedades) y código en forma de métodos.
Los objetos son capaces de interactuar y modificar los valores contenidos en sus
campos o atributos (estado) a través de sus métodos (comportamiento).1
Muchos de los objetos prediseñados de los lenguajes de programación actuales
permiten la agrupación en bibliotecas o librerías, sin embargo, muchos de estos
lenguajes permiten al usuario la creación de sus propias bibliotecas.
Algunas características clave de la programación orientada a objetos
son herencia, cohesión, abstracción, polimorfismo, acoplamiento y encapsulamient
o.
Su uso se popularizó a principios de la década de 1990. En la actualidad, existe
una gran variedad de lenguajes de programación que soportan la orientación a
objetos, estando la mayoría de éstos basados en el concepto
de clases e instancias.

Introducción[editar]
Los objetos son entidades que tienen un determinado estado, comportamiento e
identidad:

 La identidad es una propiedad de un objeto que lo diferencia del resto;


dicho con otras palabras, es su identificador (concepto análogo al de
identificador de una variable o una constante).

 Los métodos y campos están estrechamente relacionados por la


propiedad de conjunto. Esta propiedad destaca que una clase requiere
de métodos para poder tratar los campos con los que cuenta.
La programación orientada a objetos difiere de la programación
estructurada tradicional, en la que los datos y los procedimientos están separados
y sin relación, ya que lo único que se busca es el procesamiento de unos datos de
entrada para obtener otros de salida. La programación estructurada prima el
concepto de procedimientos o funciones sobre el de estructuras (se emplean
principalmente funciones que procesan datos). La programación orientada a
objetos, en cambio, primero se definen los objetos o estructuras para
posteriormente solicitar la ejecución de sus métodos.

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.

Imagínate que cualquier objeto pueda acceder a cualquier información sin


autorización, puede ocasionar cambios indebidos, que puede hacer que todo el
sistema colapse y se caiga.

3. Polimorfismo

Volvamos a recordar el esquema del tío Alexys convirtiéndose en premium.

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.

Si te das cuenta, es la misma funcionalidad (notificación), aunque internamente


cada uno de esos métodos funciona diferente. Es decir, la notificación de Slack
tiene su propia API, métodos y lógica, igual para la web y el correo. Pero en
esencia, es la misma acción. Eso nos simplifica mucho el trabajo porque podemos
dar ordenes coherentes a varios objetos sin preocuparnos cómo se ejecutarán.

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.

Es lo mismo que en la programación orientad a objetos. Tenemos una clase


padre, y las clases hijas heredan funcionalidades y atributos, pero no son
idénticas. Solamente aprovechan eso que ya existen y luego se le añaden nuevas
cosas.

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.

Si luego necesitamos otro usuario que sea profesor, entonces heredamos de la


clase usuario y creamos la clase profesor, y de allí, creamos todos los usuarios de
profesores del equipo. Ahora bien, si queremos meter invitados a la página,
personas que sin pagar una suscripción puedan tener acceso a los sorteos o
campañas, podemos crear un rol de invitados. Y así funciona la herencia en la
POO.

Ahora que entiendes qué es la programación orientada a objetos y sus principales


pilares, es momento que des el siguiente paso y te conviertas en un experto con
nuestro curso de POO, en el que aprenderás a comprender la POO, abstraer
problemas en objetos y aplicar este paradigma en distintos lenguajes. Toma
nuestro curso Programación orientada a objetos y #NoTeDetengas.
Los conceptos
fundamentales sobre
Programación Orientada
Objetos explicados de
manera simple
Por José Manuel Alarcón

De la arquitectura al despliegue: aprende a crear aplicaciones web desde

cero con ☕Java y 🍃Spring.

Los lenguajes de programación antiguos, como C, Basic o COBOL, seguían un


estilo procedimental a la hora de escribir código. Es decir, los programas
escritos en estos lenguajes consistían en una serie de instrucciones, una detrás
de otra, que se ejecutaban paso a paso. Para "encerrar" funcionalidad y poder
reutilizarla definían procedimientos (también llamados subrutinas o
funciones), pero se usaban datos globales y era muy complicado aislar los
datos específicos unos de otros. Podríamos decir que este tipo de lenguajes se
centraban más en la lógica que en los datos.

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.

Clases, objetos e instancias


El primer concepto y más importante de la POO es la distinción entre clase
y objeto.
Una clase es una plantilla. Define de manera genérica cómo van a ser los
objetos de determinado tipo. Por ejemplo, en un juego, una clase para
representar a personas puede llamarse Persona y tener una serie
de atributos como Nombre, Apellidos o Edad (que normalmente son
propiedades), y una serie de comportamientos que pueden tener,
como Hablar(), Caminar() o Comer() y que se implementan como métodos de
la clase (funciones).
Una clase por sí sola no sirve de nada, pues no es más que un concepto, sin
entidad real. Para poder utilizar una clase en un programa lo que hay que
hacer es instanciarla. Instanciar una clase consiste en crear un nuevo
objeto concreto de la misma. Es decir, un objeto es ya una entidad
concreta que se crea a partir de la plantilla que es la clase. Este nuevo objeto
tiene ya "existencia" real, puesto que ocupa memoria y se puede utilizar en el
programa. Así un objeto puede ser una persona que se llama Cristina López,
de 37 años y que en nuestro programa podría hablar, caminar o comer, que
son los comportamientos que están definidos en la clase.

Una imagen vale más que mil palabras:


De este modo, si tenemos que manejar personas podemos ir creándolas a
medida que las necesitemos, y actuar sobre ellas individualmente. Cada una
tiene sus propios datos y sus propias acciones.

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.

Los cuatro pilares de la POO


Lo anterior por si solo es estupendo. Sin embargo, no es suficiente. Para poder
manejar de manera eficiente las clases y los objetos que se generan con la
Programación Orientada a Objetos son necesarios algunos principios que nos
ayudarán a reducir la complejidad, ser más eficientes y evitar problemas. Son
los 4 pilares de la POO. Todos los lenguajes orientados a objetos los
implementan de una u otra manera, y es indispensable conocerlos bien.
Curso de Blazor: ¡Utiliza C# desde JavaScript, y JavaScript desde C#! 🤯

Vamos a verlos

Pilar 1: Encapsulación

El concepto de encapsulación es el más evidente de todos. Pero, precisamente


por su sencillez, a veces pasa inadvertido.

La encapsulación es la característica de un lenguaje POO que permite que


todo lo referente a un objeto quede aislado dentro de éste . Es decir,
que todos los datos referentes a un objeto queden "encerrados" dentro de
éste y sólo se puede acceder a ellos a través de los miembros que la clase
proporcione (propiedades y métodos).

Por ejemplo, en el caso de las personas que estábamos viendo, toda la


información sobre éstas (nombre, apellidos, edad... y cualquier otro dato
interno que se utilice y que no necesariamente se ve desde el exterior del
objeto) está circunscrito al ámbito de dicha persona.

Así, internamente tenemos un dato que es el nombre de la persona y


accedemos a él a través de la propiedad pública Nombre que define la clase que
representa a las personas. De este modo damos acceso sólo a lo que nos
interese y del modo que nos interese. En un lenguaje tradicional tendríamos
que montar alguna estructura global para almacenar esa información y luego
acceder ordenadamente a ella, sin mezclar los datos de una persona con los
de otra.

Gracias a la encapsulación, toda la información de un objeto está


contenida dentro del propio objeto.

Pilar 2: Abstracción
Este concepto está muy relacionado con el anterior.

Como la propia palabra indica, el principio de abstracción lo que implica es


que la clase debe representar las características de la entidad hacia el
mundo exterior, pero ocultando la complejidad que llevan aparejada. O
sea, nos abstrae de la complejidad que haya dentro dándonos una serie de
atributos y comportamientos (propiedades y funciones) que podemos usar sin
preocuparnos de qué pasa por dentro cuando lo hagamos.

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.

En nuestro ejemplo de las personas en un juego, puede ser que tengamos un


dato interno que llamamos energía y que nunca es accesible directamente
desde fuera. Sin embargo, cada vez que la persona anda (o corre, si
tuviésemos un método para ello) gasta energía y el valor de este dato
disminuye. Y cuando la persona come, el valor sube en función de lo que haya
comido.

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.

La abstracción está muy relacionada con la encapsulación, pero va un


paso más allá pues no sólo controla el acceso a la información, sino
también oculta la complejidad de los procesos que estemos
implementando.
Pilar 3: Herencia
Desde el punto de vista de la genética, cuando una persona obtiene de sus
padres ciertos rasgos (el color de los ojos o de la piel, una enfermedad
genética, etc...) se dice que los hereda. Del mismo modo en POO cuando
una clase hereda de otra obtiene todos los rasgos que tuviese la
primera.
Dado que una clase es un patrón que define cómo es y cómo se comporta una
cierta entidad, una clase que hereda de otra obtiene todos los rasgos de la
primera y añade otros nuevos y además también puede modificar
algunos de los que ha heredado.
A la clase de la que se hereda se le llama clase base, y a la clase que hereda
de ésta se le llama clase derivada.

Así, en nuestro juego que involucra personas, podemos tener clases de


personas más especializadas para representar personajes especiales del
juego. Por ejemplo, podríamos definir clases
como Pirata, Piloto o Estratega que heredan de la clase Persona. Todos los
objetos de estas clases heredan las propiedades y los métodos de Persona,
pero pueden particularizar algunos de ellos y además añadir cosas propias.

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).

No solo eso. Lo bueno de la herencia es que podemos reutilizar todo lo que


tuviésemos en la clase base. Supongamos que en nuestro juego, los piratas
hablan de forma diferente a los demás. El método Hablar() se modifica para
que le añada un ¡Arrrr! o un ¡Por todos los demonios! aleatoriamente a la

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

La palabra polimorfismo viene del griego "polys" (muchos) y "morfo" (forma), y


quiere decir "cualidad de tener muchas formas".

En POO, el concepto de polimorfismo se refiere al hecho de que varios


objetos de diferentes clases, pero con una base común, se pueden
usar de manera indistinta, sin tener que saber de qué clase exacta son
para poder hacerlo.

Supongamos que en nuestro juego tenemos un montón de personajes que


están juntos en un mismo escenario. Hay varios piratas, algunos estrategas y
un montón de otros tipos de personas. En un momento dado necesitamos que
todos se pongan a hablar. Cada uno lo hace de una forma diferente, ya que
son tipos de personajes distintos. Sería algo bastante tedioso tener que
localizar primero a los de un tipo y hacerlos hablar, lo luego a los de otro y así
sucesivamente. La idea es que puedas tratarlos a todos como personas,
independientemente del tipo específico de persona que sean y simplemente
decirles que hablen.

Al derivar todos de la clase Persona todos pueden hablar, y al llamar al


método Hablar() de cada uno de ellos se utilizará el proceso adecuado según
el tipo (los piratas meterán sus expresiones adicionales que hemos visto, los
pilotos dirán "Entrando en pista" o lo que sea, y los estrategas añadirán a todo
"Déjame que lo piense bien"). Todo esto de manera transparente para el
programador. Esto es el polimorfismo.

De hecho, el polimorfismo puede ser más complicado que eso ya que se


puede dar también mediante la sobrecarga de métodos y, sobre todo, a través
del uso de interfaces, pero el concepto es el que acabo de explicar.

El polimorfismo nos permite utilizar a los objetos de manera genérica,


aunque internamente se comporten según su variedad específica.
Gracias a estos cuatro principios que cumplen todos los lenguajes
orientados a objetos se facilita mucho la programación de ciertos tipos de
problemas, se minimizan errores, se escribe código más rápido y se puede
mantener más fácilmente cuando haya modificaciones en el futuro.

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

seguro que ya no tienes problema para explicarlos 😊

¡Espero que te resulte útil!


Fundamentos de la
programación orientada a
objetos (POO)

diego.coder
·
Follow
5 min read
·
Aug 24, 2022

10
Photo by Chris Ried on Unsplash

Artículo básico de programación orientada a objetos.


Fundamentos, composición y comportamientos.

Antes de comenzar, ¿Qué es un Paradigma de


programación?
Los paradigmas de programación pueden ser entendidos como
patrones de pensamiento para la construcción de programas y
resolución de problemas. Un paradigma de programación es
básicamente un marco de trabajo que contiene un conjunto de
normas, conceptos y comportamiento a seguir.

En la actualidad existen múltiples paradigmas de programación,


entre los más populares se encuentra la programación orientada a
objetos y la programación funcional. Destacando que, casi todos
los lenguajes de programación más populares son multi
paradigma, es decir, soportan la mayoría de los paradigmas
existentes y la elección de cada uno de los paradigmas depende del
problema a resolver.

Programación orientada a objetos (POO)


La programación orientada a objetos es un paradigma de
programación que describe la construcción de un programa basado
en “objetos”. El paradigma orientado a objetos se basa en el
pensamiento de que todo es un objeto, al igual que todo lo que nos
rodea en el mundo real también lo es.

En este paradigma un computador, una persona o incluso el aire


“todo se comporta como un objeto”. Estos objetos a su vez
poseen “atributos”, que básicamente son el diferenciador que
estos objetos pueden tener hacia otros, como lo pueden ser; su
color, su altura o espesor. Por último mencionar que estos objetos
también poseen “comportamientos”, que definen las acciones
que un objeto puede realizar, como por ejemplo comer, cantar,
enviar, etc.

Photo by Etienne Boulanger on Unsplash

Los pilares de la programación orientada a


objetos
Los pilares de la programación a objetos son básicamente el
conjunto de normas, criterios y comportamientos que rige este
paradigma.

A continuación una breve descripción simplificada de cada uno de


estos pilares.

1. Abstracción: Es la capacidad de representar la


información importante para el contexto del problema.
Este pilar apunta a abstraer solamente lo que
necesitamos para resolver el problema y las partes que
lo componen.

2. Encapsulamiento: Es la habilidad de poder decidir


las partes que se expondrán a hacia otras entidades.
Este pilar apunta a ocultar o publicar atributos o
métodos dependiendo del caso.

3. Polimorfismo: Es la capacidad de retornar diferentes


resultados dependiendo de los valores de entrada o
condiciones. Este pilar apunta a cambiar el
comportamiento de un objeto por sobrecarga o por
sobreescritura de métodos.

4. Herencia: Es la capacidad de transferir características


propias como atributos y métodos de una clase a otra.
Este pilar apunta a la reutilización de código existente.
Conceptos base de la programación
orientada a objetos
La programación orientada a objetos presenta una serie de
artefactos y conceptos clave que son necesarios entender para
poder emplear de una forma correcta este paradigma.

A continuación una breve descripción de cada uno de estos


conceptos independientemente del lenguaje de programación de
turno:

1. Clase: Una clase es una plantilla para la creación de


objetos según un modelo definido. Una clase está
compuesta de atributos y métodos.

2. Objeto: El objeto como tal es la instancia de una clase,


es decir, es la pieza de software que nace a través del
molde.

3. Atributos: Los atributos son las características


individuales que diferencian un objeto de otro, estos
determinan su apariencia, estado u otras cualidades.

4. Métodos: Los métodos son una especificación de


acciones que puede realizar el objeto.

5. Constructor: Un constructor como tal es el fabricador


del objeto. El constructor recibe instrucciones de la
creación y asigna valores a los atributos del objeto. Un
constructor es básicamente un método que se ejecuta
automáticamente a la hora de instanciar un objeto.

Conceptos extendidos de POO


Adicionalmente, existen otros artefactos de la programación
orientada a objetos que agregan más herramientas para trabajar en
diferentes situaciones. Destacando que estos artefactos no están
disponibles en todos los lenguajes de programación y su
implementación se realiza de diferente manera o incluso en
algunas ocasiones se simula.

 Clase abstracta: Es una clase pensada en la herencia


y el polimorfismo. En las clases abstractas debemos
definir al menos un método abstracto de manera que
las clases derivadas, hereden e implementen los
métodos abstractos. Las clases abstractas no se pueden
instanciar, solo heredar y siempre que definimos un
método abstracto, la clase debe ser abstracta.

 Métodos abstractos: Un método abstracto nos da la


posibilidad de introducir la declaración de un método,
pero no su definición.

 Clase estática: Es una clase pensada principalmente


para tener funcionalidades que no necesitan el uso de
objetos, es decir, sus funcionalidades se pueden llamar
directamente sin instanciar el objeto (un claro ejemplo
es Math en Javascript). Las clases estáticas no se
pueden heredad ni instanciar.

 Métodos estáticos: Un método estático nos da la


posibilidad de ser invocado sin la necesidad de
instanciar su clase.

 Interfaces: Las interfaces cumplen la función de


definir contratos dentro del código. Las interfaces
moldean definiciones que una clase debe cumplir e
implementar. Estas reglas aplican tanto en métodos
como en propiedades dependiendo del lenguaje de
programación.

NOTA 🧐: Consultar la documentación del lenguaje de

programación de turno para poder visualizar las diferencias entre


estos conceptos. Es posible que una interfaz o clase abstracta
tengan diferentes implementaciones o alcances.

¿Cuándo utilizar la programación orientada a


objetos?
Como se mencionó anteriormente, los paradigmas de
programación son utilizados dependiendo del problema a resolver.
Pero la industria a lo largo de los años ha empleado POO para
ciertos tipos de desarrollo, como por ejemplo juegos, framework de
desarrollo y programación en el servidor. Destacando que algunos
lenguajes de programación como Java o C# son lenguajes
enfocados en este paradigma. A continuación algunas menciones:

 Minecraft: Juego creado bajo este paradigma basado


en Java.

 Angular: Framework web escrito con POO basado en


Typescript.

 Django: Framework backend escrito con POO basado


en Python.

Diagrama de clases UML


En ingeniería de software, un diagrama de clases en UML es un
tipo de diagrama de estructura estática que describe la
representación de un sistema basado en la programación orientada
a objetos.

El diagrama de clases representa el sistema describiendo las partes


que la componen, como lo son las clases, atributos, operaciones y
las relaciones entre objetos.

El diagrama de clases sirve entre otras cosas para:

 Análisis de la solución.

 Documentación del sistema.


 Visualización de componentes y comportamiento.

NOTA 🧐: Recomiendo profundizar en el diagrama de clases de

UML para poder analizar de una mejor manera nuestra solución


basada en POO. En este artículo no daremos profundidad a UML,
sino más bien, dar a conocer estas herramientas para que puedan
ser estudiadas.

Libros para aprender POO

 Programación orientada a objetos

 Aprender la programación orientada a objetos con


Python
 Aprender la programación orientada a objetos con Java

 Programación orientada a objetos con C++ 4 edición

Gracias por haber llegado hasta aquí, si encuentras esto útil, no

olvides aplaudir 👏 . Suscríbete para obtener más contenido 🔔.


Guía para Principiantes de la
Programación Orientada a Objetos
(POO) en Python
Daniel Diaz, junio 15, 2023

Tabla de contenidos

1. Un ejemplo de programa en Python


2. Requisitos para aprender Python OOP
3. ¿Qué es la programación orientada a objetos en Python?
4. ¿Por qué utilizamos la programación orientada a objetos en Python?
5. Todo es un objeto en Python
6. Tu primer objeto en Python
7. Los 4 pilares de la OOP en Python
8. Construir una calculadora de resolución de formas de área
Descargar el artículo en PDF
Cerrar
La programación es un arte. Y al igual que en el arte, la selección de los pinceles
y pinturas adecuados es esencial para producir las mejores obras. La
programación orientada a objetos (POO – Object-Oriented Programming) en
Python es una de esas habilidades.

La elección del lenguaje de programación adecuado es una parte crucial de cualquier


proyecto, y puede conducir a un desarrollo fluido y agradable o a una completa
pesadilla. Por lo tanto, lo mejor es que utilices el lenguaje que mejor se adapte a
tu caso de uso.

Esa es la principal razón para aprender programación orientada a objetos en


Python, que además es uno de los lenguajes de programación más populares.

¡Vamos a aprender!

Un ejemplo de programa en Python


Antes de entrar en materia, vamos a plantear una pregunta: ¿has escrito alguna
vez un programa en Python como el siguiente?

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')

elif number < secret_number:


print(number, 'is less than the secret number')
else:
print('You guessed the number:', secret_number)
break

Este código es un simple adivinador de números. Intenta copiarlo en un archivo


Python y ejecutarlo en tu sistema. Cumple perfectamente su propósito.
Pero aquí surge un gran problema: ¿y si te pedimos que implementes una nueva
función? Podría ser algo sencillo, por ejemplo:

«Si la entrada es un múltiplo del número secreto, da una pista al usuario».

El programa se volvería rápidamente complejo y pesado al aumentar el número


de funciones y, por tanto, el número total de condicionales anidados.

Ese es precisamente el problema que intenta resolver la programación orientada a


objetos.

La programación es un arte que requiere las herramientas adecuadas para

construir algo bonito 🎨 Aprende más sobre la programación orientada a

objetos en Python aquí 👇CLIC PARA TUITEAR

Requisitos para aprender Python OOP


Antes de adentrarte en la programación orientada a objetos, te recomendamos
encarecidamente que tengas unos conocimientos básicos de Python.

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.

¿Qué es la programación orientada a objetos en


Python?
La programación orientada a objetos (POO) es un paradigma de programación en
el que podemos pensar en problemas complejos como objetos.

Un paradigma es una teoría que proporciona la base para resolver problemas.

Así que cuando hablamos de POO, nos referimos a un conjunto de conceptos y


patrones que utilizamos para resolver problemas con objetos.

Un objeto en Python es una colección única de datos (atributos) y


comportamiento (métodos). Puedes pensar en los objetos como cosas reales que
te rodean. Por ejemplo, considera las calculadoras:

Una calculadora puede ser un objeto.


Como puedes observar, los datos (atributos) son siempre sustantivos, mientras
que los comportamientos (método) son siempre verbos.

Esta compartimentación es el concepto central de la programación orientada a


objetos. Se construyen objetos que almacenan datos y contienen tipos específicos
de funcionalidad.

¿Por qué utilizamos la programación orientada a


objetos en Python?
La POO permite crear software seguro y fiable. Muchos marcos y bibliotecas de
Python utilizan este paradigma para construir su código base. Algunos ejemplos
son Django, Kivy, pandas, NumPy y TensorFlow.

Veamos las principales ventajas de usar OOP en Python.

Ventajas de la POO de Python

Las siguientes razones te harán optar por utilizar la programación orientada a


objetos en Python.

Todos los lenguajes de programación modernos utilizan la POO

Este paradigma es independiente del lenguaje. Si aprendes POO en Python,


podrás utilizarlo en lo siguiente:

 Java
 PHP (asegúrate de leer la comparación entre PHP y Python)
 Ruby
 Javascript
 C#
 Kotlin

Todos estos lenguajes están orientados a objetos de forma nativa o incluyen


opciones para la funcionalidad orientada a objetos. Si quieres aprender cualquiera
de ellos después de Python, será más fácil: encontrarás muchas similitudes entre
los lenguajes que trabajan con objetos.
La POO te permite codificar más rápido

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.

La programación orientada a objetos te permite reutilizar el código mediante la


implementación de la abstracción. Este principio hace que tu código sea más
conciso y legible.
Como ya sabrás, los programadores pasan mucho más tiempo leyendo código que
escribiéndolo. Es la razón por la que la legibilidad es siempre más importante que
sacar características lo más rápido posible.

La productividad disminuye con un código no legible

Más adelante verás más sobre el principio de abstracción.

La OOP te ayuda a evitar el código espagueti

¿Recuerdas el programa de adivinación de números del principio de este artículo?

Si sigues añadiendo funciones, tendrás muchas sentencias if anidadas en el


futuro. Esta maraña de interminables líneas de código se llama código espagueti,
y deberías evitarla en la medida de lo posible.
La programación orientada a objetos nos da la posibilidad de comprimir toda la
lógica en objetos, evitando así largos trozos de if’s anidados.
La POO mejora el análisis de cualquier situación

Una vez que tengas algo de experiencia con la POO, podrás pensar en los
problemas como objetos pequeños y específicos.

Esta comprensión conduce a una rápida puesta en marcha del proyecto.

Programación estructurada frente a la programación orientada a


objetos

La programación estructurada es el paradigma más utilizado por los principiantes


porque es la forma más sencilla de construir un pequeño programa.

Se trata de ejecutar un programa Python de forma secuencial. Eso significa que le


das al ordenador una lista de tareas y luego las ejecutas de arriba a abajo.

Veamos un ejemplo de programación estructurada con un programa de cafetería.

small = 2
regular = 5
big = 6

user_budget = input('What is your budget? ')

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)

El código anterior actúa como un vendedor de cafetería. Te pedirá un presupuesto


y luego te «venderá» el mejor café que seas capaz de comprar.

Intenta ejecutarlo en la terminal. Se ejecutará paso a paso, dependiendo de tu


entrada.

Este código funciona perfectamente, pero tenemos tres problemas:

1. Tiene mucha lógica repetida.


2. Utiliza muchos condicionales if anidados.
3. Será difícil de leer y modificar.

La POO se inventó como solución a todos estos problemas.

Veamos el programa anterior implementado con POO. No te preocupes si aún no


lo entiendes. Es solo para comparar la programación estructurada y la
programación orientada a objetos.

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

def sell(self, budget):


self.check_budget(budget)
if budget >= self.price:
print(f'You can buy the {self.name} coffee')
if budget == self.price:
print('It\'s complete')
else:
print(f'Here is your change
{self.get_change(budget)}$')

exit('Thanks for your transaction')

Nota: Todos los conceptos siguientes se explicarán con mayor profundidad a lo


largo del artículo.
El código anterior representa una clase llamada «Coffee». Tiene dos atributos –
«Name» y «Price» – y ambos se utilizan en los métodos. El método principal es
«Sell», que procesa toda la lógica necesaria para completar el proceso de venta.

Si intentas ejecutar esa clase, no obtendrás ninguna salida. Ocurre principalmente


porque solo estamos declarando la «plantilla» para los cafés, no los cafés en sí.

Implementemos esa clase con el siguiente código:

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')

for coffee in [big, regular, small]:


coffee.sell(user_budget)

Aquí estamos haciendo instancias, u objetos de café, de la clase «Coffee», y


luego llamando al método «sell» de cada café hasta que el usuario pueda pagar
cualquier opción.

Obtendremos el mismo resultado con ambos enfoques, pero podemos ampliar la


funcionalidad del programa mucho mejor con la POO.

A continuación se muestra una tabla comparativa entre la programación orientada


a objetos y la programación estructurada:

OOP Programación Estructurada


Más fácil de mantener Difícil de mantener

No te repitas (DRY) Código repetido en muchos lugares

Pequeños trozos de código reutilizados en muchos Una gran cantidad de código en pocos
lugares lugares

Enfoque por objetos Enfoque de código de bloques

Más fácil de depurar Más difícil de depurar

Gran curva de aprendizaje Una curva de aprendizaje más sencilla

Utilizado en grandes proyectos Optimizado para programas sencillos

Para concluir la comparación de paradigmas:

 Ninguno de los dos paradigmas es perfecto (la POO puede resultar


abrumadora en proyectos sencillos).
 Estas son solo dos formas de resolver un problema; hay otras por ahí.
 La POO se utiliza en grandes bases de código, mientras que la
programación estructurada es principalmente para proyectos sencillos.

Pasemos a los objetos incorporados en Python.

Todo es un objeto en Python


Te diremos un secreto: has estado usando OOP todo el tiempo sin darte cuenta.

Incluso cuando se utilizan otros paradigmas en Python, se siguen utilizando


objetos para hacer casi todo.

Eso es porque, en Python, todo es un objeto.


Recuerda la definición de objeto: Un objeto en Python es una única colección de
datos (atributos) y comportamiento (métodos).

Esto coincide con cualquier tipo de datos en Python.

Una cadena es una colección de datos (caracteres) y comportamientos


(upper(), lower(), etc.). Lo mismo ocurre con los enteros, los flotantes,
los booleanos, las listas y los diccionarios.

Antes de continuar, repasemos el significado de los atributos y los métodos.

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.

Vamos a hacer un simple ejercicio en el shell de Python. Puedes abrirlo


escribiendo python o python3 en tu terminal.

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'
>>> kinsta.upper()
'KINSTA, PREMIUM APPLICATION, DATABASE, AND MANAGED WORDPRESS HOSTING'

En la segunda línea, estamos llamando a un método de cadena, upper().


Devuelve el contenido de la cadena todo en mayúsculas. Sin embargo, no cambia
la variable original.

>>> kinsta
'Kinsta, Premium Application, Database, and Managed WordPress hosting'

Profundicemos en las funciones valiosas cuando se trabaja con objetos.


La función type() permite obtener el tipo de un objeto. El «tipo» es la clase a la
que pertenece el objeto.

>>> type(kinsta)
# class 'str'

La función dir() devuelve todos los atributos y métodos de un objeto. Vamos a


probarlo con la variable kinsta.

>>> dir(kinsta)
['__add__', '__class__', ........... 'upper', 'zfill']

Ahora, intenta imprimir algunos de los atributos ocultos de este objeto.

>>> kinsta.__class__ # class ‘str’ e>

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()

Enhorabuena: ¡acabas de crear tu primer objeto en Python! Puedes comprobar su


id y tipo con el siguiente código:
id(cookie1)
140130610977040 # Unique identifier of the object

type(cookie1)
<class '__main__.Cookie'>

Como puedes ver, esta cookie tiene un identificador único en la memoria, y su


tipo es Cookie.
También puedes comprobar si un objeto es una instancia de una clase con la
función isinstance().

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í).

Intenta pegar la clase en el shell y crea una instancia de la cookie como de


costumbre.
cookie2 = Cookie()
# TypeError

Obtendrás un error. Esto se debe a que debes proporcionar el conjunto mínimo de


datos que el objeto necesita para vivir – en este caso, el nombre y la forma, ya
que hemos establecido chips y «Chocolate».

cookie2 = Cookie('Awesome cookie', 'Star')

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

# The object is passing itself as a parameter


def bake(self):
print(f'This {self.name}, is being baked with the shape
{self.shape} and chips of {self.chips}')
print('Enjoy your cookie!')

Para llamar a un método, utiliza la notación de puntos e invócalo como una


función.
cookie3 = Cookie('Baked cookie', 'Tree')
cookie3.bake()
# This Baked cookie, is being baked with the shape Tree and chips of
Chocolate
Enjoy your cookie!

Los 4 pilares de la OOP en Python


La programación orientada a objetos incluye cuatro pilares principales:

1. Abstracción

La abstracción oculta al usuario la funcionalidad interna de una aplicación. El


usuario puede ser el cliente final u otros desarrolladores.

Podemos encontrar abstracción en nuestra vida cotidiana. Por ejemplo, sabes


cómo usar tu teléfono, pero probablemente no sepas exactamente lo que ocurre
dentro de él cada vez que abres una aplicación.
Otro ejemplo es el propio Python. Sabes cómo usarlo para construir software
funcional, y puedes hacerlo aunque no entiendas el funcionamiento interno de
Python.
Aplicar lo mismo al código permite reunir todos los objetos de un problema
y abstraer la funcionalidad estándar en clases.
2. Herencia
La herencia nos permite definir múltiples subclases a partir de una clase ya
definida.
El propósito principal es seguir el principio DRY. Podrás reutilizar mucho código
implementando todos los componentes compartidos en superclases.
Puedes pensar en ello como el concepto de herencia genética en la vida real.
Los hijos (subclases) son el resultado de la herencia entre dos padres
(superclases). Heredan todas las características físicas (atributos) y algunos
comportamientos comunes (métodos).
3. Polimorfismo
El polimorfismo nos permite modificar ligeramente los métodos y atributos de
las subclases previamente definidas en la superclase.
El significado literal es «muchas formas«. Esto se debe a que construimos
métodos con el mismo nombre pero con diferente funcionalidad.
Volviendo a la idea anterior, los niños también son un ejemplo perfecto de
polimorfismo. Pueden heredar un comportamiento definido get_hungry() pero
de una manera ligeramente diferente, por ejemplo, tener hambre cada 4 horas en
lugar de cada 6.
4. Encapsulación

La encapsulación es el proceso en el que protegemos la integridad interna de los


datos en una clase.

Aunque no hay una declaración privada en Python, se puede aplicar la


encapsulación mediante el uso de mangling en Python. Existen métodos especiales
llamados getters y setters que nos permiten acceder a atributos y métodos
únicos.
Imaginemos una clase Humana que tiene un único atributo llamado _altura.
Este atributo solo se puede modificar dentro de ciertas restricciones (es casi
imposible ser más alto que 3 metros).
Construir una calculadora de resolución de formas
de área
Una de las mejores cosas de Python es que nos permite crear una gran variedad
de software, desde un programa CLI (interfaz de línea de comandos) hasta una
compleja aplicación web.

Ahora que has aprendido los conceptos fundamentales de la programación


orientada a objetos, es el momento de aplicarlos en un proyecto real.

Nota: Todo el código siguiente estará disponible dentro de este repositorio de


GitHub. Una herramienta de revisión de código que nos ayuda a gestionar las
versiones del código con Git.

Tu tarea es crear una calculadora de áreas de las siguientes formas:

 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.

Vamos a implementar la funcionalidad estándar de la mayoría de estas formas.

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()}'

Vamos a desglosar lo que estamos haciendo con este código:

 En el método __init__, estamos solicitando dos parámetros, side1 y side2.


Estos permanecerán como atributos de la instancia.
 La función get_area() devuelve el área de la forma. En este caso, utiliza la
fórmula del área de un rectángulo, ya que será más fácil de implementar
con otras formas.
 El método __str__() es un «método mágico» al igual
que __init__(). Permite modificar la forma en que se imprimirá una
instancia.
 El atributo oculto self.__class__.__name__ se refiere al nombre de la
clase. Si estuvieras trabajando con una clase Triangle, ese atributo sería
«Triangule».
Clase Rectángulo
Ya que implementamos la fórmula del área del Rectángulo, podríamos crear una
simple clase Rectangle que no hace más que heredar de la clase Shape.
Para aplicar la herencia en Python, crearás una clase como de costumbre y
rodearás la superclase de la que quieres heredar con paréntesis.

# Folded base class


class Shape: ...

class Rectangle(Shape): # Superclass in Parenthesis


pass

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.

Podemos hacerlo modificando el método init, aceptando solo un side como


parámetro, y pasando ese valor del lado al constructor de la clase Rectangle.

# 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

Un triángulo es la mitad de grande que el rectángulo que lo rodea.


Relación entre triángulos y rectángulos
(Fuente de la imagen: Varsity tutors).
Por lo tanto, podemos heredar de la clase Rectangle y modificar el
método get_area para que coincida con la fórmula del área del triángulo, que es
la mitad de la base multiplicada por la altura.

# 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

Otro caso de uso de la función super() es llamar a un método definido en


la superclase y almacenar el resultado como una variable. Eso es lo que ocurre
dentro del método get_area().
Clase circular
Puedes encontrar el área del círculo con la fórmula πr², donde r es el radio del
círculo. Eso significa que tenemos que modificar el método get_area() para
implementar esa fórmula.
Nota: Podemos importar el valor aproximado de π desde el módulo matemático

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …

# At the start of the file


from math import pi

class Circle(Shape):
def __init__(self, radius):
self.radius = radius

def get_area(self):
return pi * (self.radius ** 2)

El código anterior define la clase Circle, que utiliza un constructor y


métodos get_area() diferentes.
Aunque Circle hereda de la clase Shape, puedes redefinir cada método y
atribuirlo a tu gusto.
Clase Hexágono Regular
Solo necesitamos la longitud de un lado de un hexágono regular para calcular su
área. Es similar a la clase Square, donde solo pasamos un argumento al
constructor.

Fórmula del área del hexágono (Fuente


de la imagen: BYJU’S)
Sin embargo, la fórmula es bastante diferente, e implica el uso de una raíz
cuadrada. Por eso se utilizará la función sqrt() del módulo matemático.

# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
class Circle(Shape): …

# Import square root


from math import sqrt
class Hexagon(Rectangle):

def get_area(self):
return (3 * sqrt(3) * self.side1 ** 2) / 2

Probar nuestras clases


Puedes entrar en un modo interactivo cuando ejecutas un archivo de Python
utilizando un depurador. La forma más sencilla de hacerlo es utilizando la
función de punto de interrupción incorporada.
Nota: Esta función solo está disponible en Python 3.7 o superior.

from math import pi, sqrt


# Folded classes
class Shape: ...
class Rectangle(Shape): ...
class Square(Rectangle): ...
class Triangle(Rectangle): …
class Circle(Shape): …
class Hexagon(Rectangle): …

breakpoint()

Ahora, ejecuta el archivo Python y juega con las clases que has creado.

$ python calculator.py

(Pdb) rec = Rectangle(1, 2)(Pdb) print(rec)


The area of this Rectangle is: 2
(Pdb) sqr = Square(4)
(Pdb) print(sqr)
The area of this Square is: 16
(Pdb) tri = Triangle(2, 3)
(Pdb) print(tri)
The area of this Triangle is: 3.0
(Pdb) cir = Circle(4)
(Pdb) print(cir)
The area of this Circle is: 50.26548245743669
(Pdb) hex = Hexagon(3)
(Pdb) print(hex)
The area of this Hexagon is: 23.382685902179844
Desafío
Crear una clase con un método de run donde el usuario pueda elegir una forma y
calcular su área.
Cuando hayas completado el reto, puedes enviar una solicitud de extracción
al repositorio de GitHub o publicar tu solución en la sección de comentarios.
¿Listo para empezar a aprender programación orientada a objetos en

Python? ✅ Estás en el lugar adecuado 😄CLIC PARA TUITEAR

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#.

En este artículo, has aprendido sobre:

 El concepto de orientación a objetos en Python


 Ventajas de la programación orientada a objetos sobre la estructurada
 Fundamentos de la programación orientada a objetos en Python
 Concepto de clases y cómo utilizarlas en Python
 El constructor de una clase en Python
 Métodos y atributos en Python
 Los cuatro pilares de la POO
 Implementación de la abstracción, la herencia y el polimorfismo en un
proyecto

Ahora te toca a ti.

Déjanos tu solución al desafío en los comentarios. Y no olvides consultar


nuestra guía de comparación entre Python y PHP.

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).

La diferencia entre JavaScript del lado del cliente y JavaScript del


lado del servidor se encuentra en la manera en la que generan
nuevo contenido. El código del lado del servidor genera de
manera dinámica nuevo contenido mediante la lógica de la
aplicación y al modificar datos de la base de datos.

Lado del cliente vs. Lado del


servidor: ¿Cuál es la diferencia?
Hay dos frases importantes relacionadas con el desarrollo de software y de la web, el
lado del cliente y el lado del servidor. Las dos formas de desarrollo se caracterizan
por tener propósitos y lenguajes distintos. Si te dedicas al desarrollo de software o a
la programación, debes conocer el desarrollo del lado del cliente y del lado del
servidor.

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:

 Creación de diseños de sitios web


 Diseño de interfaces de usuario
 Añadir la validación de formularios
 Añadir elementos visuales como colores y fuentes
Las personas de carreras como el diseño web y el diseño de la experiencia del
usuario se centran en el desarrollo del lado del cliente. Los desarrolladores del lado
del cliente utilizan lenguajes de programación específicos. Algunos lenguajes
comunes del lado del cliente incluyen:

 HTML: HTML, que significa Hypertext Markup Language, es un


lenguaje de marcado que constituye el lenguaje estándar para el
desarrollo de páginas web. El HTML construye la estructura de un
sitio web y lo representa en un navegador.

 CSS: CSS, siglas de Cascading Style Sheets (hojas de estilo en


cascada), es un lenguaje de diseño que los desarrolladores pueden
utilizar para añadir elementos de diseño visual a un sitio web
codificado en HTML. Los desarrolladores pueden utilizar CSS para
hacer que sus sitios web sean visualmente atractivos en los
dispositivos de los usuarios.

 JavaScript: JavaScript es un lenguaje de programación que los


desarrolladores pueden utilizar para el desarrollo de páginas web,
aplicaciones web y otros fines. Los desarrolladores pueden utilizar
JavaScript para hacer que los sitios web sean dinámicos e interactivos.

 VBScript: VBScript es un lenguaje de scripting del lado del cliente,


de uso general y compatible con algunos navegadores. Los
desarrolladores pueden utilizar VBScript para añadir elementos
interactivos a los sitios web.

Relacionado: 50 tipos de lenguajes de programación y lo que hacen

¿Qué es el desarrollo del lado del


servidor?
El desarrollo del lado del servidor es un tipo de desarrollo que implica programas
que se ejecutan en un servidor. Los desarrolladores del lado del servidor se centran
en el desarrollo entre bastidores, y el desarrollo del lado del servidor también se
conoce como «back-end» desarrollo. Este tipo de programación es importante
porque los navegadores web, o clientes, interactúan con los servidores web para
recuperar información. Las tareas comunes del lado del servidor incluyen:

 Codificación de sitios web dinámicos


 Desarrollo de aplicaciones web
 Conectar páginas web con bases de datos
Los desarrolladores de software, los administradores de bases de datos y los
desarrolladores web suelen utilizar el desarrollo del lado del servidor. Los
desarrolladores del lado del servidor pueden utilizar muchos lenguajes de
programación diferentes, entre ellos:

 Java: Java es un lenguaje de programación orientado a objetos que los


desarrolladores pueden utilizar para diversos fines, como el desarrollo
de software y aplicaciones. Java es uno de los lenguajes de
programación del lado del servidor más populares.

 Pitón: Python es un lenguaje de programación orientado a objetos y


de propósito general que los desarrolladores pueden utilizar para el
desarrollo web, el desarrollo de aplicaciones, los sistemas operativos y
otros fines. Python tiene aplicaciones en la ciencia de los datos, las
finanzas, la informática y otros campos.

 SQL: SQL, siglas de Structured Query Language (lenguaje de


consulta estructurado), es el lenguaje estándar del sector para
interactuar con las bases de datos. Los desarrolladores pueden utilizar
SQL para manipular datos en las bases de datos, incluyendo la
actualización, recuperación y eliminación de datos.

 PHP: PHP, que significa Preprocesador de Hipertexto, es un lenguaje


de scripting que los desarrolladores utilizan para crear sitios y
aplicaciones web. PHP puede conectarse a bases de datos para mostrar
su contenido en los sitios web.

Relacionado: Desarrollador web vs. Desarrollador de software: Lo que hacen

El lado del cliente frente al lado del


servidor
El lado del cliente y el lado del servidor son términos que indican cómo y dónde se
ejecuta el código. Algunos desarrolladores, llamados desarrolladores full-stack,
saben utilizar tanto el desarrollo del lado del cliente como el del lado del servidor, ya
que ambos son importantes para que los sitios web y las aplicaciones funcionen. Sin
embargo, hay algunas diferencias clave entre el desarrollo del lado del cliente y del
lado del servidor. Algunas de las principales diferencias entre los dos tipos de
desarrollo son:

Dónde funciona el código


Una de las principales diferencias entre el desarrollo del lado del cliente y del lado
del servidor es dónde se ejecuta el código. En el desarrollo del lado del cliente, el
código se ejecuta en el dispositivo del cliente o del usuario. Sin embargo, en el
desarrollo del lado del servidor, el código se ejecuta a través de un servidor. Por eso
el desarrollo del lado del cliente también se llama front end y el desarrollo del lado
del cliente también es back end.

Relacionado: Front End vs. Back End: Definiciones y diferencias

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.

Relacionado: ¿Qué es un lenguaje de scripting? (Con usos y tipos)

Centrado en el usuario vs. detrás del escenario


Normalmente, el desarrollo del lado del cliente se centra en el usuario, mientras que
el desarrollo del lado del servidor tiene lugar entre bastidores. Los desarrolladores
del lado del cliente se centran en la creación de las partes de un sitio web o una
aplicación que los usuarios pueden ver, como los elementos de diseño visual y los
diseños de las páginas web. Los desarrolladores del lado del servidor se centran más
en los componentes entre bastidores, como la forma en que una aplicación transmite
los datos a un servidor. El código del lado del cliente suele ser visible para el
usuario, mientras que el código del lado del servidor es invisible.

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.

Relacionado: Aprende a ser desarrollador web

Recoger frente a procesar las entradas de los


usuarios
Otra diferencia entre el desarrollo del lado del cliente y del lado del servidor es la
forma en que manejan la entrada del usuario. El desarrollo del lado del cliente
recoge las entradas de los usuarios. Por ejemplo, los desarrolladores pueden utilizar
JavaScript, un lenguaje de programación del lado del cliente, para crear formularios
que recojan las entradas del usuario. El desarrollo del lado del servidor puede
procesar esta información. Por ejemplo, los desarrolladores pueden utilizar PHP para
conectar una base de datos a un sitio web y enviar los datos introducidos por el
usuario a la base de datos. De este modo, los programas del lado del cliente y del
lado del servidor pueden trabajar juntos.

Relacionado: Relacionado: Aprenda a codificar para tener éxito en su carrera

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.

¿Cuáles son los principales lenguajes de programación orientada


a objetos? En la actualidad existen diferentes lenguajes de
programación orientada a objetos, como C++, Objective C, Java,
Ruby, Visual Basic, Visual C Sharp, Simula, Perl, TypeScript,
Smalltalk, PHP o Python.

También podría gustarte