Принцип наилучших принципов

, кажется, я часто сталкиваюсь с парой проблем дизайна, и я никогда не знаю, что действительно . С одной стороны, я часто слышу, что мне следует ограничить взаимосвязь и придерживаться единоличной ответственности, но когда я это делаю, мне часто бывает трудно получить информацию для части программы. когда это необходимо. Например, ,

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 и не применяются так хорошо Руби.

5
задан troelskn 24 November 2011 в 10:22
поделиться