{"id":5817,"date":"2018-05-27T13:56:53","date_gmt":"2018-05-27T18:56:53","guid":{"rendered":"https:\/\/itsoftware.com.co\/content\/?p=5817"},"modified":"2018-05-28T21:07:53","modified_gmt":"2018-05-29T02:07:53","slug":"que-es-la-programacion-orientada-a-objetos","status":"publish","type":"post","link":"https:\/\/itsoftware.com.co\/content\/que-es-la-programacion-orientada-a-objetos\/","title":{"rendered":"\u00bfQu\u00e9 es la Programaci\u00f3n Orientada a Objetos POO?"},"content":{"rendered":"<p>La <strong>programaci\u00f3n orientada a objetos<\/strong> es una metodolog\u00eda de desarrollo de software, donde las entidades de una aplicaci\u00f3n se manejan como si fueran objetos o personas reales, esto es, tienen sus propiedades y funciones propias.<\/p>\n<figure id=\"attachment_5977\" aria-describedby=\"caption-attachment-5977\" style=\"width: 529px\" class=\"wp-caption aligncenter\"><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-5977\" title=\"Programacio\u0301n orientada a objetos\" src=\"https:\/\/itsoftware.com.co\/content\/wp-content\/uploads\/2018\/05\/Programacio\u0301n-orientada-a-objetos.png\" alt=\"Programacio\u0301n orientada a objetos\" width=\"529\" height=\"299\" \/><figcaption id=\"caption-attachment-5977\" class=\"wp-caption-text\">Programacio\u0301n orientada a objetos<\/figcaption><\/figure>\n<p><!--more--><\/p>\n<p>En este art\u00edculo vamos a hacer una breve rese\u00f1a de sus principales caracter\u00edsticas, considerando ejemplos con la nomenclatura POO de Java.<\/p>\n<p>Haciendo una analog\u00eda con el mundo real, si tom\u00e1ramos un objeto como una silla, \u00e9sta tiene unas propiedades propias como su estilo, su color, con o sin ruedas, etc. Y por otro lado, tiene unas funciones o m\u00e9todos, que le permiten por ejemplo a una silla moverse de un lugar a otro o\u00a0 plegarse en caso de que pueda hacerlo, etc.<\/p>\n<p>As\u00ed pues en la <strong>programaci\u00f3n orientada a objetos<\/strong>, las propiedades de los objetos son variables que determinan las caracter\u00edsticas de un objeto, y lo que hace ese objeto son sus funciones.<\/p>\n<p>De esta manera, en la <strong>programaci\u00f3n orientada a objetos<\/strong>, se encapsulan de manera l\u00f3gica entidades independientes, con sus propiedades y sus m\u00e9todos.\u00a0 Lo interesante es que se pueden crear clases \u00abhijas\u00bb que heredan las propiedades de sus clases padres, tanto en propiedades como en m\u00e9todos, y a su vez tener sus propias caracter\u00edsticas y funciones.<\/p>\n<p>Esta herencia en la <strong>programaci\u00f3n orientada a objetos<\/strong>, es la que permite la creaci\u00f3n de bibliotecas de clases,\u00a0 donde se definen claramente los m\u00e9todos con los que se puede interactuar con dicho objeto, tanto para fijar u obtener valores a sus propiedades, como tambi\u00e9n para acceder a sus funciones.<\/p>\n<p>&nbsp;<\/p>\n<h2>Clases en la Programaci\u00f3n Orientada a Objetos<\/h2>\n<p>Una clase es una especie de plantilla o molde para un objeto, donde se definen sus variables (propiedades) y sus m\u00e9todos o funciones.<\/p>\n<p>Si por ejemplo vamos a crear una clase llamada \u00abSeresVivos\u00bb, tendr\u00eda unas propiedades como tipo\u00a0 y color, que se definir\u00edan en la clase como:<\/p>\n<pre class=\"prettyprint notranslate prettyprinted\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">SeresVivos<\/span> <span class=\"pun\">{<\/span>\r\n  <span style=\"color: #ff0000;\"> <span class=\"typ\">String<\/span><span class=\"pln\"> tipo<\/span><span class=\"pun\">;<\/span>\r\n   <span class=\"typ\">String<\/span><span class=\"pln\"> color<\/span><span class=\"pun\">;<\/span><\/span>\r\n<span class=\"pun\">}<\/span><\/pre>\n<p>Las propiedades o variables de la clase por regla son privadas, es decir que s\u00f3lo se pueden manipular directamente desde el interior de la clase, es decir, darles u obtener sus valores. Las variables incluso pueden hacer referencia a otras clases.<\/p>\n<p>Generalmente la asignaci\u00f3n de valores a las variables o propiedades se realiza por medio de m\u00e9todos que reciben los valores, los validan, los pueden asignar a las variables internas e incluso pueden realizar m\u00e1s acciones internamente con el cambio de una propiedad.<\/p>\n<pre><span class=\"kwd\">public<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">SeresVivos<\/span> <span class=\"pun\">{<\/span> \r\n<span style=\"color: #000000;\"> <span class=\"typ\">String<\/span><span class=\"pln\"> tipo<\/span><span class=\"pun\">;<\/span> <\/span>\r\n<span style=\"color: #000000;\"><span class=\"typ\"> String<\/span><span class=\"pln\"> color<\/span><span class=\"pun\">;<\/span> <\/span>\r\n \r\n <span style=\"color: #ff0000;\">public void fijarColor(String colorser){<\/span>\r\n<span style=\"color: #ff0000;\">    this.color=colorser;\r\n<\/span><span style=\"color: #ff0000;\">  }<\/span>\r\n\r\n<span class=\"pun\">}<\/span><\/pre>\n<p>La palabra reservada <strong>this<\/strong>\u00a0hace referencia a la misma clase para no tener que volver a nombrarla.<\/p>\n<p>As\u00ed mismo para obtener el valor de una variable, no se realiza consultando directamente sobre ella, sino sobre su valor devuelto por una funci\u00f3n.<\/p>\n<pre><span class=\"kwd\">public<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">SeresVivos<\/span> <span class=\"pun\">{<\/span> \r\n<span style=\"color: #000000;\"> <span class=\"typ\">String<\/span><span class=\"pln\"> tipo<\/span><span class=\"pun\">;<\/span> <\/span>\r\n<span style=\"color: #000000;\"><span class=\"typ\"> String<\/span><span class=\"pln\"> color<\/span><span class=\"pun\">;<\/span> <\/span>\r\n \r\n <span style=\"color: #ff0000;\">public String ObtenerColor(){<\/span>\r\n<span style=\"color: #ff0000;\">    return this.color;\r\n<\/span><span style=\"color: #ff0000;\">  }<\/span>\r\n\r\n<span class=\"pun\">}<\/span><\/pre>\n<p>Las funciones o m\u00e9todos se definen dentro de la clase, tanto para actuar sobre sus propiedades, realizar ciertas acciones sobre datos internos o sobre otros datos externos, como por ejemplo de una base de datos.<\/p>\n<p><span style=\"font-size: 1.0625rem;\">Por ejemplo en la clase\u00a0 \u00abSeresVivos\u00bb, algunas otras funciones se definir\u00edan de la siguiente forma:<\/span><\/p>\n<pre class=\"prettyprint notranslate prettyprinted\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">SeresVivos<\/span> <span class=\"pun\">{<\/span>\r\n   <span class=\"typ\">String<\/span><span class=\"pln\"> tipo<\/span><span class=\"pun\">;<\/span>\r\n   <span class=\"typ\">String<\/span><span class=\"pln\"> color<\/span><span class=\"pun\">;<\/span>\r\n\r\n   <span style=\"color: #ff0000;\"><span class=\"kwd\">void<\/span><span class=\"pln\"> beber<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n   <span class=\"pun\">}<\/span>\r\n\r\n   <span class=\"kwd\">void<\/span><span class=\"pln\"> comer<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n   <span class=\"pun\">}<\/span>\r\n\r\n   <span class=\"kwd\">void<\/span><span class=\"pln\"> correr<\/span><span class=\"pun\">()<\/span> <span class=\"pun\">{<\/span>\r\n   <span class=\"pun\">}<\/span><\/span>\r\n<span class=\"pun\">}<\/span><\/pre>\n<p>En una clase, se usa una funci\u00f3n llamada \u00abconstructora\u00bb, en la que se asignan valores a las variables del objeto, ya sea internamente por medio de una consulta a una base de datos, o con valores predefinidos, o por medio de los valores que se entregan por par\u00e1metros en la funci\u00f3n constructora. La funci\u00f3n constructora tiene el mismo nombre de la clase, y se llama autom\u00e1ticamente durante la creaci\u00f3n de un objeto de dicha clase.<\/p>\n<p>En el ejemplo de la clase SeresVivos, podemos tener una clase constructora para recibir los datos b\u00e1sicos del ser vivo:<\/p>\n<pre><span class=\"kwd\">public<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">SeresVivos<\/span> <span class=\"pun\">{<\/span> \r\n<span class=\"typ\"> String<\/span><span class=\"pln\"> tipo<\/span><span class=\"pun\">;<\/span> \r\n<span class=\"typ\"> String<\/span><span class=\"pln\"> color<\/span><span class=\"pun\">;<\/span>\r\n\r\n<span style=\"color: #ff0000;\"><span class=\"kwd\"> public<\/span><span class=\"pln\"> SeresVivos<\/span><span class=\"pun\">(String tiposer, int colorser )<\/span> <span class=\"pun\">{<\/span> \r\n   this.tipo = tiposer;\r\n   this.color = colorser;  \r\n<span class=\"pun\"> }<\/span> <\/span>\r\n\r\n<span class=\"pun\">}<\/span><\/pre>\n<p>&nbsp;<\/p>\n<h2>Herencia de Clases en Programaci\u00f3n Orientada a Objetos<\/h2>\n<p>Como dijimos anteriormente, se pueden crear clases hijas que heredan variables y funciones de su clase padre. Las clases hijas entonces poseen tanto las caracter\u00edsticas como las funciones de su clase padre como las suyas propias.<\/p>\n<p>Considerando el ejemplo de la clase \u00abSeresVivos\u00bb, una clase hija llamada \u00abPerros\u00bb se definir\u00eda con la palabra clave <em>extends<\/em> en Java, as\u00ed como se muestra a continuaci\u00f3n:<\/p>\n<pre class=\"prettyprint prettyprinted\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">class<\/span> <span class=\"typ\">Perros<\/span> <span style=\"color: #ff0000;\"><span class=\"kwd\">extends<\/span> SeresVivos<\/span><span class=\"pun\">{<\/span>\r\n   <span style=\"color: #ff0000;\"><span class=\"typ\">String<\/span><span class=\"pln\"> Nombre<\/span><span class=\"pun\">;\r\n   String raza;\r\n   int edad;\r\n   String entrenado;\r\n\r\n   public Perros(String nombreperro, String razaperro, int edadperro){\r\n       this.Nombre = nombreperro;\r\n       this.raza = razaperro;\r\n       this.edad = edadperro;\r\n   }\r\n\r\n   public fijarEntrenado(String entrenadoperro){\r\n       this.entrenado = entrenadoperro;\r\n   }<\/span><\/span>\r\n   \r\n<span class=\"pun\">}<\/span><\/pre>\n<p>&nbsp;<\/p>\n<p>Donde la clase \u00abPerros\u00bb, hereda las propiedades y m\u00e9todos de la clase padre \u00abSeresVivos\u00bb, y por otro lado, tiene sus propias propiedades, como son el nombre, la raza, la edad y si est\u00e1 entrenado no. Adem\u00e1s su propia funci\u00f3n constructora para asignar algunas propiedades y otras funciones como <em>fijarEntrenado<\/em>().<\/p>\n<p>En todos los lenguajes de programaci\u00f3n orientada a objetos, como Java, C++, PHP Laravel, etc., la herencia permite el uso de sus bibliotecas de clases, para crear clases hijas propias, lo que facilita la programaci\u00f3n al reusar el c\u00f3digo, aprender de mejores pr\u00e1cticas de desarrollo de software de otros programadores, y adicionalmente crear bibliotecas de clases propias para ser reusadas en futuros proyectos.<\/p>\n<p>&nbsp;<\/p>\n<h2>Objetos en Programaci\u00f3n Orientada a Objetos<\/h2>\n<p>Un objeto es una instancia de una clase, haciendo una analog\u00eda con el mundo real, es como si tuvi\u00e9ramos un plano para la construcci\u00f3n de muchas viviendas, donde el plano es la clase, mientras que una de esas casas ya construida es un objeto de esa clase.<\/p>\n<p>Este objeto entonces se inicializa en el momento de su creaci\u00f3n con la funci\u00f3n constructora, que es en donde se realiza la asignaci\u00f3n de sus propiedades, ya sea a partir de unos datos internos propios, o desde valores que se le entregan en su creaci\u00f3n.<\/p>\n<p>Una vez este objeto ya est\u00e1 creado, entonces se pueden empezar a usar sus funciones y m\u00e9todos, para realizar acciones sobre sus propiedades.<\/p>\n<p>Siguiendo con el ejemplo de la clase \u00abPerros\u00bb, para crear un objeto de esa clase lo har\u00edamos de la siguiente forma en Java:<\/p>\n<pre class=\"prettyprint notranslate prettyprinted\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">static<\/span> <span class=\"kwd\">void<\/span><span class=\"pln\"> main<\/span><span class=\"pun\">(<\/span><span class=\"typ\">String<\/span> <span class=\"pun\">[]<\/span><span class=\"pln\">args<\/span><span class=\"pun\">)<\/span> <span class=\"pun\">{<\/span>\r\n      \r\n      <span style=\"color: #ff0000;\"><span class=\"typ\">Perros<\/span><span class=\"pln\"> miperro <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"typ\">Perros<\/span><span class=\"pun\">(<\/span> <span class=\"str\">\"Timoteo\",\"Pastor Alem\u00e1n\",2<\/span><span class=\"pun\">);<\/span><\/span>\r\n  <span class=\"pun\">}<\/span><\/pre>\n<p>De esta forma creamos un objeto llamado <strong>miperro<\/strong> que se inicializa con el nombre Timoteo, raza Pastor alem\u00e1n y la edad en 2.<\/p>\n<p>&nbsp;<\/p>\n<h2>Asignaci\u00f3n de valores a las propiedades de los objetos<\/h2>\n<p>La asignaci\u00f3n de valores a las variables o propiedades de los objetos, s\u00f3lo se realiza por medio de funciones que permiten actuar sobre ellas.<\/p>\n<p>Esta asignaci\u00f3n se puede realizar desde variables, arreglos de variables, tablas de una base de datos, o de otros objetos de la misma clase, valores booleanos del tipo \u00absi\u00bb o \u00abno\u00bb (verdadero o falso).<\/p>\n<p>Si para el objeto \u00abPerro\u00bb queremos cambiar su edad\u00a0 deber\u00edamos tener una funci\u00f3n como:<\/p>\n<pre><span style=\"color: #ff0000;\"><span class=\"pun\">public fijarEdad(int edadperro){\r\n\u00a0 \u00a0 \u00a0 \u00a0this.edad = edadperro;\r\n}\r\n\r\n<span style=\"color: #000000;\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">static<\/span> <span class=\"kwd\">void<\/span><span class=\"pln\"> main<\/span>(<span class=\"typ\">String<\/span> []<span class=\"pln\">args<\/span>) <\/span>\r\n<span style=\"color: #000000;\">{ <\/span>\r\n<span style=\"color: #000000;\"><span class=\"typ\">    Perros<\/span><span class=\"pln\"> miperro <\/span>= <span class=\"kwd\">new<\/span> <span class=\"typ\">Perros<\/span>( <span class=\"str\">\"Timoteo\",\"Pastor Alem\u00e1n\",2<\/span>); <\/span>\r\n    \r\n    miperro.fijarEdad(3);\r\n\r\n<span style=\"color: #000000;\">}<\/span>\r\n<\/span><\/span><\/pre>\n<p>Entonces con esa funci\u00f3n <em>fijarEdad<\/em>(), se fija la variable edad del objeto en 3 para el ejemplo.<\/p>\n<p>&nbsp;<\/p>\n<h2>Obtenci\u00f3n de los valores de las propiedades de los objetos<\/h2>\n<p>Para obtener los valores de las propiedades de los objetos, usamos funciones que permiten obtener valores de sus propiedades.<\/p>\n<p>Se pueden devolver valores \u00fanicos de variables, arreglos de datos, tablas de bases de datos, o simplemente resultados booleanos del tipo \u00absi\u00bb o \u00abno\u00bb.<\/p>\n<p>Siguiendo con el ejemplo, si queremos obtener la edad en la clase Perro, entonces creamos una funci\u00f3n\u00a0<em>ObtenerEdad<\/em>() que devuelve el entero de la edad:<\/p>\n<pre><span style=\"color: #ff0000;\"><span class=\"pun\">public int ObtenerEdad(){\r\n\u00a0 \u00a0 \u00a0 \u00a0return this.edad;\r\n}\r\n\r\n<span style=\"color: #000000;\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">static<\/span> <span class=\"kwd\">void<\/span><span class=\"pln\"> main<\/span>(<span class=\"typ\">String<\/span> []<span class=\"pln\">args<\/span>) <\/span>\r\n<span style=\"color: #000000;\">{ <\/span>\r\n<span style=\"color: #000000;\"><span class=\"typ\">   int edadperro;\r\n\r\n   Perros<\/span><span class=\"pln\"> miperro <\/span>= <span class=\"kwd\">new<\/span> <span class=\"typ\">Perros<\/span>( <span class=\"str\">\"Timoteo\",\"Pastor Alem\u00e1n\",2<\/span>); <\/span>\r\n\r\n   edadperro = miperro.ObtenerEdad();\r\n\r\n<span style=\"color: #000000;\">}<\/span><\/span><\/span><\/pre>\n<p>As\u00ed la edad se retorna con la funci\u00f3n ObtenerEdad() a una variable de tipo entero llamada <em>edadperro<\/em>.<\/p>\n<p>&nbsp;<\/p>\n<h2>Llamado de las funciones o m\u00e9todos del objeto<\/h2>\n<p>Adicional a las funciones para asignaci\u00f3n u obtenci\u00f3n de propiedades, el objeto puede tener otras funciones que pueden ejecutar algunas acciones que pueden o no devolver datos.<\/p>\n<p>As\u00ed entonces cualquier funci\u00f3n se llamada haciendo referencia al objeto, y en seguida a su funci\u00f3n, con o sin argumentos, dependiendo de su definici\u00f3n. La sintaxis de llamado var\u00eda de un lenguaje a otro, en Java se denota primero el objeto, seguido de un punto (.) y luego la funci\u00f3n.<\/p>\n<p>En el ejemplo que hemos estado trabajando, una funci\u00f3n se llama as\u00ed:<\/p>\n<pre><span style=\"color: #ff0000;\">miperro.comer();<\/span><\/pre>\n<p>Cuando son funciones que no retornan valores se llaman directamente como aparece en la linea, pero cuando son funciones que devuelven valores, \u00e9stas funciones se asignan a otras variables, o se retornan desde\u00a0 funciones:<\/p>\n<pre>String NombrePerro;\r\n<span style=\"color: #ff0000;\">NombrePerro = miperro.ObtenerNombre();<\/span><\/pre>\n<p>&nbsp;<\/p>\n<h2>Polimorfismo en POO<\/h2>\n<p>El polimorfismo es una caracter\u00edstica de la <strong>programaci\u00f3n orientada a objetos<\/strong>, en la que se permite recibir referencias de objetos de su misma clase, como tambi\u00e9n de objetos procedentes de clases heredadas.<\/p>\n<p>M\u00e1s adelante en otro art\u00edculo hablaremos en m\u00e1s profundidad sobre el polimorfismo.<\/p>\n<p>&nbsp;<\/p>\n<p>Como conclusi\u00f3n, la <strong>programaci\u00f3n orientada a objetos<\/strong> nos ofrece una serie de ventajas para el reuso de c\u00f3digo, el manejo de los objetos de una manera m\u00e1s cercana a nuestra realidad, el uso de grandes bibliotecas de clases, entre otras ventajas, que nos disminuyen ostensiblemente el tiempo de desarrollo, y el entendimiento del c\u00f3digo de una aplicaci\u00f3n de software.<\/p>\n<p>Este art\u00edculo hace parte del sistema de divulgaci\u00f3n de conocimiento de <a href=\"http:\/\/itsoftware.com.co\">ITSoftware SAS<\/a>.<\/p>\n<p>Si te gust\u00f3, por favor no olvides compartirlo en las redes sociales. \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La programaci\u00f3n orientada a objetos es una metodolog\u00eda de desarrollo de software, donde las entidades de una aplicaci\u00f3n se manejan como si fueran objetos o personas reales, esto es, tienen[&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1070,521],"tags":[1489,1487,1488,295,1491,1492,1490],"class_list":["post-5817","post","type-post","status-publish","format-standard","hentry","category-desarrollo-de-software","category-software","tag-desarrollo-orientado-a-objetos","tag-oop","tag-programacion-de-desarrollo","tag-programacion-orientada-a-objetos","tag-programas-orientados-a-objetos","tag-sistemas-orientados-a-objetos","tag-software-orientado-a-objetos"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts\/5817","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/comments?post=5817"}],"version-history":[{"count":0,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts\/5817\/revisions"}],"wp:attachment":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/media?parent=5817"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/categories?post=5817"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/tags?post=5817"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}