Die Programmiersprache Ruby

Blog| Forum| Wiki  

Das DRY-Prinzip (von engl. Don't repeat yourself, wiederhole dich nicht) soll die Arbeit mit Ruby-Quellcode verbessern. Es sagt aus, dass Programmabschnitte, die sich ähneln oder gar gleich sind, nicht immer wieder erneut geschrieben werden sollen, sondern an einem zentralen Punkt definiert werden sollen. Dadurch wird der Code weniger fehleranfällig, weil z.B. nicht jedes Mal, wenn eine kleine Änderung am sich wiederholenden Code vonnöten ist, alle Abschnitte, in denen dieser Code vorkommt, verändert werden müssen (auf die Gefahr hin, einen auszulassen), sondern nur die eine zentrale Stelle, an der er definiert wurde. Nicht DRY-Konformer Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Frame

  def initialize(x, y)
    @pos = [x, y]
  end
  
  def change_color(col)
    @col = col
    #Viele Codezeilen zum Update des Frames...
  end
  
  def change_position(x, y)
    @pos = [x, y]
    #Viele Codezeilen zum Update des Frames...
  end
  
  def remove
    @color = Color::TRANSPARENT
    #Viele Codezeilen zum Update des Frames...
  end
end

Besser wäre:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Frame
  def initialize(x, y)
    @pos = [x, y]
  end
  
  def update
    #Viele Codezeilen zum Update des Frames...
  end
  
  def change_color(col)
    @color = col
    update
  end
  
  def change_position(x, y)
    @pos = [x, y]
     update
  end
  
  def remove
    @color = Color::TRANSPARENT
    update
  end
end

Das DRY-Prinzip sollte man aber nicht auf allzu kleine Codeabschnitte anwenden, da dies wiederum zu Behinderungen führen kann. Übertriebenes DRY:

1
2
3
4
5
6
7
class Person
  attr_accessor :name, :address, :weight
  
  def initialize(name)
    @name = name
  end
end

Wenn man nun nur :address entfernen wollte, müsste man das erst umständlich herausschneiden anstatt es einfach auszukommentieren. Auch RDoc tut sich mit der Dokumentation von Attributen schwer, wenn sie so definiert wurden. Besser greift man zu ein wenig Wiederholung:

1
2
3
4
5
6
7
8
9
class Person
  attr_reader :name #Namens��nderungen brauchen wir ja nicht, oder...?
  attr_accessor :address
  attr_accessor :weight
  
  def initialize(name)
    @name = name
  end
end

Siehe auch