Tôi có một loạt các đối tượng Ruby mô hình hóa XML cơ bản (như một OXM). Thật không may, XML đang được thay đổi và phiên bản tương ứng đang được bumped. Tôi cần cập nhật các đối tượng Ruby để có thể xử lý cả hai phiên bản. Tôi muốn một cái gì đó sạch hơn một tấn nếu/else mệnh đề trong phương pháp của tôi, vì điều này có khả năng xảy ra một lần nữa. Có một cách Ruby độc đáo để xử lý điều này? Tôi đã nghĩ đến việc sử dụng các lớp cơ sở như là một proxy cho nhiều "phiên bản" lớp học, tức làVersioning a Ruby Object
class XMLModel
class V1
# V1 specific implementation
end
class V2;
# V2 specific implementation
end
def initialize
# create a new V? and set up delegation to that specific version of the object
end
def from_xml(xml_string)
# use the XML string to determine correct version and return a
# specific version of the object
end
end
Những điều tốt đẹp về các phương pháp trên là mỗi phiên bản là khác biệt trong mã, và cho phép tôi để thêm/thả các phiên bản có ít khả năng tương thích ngược. Điều xấu là tôi sẽ có khả năng kết thúc với rất nhiều bản sao mã. Ngoài ra, trong trường hợp này, số XMLModel.new
trả lại XMLModel
mới, trong khi phương thức nhà máy XMLModel.from_xml
trả về một XMLModel::V1
mới.
Ý tưởng?
Bạn có thể ẩn câu lệnh 'if' đó trong khởi tạo XMLModel (tức là' mới') ... có vẻ như tôi không sử dụng tính năng intialization riêng biệt, tức là 'XMLModel.create'. Tôi muốn mọi người không phải biết về phiên bản và có thể sử dụng đối tượng như một đối tượng Ruby bình thường và gọi 'XMLModel.new', do đó ẩn tất cả việc triển khai đằng sau mô hình. –
bạn có thể ghi đè lên ':: new'. Phương pháp mới mặc định là (tôi nghĩ) một cái gì đó như: 'def new (* args); obj = phân bổ; obj.initialize (* args); retrun obj; end' Xin lỗi cho một-lót, ý kiến và mã không kết hợp tốt. – Ian
thêm câu trả lời với việc xây dựng lại nhiều hơn nữa :: new – Ian