+ All Categories
Home > Documents > S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea...

S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea...

Date post: 18-Jun-2021
Category:
Upload: others
View: 0 times
Download: 0 times
Share this document with a friend
90
S.O.L.I.D. Python
Transcript
Page 1: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

S.O.L.I.D. Python

Page 2: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Alea Soluciones Bifer Team

Page 3: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

@eferro@pasku1 @apa42

@nestorsalceda

Page 4: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Usual OO Systems

RigidFragile

ImmobileViscous

Page 5: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 6: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Why S.O.L.I.D. principles?

To create easy to maintain OO systemsImprove reusability

Easy testing

Page 7: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

For creating

Clean Code

Page 8: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

It's all about money

Page 9: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 10: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

S.O.L.I.DSRP - Single responsibility principleDIP - Dependency inversion principleOCP - Open/closed principleLSP - Liskov substitution principleISP - Interface segregation principle

Page 11: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

PrinciplesNot Rules

Page 12: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 13: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Car wash service car wash job when the car enters in the car wash ✓ it registers a job customer notification when service completed ✓ it notifies the customer reporting when client report requested ✓ it shows all wash services for that customer

3 examples ran in 0.0178 seconds

Page 14: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 15: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 16: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 17: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 18: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

…Some refactors / versions later

Page 19: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 20: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 21: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Depend upon Abstractions. Do not depend upon concretion

Page 22: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Compilation / Startup time dependency

from <package> import module

Page 23: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Runtime dependency

self.collaborator.message()

Page 24: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 25: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Global State ProblemImplicit dependency problemConcrete API

Page 26: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

No dependency injectionImplicit dependency problem

Concrete API

Page 27: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 28: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 29: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 30: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 31: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 32: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 33: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Duck Typing Approved!!!

Page 34: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 35: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Liskov Substitutionprinciple violation

Page 36: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Python don't force type inheritanceFor API implementation

(So, for reuse code, prefer Composition)

Page 37: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Derived types must be completely substitutable for their base types

Page 38: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 39: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

It isn't so important

Page 40: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

A narrow interface is a better interface

Page 41: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

SOLID Motivational Posters, by Derick Baileyhttp://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/

Page 42: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

car_wash code examplehttps://github.com/aleasoluciones/car_wash

SOLID definition (at wikipedia)http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

Getting a SOLID start (Uncle Bob)http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Video SOLID Object Oriented Design (Sandi Metz)http://www.confreaks.com/videos/240-goruco2009-solid-object-oriented-design

Page 43: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 44: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 45: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Thanks !!!@eferro

@pasku1 @apa42

@nestorsalceda

Page 46: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

S.O.L.I.D. Python

Page 47: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Alea Soluciones Bifer Team

Hacemos productoTelecomunicacionesSistemas + SoftwareExtreme ProgrammingAportamos valor

Page 48: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

@eferro@pasku1 @apa42

@nestorsalceda

Page 49: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Usual OO Systems

RigidFragile

ImmobileViscous

Page 50: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 51: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Why S.O.L.I.D. principles?

To create easy to maintain OO systemsImprove reusability

Easy testing

Page 52: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

For creating

Clean Code

Page 53: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

It's all about money

Page 54: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 55: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

S.O.L.I.DSRP - Single responsibility principleDIP - Dependency inversion principleOCP - Open/closed principleLSP - Liskov substitution principleISP - Interface segregation principle

Page 56: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

PrinciplesNot Rules

Page 57: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 58: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Car wash service car wash job when the car enters in the car wash ✓ it registers a job customer notification when service completed ✓ it notifies the customer reporting when client report requested ✓ it shows all wash services for that customer

3 examples ran in 0.0178 seconds

Page 59: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 60: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Un módulo o una función debe tener una y solo una responsabilidad, o lo que es lo mismo, debe tener una y solo una razón para cambiar.

Más de una responsabilidad hace que el código sea dificil de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio.

¿Y qué es una responsabilidad?

Se trata de la audiencia de un determinado módulo o función, actores que reclaman cambios al software. Las responsabilidades son básicamente familias de funciones que cumplen las necesidades de dichos actores.

Page 61: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 62: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 63: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

…Some refactors / versions later

Page 64: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Una clase no debe tener más que una razón para cambiar

Responsabilidad / Razón para cambiar

Responsabilidad / Role en la aplicación

Reusar una clase y su contextoSi tiene varias responsabilidades tiene un contexto muy complejo

Cohesión: Qué tan fuertemente relacionadas y enfocadas están las distintas responsabilidades de un módulo.

Acoplatmiento: El grado en el cual cada módulo de un programa depende de cada uno de los otros módulos

Page 65: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Este ejemplo me gustó mucho cuando lo ví!!

Ejemplo: Tiempos Viejunos: Cuando estaban CGA, VGA, SuperVGA, etc…Ejemplo: Tiempos Viejunos: Al imprimir=> driver para una impresora específica

Page 66: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Depend upon Abstractions. Do not depend upon concretion

Page 67: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Compilation / Startup time dependency

from <package> import module

Page 68: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Runtime dependency

self.collaborator.message()

Page 69: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 70: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Global State ProblemImplicit dependency problemConcrete API

Page 71: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

No dependency injectionImplicit dependency problem

Concrete API

Page 72: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 73: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 74: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 75: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 76: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 77: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 78: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Duck Typing Approved!!!

Page 79: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 80: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Liskov Substitutionprinciple violation

Page 81: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Python don't force type inheritanceFor API implementation

(So, for reuse code, prefer Composition)

En Python herencia- Herencia tipos (sólo se usaría para las excepciones y si usas instance_of)- Herencia Implementación (en muchos casos es facilmente sustituible por composicion (ademas es recomendable))

Page 82: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Derived types must be completely substitutable for their base types

En Python herencia- Herencia tipos (sólo se usaría para las excepciones y si usas instance_of)- Herencia Implementación (en muchos casos es facilmente sustituible por composicion (ademas es recomendable))

Page 83: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 84: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

It isn't so important

Page 85: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

A narrow interface is a better interface

Page 86: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

SOLID Motivational Posters, by Derick Baileyhttp://lostechies.com/derickbailey/2009/02/11/solid-development-principles-in-motivational-pictures/

Page 87: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

car_wash code examplehttps://github.com/aleasoluciones/car_wash

SOLID definition (at wikipedia)http://en.wikipedia.org/wiki/SOLID_(object-oriented_design)

Getting a SOLID start (Uncle Bob)http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

Video SOLID Object Oriented Design (Sandi Metz)http://www.confreaks.com/videos/240-goruco2009-solid-object-oriented-design

Page 88: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 89: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?
Page 90: S.O.L.I.D. Python - PyCon · de leer, de testear y mantener. Es decir, hace que el código sea menos flexible, más rígido, mucho más resistente al cambio. ¿Y qué es una responsabilidad?

Thanks !!!@eferro

@pasku1 @apa42

@nestorsalceda

DesksurfingsNos gusta hablar de estas cosas


Recommended