Me dicen que mi código es horrible😩 . ¿Por qué no le dejan el tema de la belleza a lxs teoricxs? Y, ¿me explican por qué lo dicen y cómo puedo mejorarlo?

Why this talk?

Como fisique no estoy formado para producir código "productivo"

  • Me enfoco en los detalles y quiero saber el cómo
  • Estudié los casos específicos y aislados
  • No sé extrapolar a casos más generales
  • Lo que produzco no está pensado para ser reutilizado
  • No sé anticiparme a casos particulares y límites

Ejemplo:

Resolver un problema de cinemática

Ecuaciones de Newton

$F = m*a$

Coordenadas cartesianas :

$t, x, y$

Coordenadas polares:

$t, r, \theta$

Ecuaciones de Euler-Lagrange, Ecuaciones de Hamilton

Coordenadas canónicas:

$t, p, q$

¿Qué es un objeto?

👤

In [1]:
'homunculo'
Out[1]:
'homunculo'

👤 ✉️

In [2]:
'homunculo'.upper()
Out[2]:
'HOMUNCULO'

👤 💌

In [3]:
'homunculo'.split('o')
Out[3]:
['h', 'muncul', '']

👤 💌 🖃 👤 ✉️ 🧧 👤

  • API ( *Aplication Programming Interface** )
  • Interfase
  • Protocolo

¿Qué es el refactoring?

Refactoring is the process of changing a software system in such a way that it does not alter the external behavior of the code yet improves its internal structure. — Martin Fowler Refactoring

import numpy as np
import matplotlib.pyplot as plt

t,x = np.loadtxt('a_1.txt')
def f(x,t,y):
    return ( x[0] * t**2 + x[1] * t**4 + x[2] - y )   

from scipy.optimize import least_squares
x0 = np.array([0, 0, 0])
res = least_squares(f, x0, args=(t,x), verbose=2, loss='cauchy', method='dogbox',ftol=1e-10)
y = res.x[0] * t**4 + res.x[1] * t**2 + res.x[2]
plt.plot(t,x,'ok')
plt.plot(t,y,'r')
ax = plt.gca()
ax.set_ylim(-2,2)

SOLID

Single Responsability Principle

import numpy as np
import matplotlib.pyplot as plt

t,x = np.loadtxt('a_1.txt')
def f(x,t,y):
    return ( x[0] * t**2 + x[1] * t**4 + x[2] - y )   

from scipy.optimize import least_squares
x0 = np.array([0, 0, 0])
res = least_squares(f, x0, args=(t,x), verbose=2, loss='cauchy', method='dogbox',ftol=1e-10)
y = res.x[0] * t**4 + res.x[1] * t**2 + res.x[2]
plt.plot(t,x,'ok')
plt.plot(t,y,'r')
ax = plt.gca()
ax.set_ylim(-2,2)

Open Close Principle

Objects should be open for extension, but closed for modification.

import numpy as np
import matplotlib.pyplot as plt

t,x = np.loadtxt('a_1.txt')
def f(x,t,y):
    return ( x[0] * t**2 + x[1] * t**4 + x[2] - y )   

from scipy.optimize import least_squares
x0 = np.array([0, 0, 0])
res = least_squares(f, x0, args=(t,x), verbose=2, loss='cauchy', method='dogbox',ftol=1e-10)
y = res.x[0] * t**4 + res.x[1] * t**2 + res.x[2]
plt.plot(t,x,'ok')
plt.plot(t,y,'r')
ax = plt.gca()
ax.set_ylim(-2,2)

$ H = \frac{p^2}{2*m} $

$ H = \frac{p^2}{2*m} + q^2 $

$ H = \frac{p^2}{2*m} + q^2 + ... + V(p,q) $

Objetos

Programming objects/computing objects

Pensar a objeto como pequeñas entidades inteligentes con las cuales podemos interactuar mediante mensajes

Testing

  • Testear es bueno
  • El Testing es complicado de realizar, al principio. Necesita práctica
  • El Testing es la presión que fuerza el diseño de tu código
  • Los Tests son parte del código. Código no testeado es código que no existe
  • Los Tests son los primeros usuarios de tu código

Referencias