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