Tôi dường như gặp phải một vài vấn đề về thiết kế và tôi không bao giờ biết những gì là thực sự phù hợp. Một mặt tôi thường nghe rằng tôi nên hạn chế khớp nối và dính vào trách nhiệm duy nhất, nhưng khi tôi làm tôi thường thấy khó khăn để lấy thông tin cho một phần của chương trình khi cần thiết. Đối với dụ,Nguyên tắc Nguyên tắc Tốt nhất
class Singer
def initialize(name)
@name = name
end
attr :name
end
Sau đó nên Sông là:
class Song
def new(singer)
@singer = singer
end
end
hoặc
class Song
def new(singer_name)
@singer_name = singer_name
end
end
này sau đó còn ít khớp nối, vì vậy theo nguyên tắc tôi nên sử dụng nó. Nhưng nếu sau này tôi phát hiện ra điều gì đó trong bài hát cần biết thêm về ca sĩ , tôi đang ở trong tình trạng tồi tệ. ví dụ.
class Song
...
def play
puts "Belting it out by #{@singer.name}, winner of
#{@singer.grammy_count} grammies!"
end
end
Tôi sẽ được sửa chữa nếu tôi đã sử dụng lớp Bài hát sau thay vì trước đây. Nhưng sau đó tôi nghi ngờ ai đó sẽ nhắc nhở tôi về SRP, đơn nguyên tắc trách nhiệm , và đề nghị thay vì:
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
Và yea, tôi đoán có ý nghĩa, vì ca sĩ khác có thể làm một bìa của một số ai khác là bài hát, phải không? Nhưng sau đó, nó sẽ thực sự là chính xác cùng một bài hát ? Trong hầu hết các trường hợp của tôi, nó không bao giờ giống "bài hát" vì vậy tôi không bao giờ có rằng loại kịch bản. Vậy SRP có xứng đáng với các lớp phụ mà nó mang đến cho mã số sau đó không?
Đôi khi tôi nghĩ nhiều nguyên tắc OOP, RẮN hoặc cách khác, phát sinh ra các giới hạn của Java và không áp dụng tốt cho Ruby.