我寫了一個非常簡單的用戶類。實例變量電子郵件有一個閱讀器訪問器和我自己的作者訪問器,用正則表達式驗證電子郵件地址。通過操作繞過編寫器訪問器而不是分配
class User
attr_reader :email
def email=(value)
if (value =~ /^[a-z\d\-\_\+\.][email protected]([a-z\d\-]+\.)+[a-z]+$/)
@email = value
else
# bonus question: is ArgumentError the right error type to use here?
raise ArgumentError, "#{value} is not a valid email address."
end
end
end
我寫了下面的測試:
require 'test/unit'
require_relative '../lib/user'
class TC_UserTest < Test::Unit::TestCase
def setup
@user = User.new()
end
def test_email
# using the writer accessor
@user.email = '[email protected]'
# bypassing the writer accessor. evil.
@user.email[4] = '#'
assert_equal('[email protected]', @user.email)
end
end
通過使用由讀者訪問給我參考,我能夠處理電子郵件實例變量,而無需通過作家訪問去。
同樣普林西將適用於任何類型的數據,可以讓操作不直接分配與=
我被過分熱心的新的價值?我只想編寫健壯的代碼。有沒有辦法確保我的電子郵件地址只能使用writer訪問器進行設置?
我是新來的語言,我試圖感受最佳實踐。
感謝您的詳細解釋!我會忠於你的忠告。 –