まとめ:セキュアな保管庫
CoddyのLuaジャーニー「Object Oriented Programming」セクションの一部 — レッスン 48/70。
チャレンジ
簡単クロージャベースのプライバシーを使用して、真に安全なストレージシステムを作成する Vault クラスを構築しましょう!このヴォルト(金庫)は、正しいパスワードを提供することによってのみアクセスできる秘密の内容を保持します。
コードは2つのファイルに分けて構成します:
Vault.lua: コンストラクタ内のローカル変数に内容とパスワードの両方を保存し、外部からのアクセスを完全に遮断するクラスを作成します。コンストラクタ:new(contents, password)は、これらの値をローカル変数に保存し、オブジェクトインスタンスに直接メソッドを定義する必要があります::open(attemptedPassword)— 入力されたパスワードが保存されているパスワードと一致するかどうかを確認します。正しい場合は秘密の内容を返し、正しくない場合は"Access Denied"を返します。
main.lua: Vault モジュールをrequireし、3つの入力(保存する秘密の内容、設定するパスワード、およびパスワードの試行)を読み取ります。内容とパスワードを指定してヴォルトを作成し、試行されたパスワードでそれを開こうとして結果を出力します。また、vault.contentsに直接アクセスを試みてその結果を出力することで、内容が真にプライベートであることを示してください。
3つの入力を受け取ります:
- ヴォルトに保存する秘密の内容
- ヴォルトを保護するためのパスワード
- ヴォルトを開くために試行するパスワード
出力は以下の2行にする必要があります:
Result: {resultFromOpen}
Direct access: {whatYouGetFromVaultContents}例えば、入力が Gold Coins、secret123、secret123 の場合、出力は以下のようになります:
Result: Gold Coins
Direct access: nil入力が Diamond、mypass、wrongpass の場合、出力は以下のようになります:
Result: Access Denied
Direct access: nilここでの重要な洞察は、contents と password の両方がコンストラクタ内のローカル変数としてのみ存在することです。:open() メソッドはクロージャを通じてそれらにアクセスできますが、それ以外のもの(vault.contents、vault._contents、vault.password など)からは一切アクセスできません。これが真のカプセル化です!
自分で試してみよう
-- Vaultモジュールを読み込む
local Vault = require('Vault')
-- 入力を読み込む
local contents = io.read()
local password = io.read()
local attemptedPassword = io.read()
-- TODO: contentsとpasswordを使用してvaultを作成する
-- TODO: attemptedPasswordを使用してvaultを開いてみる
-- TODO: "Result: {resultFromOpen}" の形式で結果を出力する
-- TODO: vault.contentsに直接アクセスを試み、取得した内容を出力する
-- "Direct access: {whatYouGetFromVaultContents}" の形式で出力する