2012-12-02 21 views
5

Tôi đang trong quá trình viết lại/tái cấu trúc ứng dụng cũ cho khách hàng từ Rails 2.x đến 3.x. Là một phần của việc tái cấu trúc, tôi cũng muốn loại bỏ các mô hình/phương pháp bằng ngôn ngữ địa phương sang một cơ sở mã tiếng Anh thuần túy.Khước từ toàn bộ mô hình trong Rails

Điều này liên quan đến việc viết các phương pháp mới cho hầu hết mọi tính năng. Tôi giải quyết này cho các phương pháp bằng cách thực hiện:

def english_method 
    # ... 
end 

def native_method 
    warn 'DEPRECATED, please use #english_method' 
    english_method 
end 

này hoạt động tốt cho các phương pháp, và giúp tôi theo dõi những nơi mà các phương pháp cũ vẫn được sử dụng, mà không vi phạm bất kỳ mã.

Đối với các lớp học (mô hình) Tuy nhiên, tôi đã thực hiện:

class NativeClass < EnglishClass 
    # DEPRECATED, Please use EnglishClass 
end 

class EnglishClass 
    # ... 
end 

này "tác phẩm", bất cứ khi nào NativeClass được gọi, ứng dụng vẫn hoạt động, nhưng tôi không nhận được bất kỳ tin nhắn trong nhật ký thông báo cho tôi về một phần của đơn đăng ký vẫn đang gọi số NativeClass.

Làm cách nào để đảm bảo mọi "chạm" của NativeClass thực sự dẫn đến lỗi nhật ký được ghi?

tôi đã cố gắng (không có lý do khác hơn là suy nghĩ "có thể làm việc này") để làm:

class NativeClass < EnglishClass 
    -> { ActiveSupport::Deprecation.warn 'Native model is deprecated in favor of English' } 
end 

Nhưng đó (rõ ràng?) Đã không làm việc. Tôi hình lambda sẽ được lười biếng nạp mỗi khi NativeClass được gọi, nhưng sự hiểu biết của tôi về lambdas vẫn còn hơi nông cạn, vì vậy tôi có thể bị nhầm lẫn ở đây.

Bất kỳ manh mối nào về cách phản đối toàn bộ lớp học và gửi thông điệp cảnh báo đến nhật ký của tôi khi nó đang được chạm vào?

"Các phương pháp hay nhất" khác hoặc giải pháp không được chấp nhận được chào đón, nhưng tôi không chắc đó là câu hỏi hợp lệ cho SO (và tôi không muốn mạo hiểm chủ đề này bị đóng cho câu hỏi này).

Trả lời

2

Bạn có thể nên ngừng sử dụng từng phương pháp một cách tốt hơn. Điều này có thể dễ dàng được thực hiện bằng cách sử dụng phương thức phản đối của Rails và chuyển nó một danh sách các phương thức bạn muốn từ chối. Danh sách các phương pháp xác định trong một lớp có sẵn bằng cách sai để public_instance_methods

class NativeClass < EnglishClass 
    def method1 
    end 

    def method2 
    end 

    deprecate *public_instance_methods(false) 
end 

Lưu ý rằng nó cần phải được công bố sau khi các phương pháp công cuối cùng.

+0

Thực ra, tôi không muốn không chấp nhận tất cả các phương pháp (chỉ được nêu ra), tôi chỉ muốn không chấp nhận tên lớp cho bây giờ. Vì vậy, tôi vẫn muốn tất cả các phương thức vẫn giữ nguyên, tôi chỉ muốn cảnh báo khi phương thức được gọi bằng cách sử dụng tên lớp không được chấp nhận. Tôi có thể có thể là một phương pháp 'deprecate' mới mà tôi chèn vào tất cả các phương pháp khác, nhưng tôi đã hy vọng cho một giải pháp dễ dàng hơn. – JeanMertz

4

Cố gắng sử dụng như:

class NativeClass < EnglishClass 
    def initialize 
    ActiveSupport::Deprecation.warn "NativeClass is deprecated and may be removed from future releases, use EnglishClass instead.", caller 
    super 
    end 
end 
+0

Vấn đề với giải pháp này (theo như tôi biết, và thử nghiệm), là phương thức khởi tạo chỉ được kích hoạt nếu tôi tạo một đối tượng lớp mới. Nếu tôi gọi các phương thức trên chính lớp đó hoặc trên các hằng số được định nghĩa trong lớp, thì điều này không được kích hoạt. – JeanMertz

Các vấn đề liên quan