¿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.