Mi sembra di imbattersi in un paio di problemi di progettazione molto e non so mai cosa sia veramente corretto. Da una parte sento spesso che dovrei limitare l'accoppiamento e attenersi a una singola responsabilità, ma quando lo faccio spesso trovo difficile a ottenere le informazioni a parte del programma quando è necessario. Ad esempio ,Principio dei migliori principi
class Singer
def initialize(name)
@name = name
end
attr :name
end
Poi dovrebbe essere canzone:
class Song
def new(singer)
@singer = singer
end
end
o
class Song
def new(singer_name)
@singer_name = singer_name
end
end
Più tardi ha meno di accoppiamento, a tal fine i principi che dovrebbero usarlo. Ma se in seguito scoprirò qualcosa in Song ha bisogno di sapere di più sul cantante , sono in un brutto modo. per esempio.
class Song
...
def play
puts "Belting it out by #{@singer.name}, winner of
#{@singer.grammy_count} grammies!"
end
end
Sarei in una correzione se avessi usato la classe Song in seguito al posto del ex. Ma poi ho il sospetto che qualcuno mi avrebbe ricordato di SRP, unico principio responsabilità , e suggeriscono invece:
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
E sì, immagino che abbia un senso, dal momento che un altro cantante potrebbe fare una cover di qualcun altro è canzone, giusto? Ma allora, sarebbe davvero la stessa canzone ? Nella maggior parte dei casi non è mai la stessa "canzone", quindi non ho mai lo tipo di scenario. Quindi lo SRP vale le classi extra che aggiunge al codice ?
A volte penso che molti principi OOP, SOLID o altrimenti, sono sorti a limitazioni di Java e non si applicano molto bene a Ruby.