versión color - PET: Python Entre Todos - Python Argentina
versión color - PET: Python Entre Todos - Python Argentina
versión color - PET: Python Entre Todos - Python Argentina
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
15 Clueless<br />
Clueless<br />
No Clueless (http://xkcd.com/676/)<br />
El chiste anterior muestra de una manera irónica y cínica que sucede cuando vemos una solución informática sin un correcto<br />
nivel de clueless, pasando por cada nivel de abstracción disponible en el sistema.<br />
Así el principio de clueless se basa en un idea muy simples: La ignorancia es un beneficio; la cual nos ayuda a enforcarnos<br />
en el problema a solucionar y no nos dispersa en rediseños de ruedas, que en general ya cuentan con soluciones bien<br />
realizadas en librerías ya existentes que vamos a usar sin que nos importe conocer su funcionamiento interno.<br />
Cabe aclarar que es una idea que para quedarse (y es en cierta medida lo que provee las n capas de abstracción sobre el<br />
hardware que hoy tenemos), y que NO significa “no saber”, sino, no preocuparse en lo que es el core de de tu programa y no<br />
funcionalidades ya existentes.<br />
Como último detalle aclaramos que <strong>Python</strong> es altamente “clueless” ya que nos evita pensar en cosas de bajo nivel que otros<br />
lenguajes no.<br />
Zen Vs. Zen<br />
Las librerías al menos contradicen de alguna manera el “zen” de <strong>Python</strong> en los siguientes puntos:<br />
• Explicit is better than implicit: Ya que ocultamos cierta funcionalidad adentro de un tipo de “caja negra”.<br />
• Flat is better than nested: La funcionalidad se encuentra anidada en la “caja negra” antes mencionada.<br />
• Special cases aren’t special enough to break the rules: Si consideramos a <strong>Python</strong> pelado como la forma “común” de<br />
hacer las cosas, utilizar una solución de terceros sería no utilizar la forma común, entonces estaríamos frente a un caso<br />
especial donde no utilizamos las reglas comunes de solución de problemas.<br />
• There should be one— and preferably only one —obvious way to do it: Muchas librerías que resuelven un mismo<br />
problema existen (django, web2py, bottle, etc) por lo cual no hay una sola forma evidente de hacer las cosas.<br />
¿Por qué es importante recordar estos puntos?, sencillamente porque ayudan a tomar decisiones de qué librería usar para cada<br />
problema, es importante asumir que cuando nos decidimos a utilizar una librería (o diseñarla) estamos atando nuestro curso de<br />
trabajo futuro a una forma no estándar, que es lo que intenta prevernirnos el Zen de <strong>Python</strong>. Así que pensar en utilizar o<br />
diseñar una librería es un punto bastante crítico a tener en cuenta; así como también es importante recordar estos (otros)<br />
aformismos también presentes en el Zen que evitan que caigamos en:<br />
• Although practicality beats purity: Es mucho mas práctico utilizar una librería que empezar a escribir todo desde cero.<br />
• Namespaces are one honking great idea — let’s do more of those! Las librerías son los espacios de nombres mas<br />
cómodos de utilizar ya que se mantienen totalmente ajenos a nuestro desarollo<br />
Así que dado que hay cosas contradictorias en las decisiones de diseños de API’s y librerías voy a continuar dando unos consejos<br />
útiles a la hora de tomar la decisión de encarar un proyecto de este tipo para que se ajuste lo mejor posible a los principios del<br />
“estandaridad” de uso que plantea el Zen de <strong>Python</strong>.<br />
Consejos<br />
Exponer solo los métodos necesarios: Tratar de exponer muchos métodos, clases, funciones y variables públicos puede<br />
confundir al usuario de tu API. Tratar de mantener las llamadas públicas justas, que sirvan para dar la funcionalidad de la<br />
librería y no mucho mas. Tampoco hay que excederse con esto ya que si dejamos muy rígida nuestra librería, por la falta de<br />
comportamiento público puede que en algunos casos se vuelva inútil. En definitiva, debería cumplirse esto:<br />
>>> len([n for n in dir(obj) if not n.startswith("_")])<br />
(numero pequeño)<br />
<strong>Python</strong> <strong>Entre</strong> <strong>Todos</strong> (número 5, Marzo 2012) — http://revista.python.org.ar