, кажется, я часто сталкиваюсь с парой проблем дизайна, и я никогда не знаю, что действительно . С одной стороны, я часто слышу, что мне следует ограничить взаимосвязь и придерживаться единоличной ответственности, но когда я это делаю, мне часто бывает трудно получить информацию для части программы. когда это необходимо. Например, ,
class Singer
def initialize(name)
@name = name
end
attr :name
end
Тогда Сонг должен быть:
class Song
def new(singer)
@singer = singer
end
end
или
class Song
def new(singer_name)
@singer_name = singer_name
end
end
Последний имеет меньшую взаимосвязь, поэтому в соответствии с принципами я должен его использовать. Но если позже я что-то обнаружу в Песне нужно больше узнать о певце , я в плохом положении. например
class Song
...
def play
puts "Belting it out by #{@singer.name}, winner of
#{@singer.grammy_count} grammies!"
end
end
Я бы поправился, если бы использовал более поздний класс Song вместо прежнего. Но тогда я подозреваю, что кто-то напомнил бы мне о SRP, единственная ответственность {{1} } принцип, а вместо этого предлагаю:
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
И да, я думаю, это имеет смысл, поскольку другой певец может сделать кавер на чью-то песню, верно? Но тогда, действительно ли это будет та же самая песня ? В большинстве случаев это никогда не бывает одной и той же "песней", поэтому у меня никогда не было такого сценария. Так стоит ли SRP дополнительных классов, которые он привносит в код ?
Иногда мне кажется, что многие принципы ООП, SOLID или другие, возникли в результате ограничений Java и не применяются так хорошо Руби.