Parece que me encuentro con un par de cuestiones de diseño mucho y nunca sé qué es realmente adecuado. Por un lado, a menudo escucho que debo limitar el acoplamiento y a la única responsabilidad, pero cuando lo hago a menudo me resulta difícil a obtener la información de una parte del programa cuando sea necesario. Para ejemplo,Principio de los mejores principios
class Singer
def initialize(name)
@name = name
end
attr :name
end
Entonces debería ser Canción:
class Song
def new(singer)
@singer = singer
end
end
o
class Song
def new(singer_name)
@singer_name = singer_name
end
end
Este último, tiene menos de acoplamiento, lo que de acuerdo a los principios que deberían usarlo. Pero si más tarde descubro algo en Song, necesito saber más sobre el cantante , estoy en un mal camino. p.ej.
class Song
...
def play
puts "Belting it out by #{@singer.name}, winner of
#{@singer.grammy_count} grammies!"
end
end
Estaría en un aprieto si hubiera utilizado la clase Song tarde en lugar de la antigua . Pero entonces sospecho que alguien me recordará de SRP, solo principio responsabilidad , y sugieren su lugar:
class SongPlayer
def initialize(singer, song)
@singer, @song = singer, song
end
def play
puts "Belting it out by #{@singer.name}, winner of
#{@singer.grammy_count} grammies!"
end
end
Y sí, supongo que tiene sentido, ya que otro cantante podría hacer una cubierta de alguien más es canción, ¿verdad? Pero entonces, ¿sería realmente la misma canción exacta de ? En la mayoría de mis casos, nunca es la misma "canción", así que nunca tengo ese tipo de escenario . Entonces, ¿vale la SRP las clases adicionales que aporta al código ?
A veces pienso que muchos principios OOP, SÓLIDOS u otros, surgieron de las limitaciones de Java de , y no se aplican tan bien a Ruby.