¿Público y/o Públicado?
Cuando ré/factorizamos surgen nuevos elementos de los cuales es importante determinar si son públicos y adicionalmente estan publicados, si no hacemos esta aclaración podemos fácilmente crear referencias innecesarias, veamos un ejemplo.
class Billetera
def initialize
@movimientos = []
end
def ingreso(concepto, valor)
@movimientos << [concepto, valor]
end
def gasto(concepto, valor)
@movimientos << [concepto, -valor]
end
def saldo
@movimientos.inject(0) { |saldo, movimiento| saldo + movimiento[1] }
end
end
La clase Billetera
es pública
y publicada
(concepto común al asumir que cualquiera puede referenciar la clase y hacer uso de esta).
Ahora realicemos una refactorización buscando la apertura del concepto movimiento.
class Movimiento
def self.debito(concepto, valor)
new(concepto, valor)
end
def self.credito(concepto, valor)
new(concepto, -valor)
end
def balancear(saldo)
saldo + @valor
end
private
def initialize(concepto, valor)
@concepto = concepto
@valor = valor
end
end
class Cuenta
def initialize
@movimientos = []
end
def registrar(movimiento)
@movimientos << movimiento
end
def saldo
@movimientos.inject(0) { |saldo, movimiento| movimiento.balancear(saldo) }
end
end
class Billetera
def initialize(cuenta)
@cuenta = cuenta
end
def ingreso(concepto, valor)
@cuenta.registrar Movimiento.debito(concepto, valor)
end
def gasto(concepto, valor)
@cuenta.registrar Movimiento.credito(concepto, valor)
end
def saldo
@cuenta.saldo
end
end
Las clases Billetera
, Cuenta
, Movimiento
son por defecto públicas
(este es el alcance general pero cada lenguaje tiene
un comportamiento diferente por ejemplo en C# el alcance por defecto es private
) ahora,
¿las nuevas clases (Cuenta
, Movimiento
) deben estar publicadas
, es decir podemos referenciarlas desde otras secciones del programa?
no, no están publicadas son elementos que surgieron de la refactorización y tienen alta cohesión
con el origen de la creación (Billetera
), posteriorme a la llegada de nuevos requerimientos se valoraría si deben ser publicadas
.
Ahora ¿Cómo podemos hacer explicito este concepto? ni idea (si tengo ideas), es algo que queda a la creatividad del equipo ya
que depende de
.