非常に単純な User クラスを作成しました。インスタンス変数 email には、リーダー アクセサーと、メール アドレスを正規表現で検証する独自のライター アクセサーがあります。
class User
attr_reader :email
def email=(value)
if (value =~ /^[a-z\d\-\_\+\.]+@([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 = 'user@example.com'
# bypassing the writer accessor. evil.
@user.email[4] = '#'
assert_equal('user@example.com', @user.email)
end
end
リーダー アクセサーによって提供された参照を使用することで、ライター アクセサーを介さずに email インスタンス変数を操作できます。
同じ原則が、= で新しい値を完全に代入することなく操作できるすべてのデータ型に適用されます。
私は熱心すぎますか?堅牢なコードを書きたいだけです。メールアドレスがライターアクセサーを使用してのみ設定できるようにする方法はありますか?
私はこの言語に不慣れで、ベストプラクティスの感触を掴もうとしています。