Menu
Coddy logo textTech

復習 - ユーザーマネージャー

CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 68/70。

challenge icon

チャレンジ

簡単

ユーザー管理システムを構築しましょう。これは、実際の多くのプログラムで見かける実用的なアプリケーションです。連携して動作する2つのクラスを作成します。1つは個々のユーザーを表し、もう1つはユーザーの collection を効率的に管理します。

コードを3つのファイルに分けて整理します。

  • User.lua: システム内の1人のユーザーを表す User class を作成します。各ユーザーには idname があります。: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 を受け取ります。

  1. 最初のユーザーの ID(number)
  2. 最初のユーザーの name
  3. 2人目のユーザーの ID(number)
  4. 2人目のユーザーの name
  5. 検索対象のユーザーの ID(number)

main file では、次の処理を行います。

  1. UserManager を作成し、both ユーザーを追加する
  2. :listUsers() を Call してすべてのユーザーを print する
  3. 最初のユーザーを削除する(最初の ID を使用)
  4. "After removal:" を Print する
  5. もう一度 :listUsers() を Call する
  6. 5番目の input の ID を持つユーザーを検索し、found ならその info を print し、見つからない場合は "User not found" を print する

たとえば、input が 101Alice102Bob102 の場合、output は次のようになります。

ID: 101, Name: Alice
ID: 102, Name: Bob
After removal:
ID: 102, Name: Bob
ID: 102, Name: Bob

input が 201Charlie202Diana201 の場合、output は次のようになります。

ID: 201, Name: Charlie
ID: 202, Name: Diana
After removal:
ID: 202, Name: Diana
User not found

2つ目の例では、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オンラインコンパイラ