復習 - ユーザーマネージャー
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 68/70。
チャレンジ
簡単ユーザー管理システムを構築しましょう。これは、実際の多くのプログラムで見かける実用的なアプリケーションです。連携して動作する2つのクラスを作成します。1つは個々のユーザーを表し、もう1つはユーザーの collection を効率的に管理します。
コードを3つのファイルに分けて整理します。
User.lua: システム内の1人のユーザーを表す User class を作成します。各ユーザーにはidとnameがあります。:getInfo()method を含め、その method は"ID: {id}, Name: {name}"形式の string を返すようにします。UserManager.lua: ユーザーの collection を扱う manager class を構築します。効率的な lookup のために、ユーザーをどのように保存するか考えてみましょう。ユーザーの ID を table key として使うと、list 内を検索するよりも、ユーザーの検索や削除がはるかに簡単になります。manager には次の機能が必要です。:addUser(user): User object を collection に追加する:removeUser(id): ID によってユーザーを削除する:findUser(id): matching する ID の User を返し、見つからない場合はnilを返す:listUsers(): すべてのユーザーの info を、1行に1人ずつ print する
main.lua: すべてを組み合わせます。UserManager を作成し、受け取った input に基づいてユーザーを追加し、操作を実行して結果を表示します。
5つの input を受け取ります。
- 最初のユーザーの ID(number)
- 最初のユーザーの name
- 2人目のユーザーの ID(number)
- 2人目のユーザーの name
- 検索対象のユーザーの ID(number)
main file では、次の処理を行います。
- UserManager を作成し、both ユーザーを追加する
:listUsers()を Call してすべてのユーザーを print する- 最初のユーザーを削除する(最初の ID を使用)
"After removal:"を Print する- もう一度
:listUsers()を Call する - 5番目の input の ID を持つユーザーを検索し、found ならその info を print し、見つからない場合は
"User not found"を print する
たとえば、input が 101、Alice、102、Bob、102 の場合、output は次のようになります。
ID: 101, Name: Alice
ID: 102, Name: Bob
After removal:
ID: 102, Name: Bob
ID: 102, Name: Bobinput が 201、Charlie、202、Diana、201 の場合、output は次のようになります。
ID: 201, Name: Charlie
ID: 202, Name: Diana
After removal:
ID: 202, Name: Diana
User not found2つ目の例では、user 201(Charlie)を削除した後、その ID を検索すると "User not found" が返されることに注目してください。これは、そのユーザーがすでに system に存在しないためです。
自分で試してみよう
-- main.lua: すべてをまとめる
local User = require('User')
local UserManager = require('UserManager')
-- 入力を読み取る
local id1 = tonumber(io.read())
local name1 = io.read()
local id2 = tonumber(io.read())
local name2 = io.read()
local searchId = tonumber(io.read())
-- TODO: UserManager のインスタンスを作成する
-- TODO: 入力データで2つの User オブジェクトを作成する
-- TODO: 両方のユーザーをマネージャーに追加する
-- TODO: listUsers() を呼び出してすべてのユーザーを表示する
-- TODO: 最初のユーザーを削除する (id1 を使用)
-- TODO: Print "After removal:"
-- TODO: 再度 listUsers() を呼び出す
-- TODO: searchId のユーザーを検索する
-- If found, print their info; if not found, print "User not found"
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ