14日目のゴールとテーマ
14日目のテーマは「“作れる人”としての総仕上げ:パターンを言語化して、自分のアプリに応用する」です。
ここまでで、名簿アプリとタスク管理アプリを作り、保存・読み込み・絞り込み・並べ替え・Appクラス化までやってきました。
今日は、
これまでやってきたことの“共通パターン”を言葉にして整理する
小さな新アプリのアイデアを、設計レベルまで落としてみる
「次から自分で作るときの思考の手順」をはっきりさせる
という、「これから先の自分のためのまとめ」をやっていきます。
名簿アプリとタスクアプリの“共通パターン”を言葉にする
どちらのアプリも、実は同じ型でできている
名簿アプリとタスクアプリを思い出してみてください。
テーマは違いますが、やっていることはかなり似ていました。
どちらも「1件分のデータ」を表すクラスがある(Person / Task)。
どちらも「複数件のデータ」を配列で持っている(people / tasks)。
どちらも「メニューを表示して、番号で操作を選ぶ」仕組みがある。
どちらも「ファイルに保存・読み込み」して“記憶”を持っている。
どちらも「Appクラス(またはそれに相当するもの)」で全体をまとめている。
これを、もう少し抽象的な“型”として言葉にしてみます。
「1件分のデータを表すクラス」
「そのクラスの配列」
「配列に対して行う操作(追加・表示・絞り込み・並べ替え)」
「アプリ全体をまとめるクラス(App)」
この4つが、あなたがこの2週間で体に入れた“アプリの型”です。
「1件分のデータを表すクラス」のパターン
Person と Task に共通していたこと
Person と Task を並べてみると、共通点がはっきり見えてきます。
どちらも「属性(フィールド)」を持っている。
どちらも「表示用のメソッド」を持っている(introduction / summary / detail)。
どちらも「状態を変えるメソッド」を持っている(mark_done など)。
どちらも「保存用の表現」と「復元用の処理」を持っている(to_csv_line / from_csv_line 的なもの)。
これをパターンとして整理すると、こうなります。
クラスは「ただのデータの箱」ではなく、「データ+それに関する操作」をセットで持つ。
表示の仕方はクラス自身に書く(外側で文字列を組み立てない)。
保存用の形式への変換もクラスに任せる(to_csv_line など)。
例えば、もし「本の管理アプリ」を作るなら、Book クラスはこういう形になるはずです。
タイトル、著者、ページ数、読了フラグなどを属性として持つ。
一覧用の summary、詳細用の detail を持つ。
読了にする mark_read、未読に戻す mark_unread を持つ。
to_csv_line と book_from_csv_line を用意して、保存・復元できるようにする。
ここまで来ると、「新しいテーマのクラスを自分で設計できる」状態になっています。
「配列+操作」のパターン
people と tasks に対してやってきたこと
配列に対して、あなたはすでにいろいろな操作を経験しました。
全件表示(each / each_with_index)
追加(<<)
条件で絞り込み(select / reject)
条件で分ける(未完了だけ、完了済みだけ)
並べ替え(sort_by)
これをパターンとしてまとめると、こうなります。
「配列に対してやりたいこと」は、だいたいこの3つに分類できる。
全員(全件)に対して何かする → each
条件に合うものだけ欲しい → select / reject
順番を変えたい → sort / sort_by
例えば、「本の管理アプリ」で「ページ数が多い順に並べたい」と思ったら、
もう書き方は見えています。
sorted = books.sort_by { |book| -book.pages }
Ruby「未読だけ表示したい」なら、
unread = books.reject { |book| book.read }
Ruby名簿アプリとタスクアプリでやったことが、そのまま別のテーマに移植できるのが分かるはずです。
「Appクラス」のパターン
TaskApp でやったことを抽象化する
13日目で作った TaskApp を思い出してみましょう。
中身を抽象的に見ると、こうなっていました。
initialize で「アプリが扱うデータ」を読み込む(@tasks = load_tasks)。
run で「メニューを表示 → 入力を読む → 分岐して処理を呼ぶ」を繰り返す。
show_menu で「ユーザーに選択肢を見せる」。
read_menu_number で「ユーザーの選択を安全に受け取る」。
handle_〜 メソッド群で「具体的な操作(表示・追加・変更など)」を行う。
save_〜 で「終了時にデータを保存する」。
これをパターンとして言葉にすると、
Appクラスは「アプリの流れ」を担当する。
データそのものは別のクラス(Person / Task / Book など)が担当する。
Appは「いつ読み込むか」「いつ保存するか」「いつどの操作を呼ぶか」を決める“司令塔”。
もし「本の管理アプリ」を作るなら、BookApp というクラスを作って、
TaskApp とほぼ同じ構造で書けます。
app = BookApp.new
app.run
Rubyこの二行でアプリが動き出す、という形を目指せばいい、という“ゴールの形”がもう見えています。
小さな新アプリを設計してみる練習
例題:簡易家計簿アプリを頭の中で設計する
ここで、実際にコードを書く前の「設計だけ」をやってみます。
テーマは「簡易家計簿アプリ」にしましょう。
まず、「1件分のデータ」を決めます。
家計簿なら、1件は「1つの支出(または収入)」です。
クラス名は Entry としてみます。
Entry が持つ属性を考えます。
日付(文字列でOK)
金額(整数)
カテゴリ(食費、交通費など)
メモ(任意)
次に、「Entry にどんなメソッドを持たせるか」を考えます。
summary → 一覧用の1行表示(例: “2025-03-20 食費 1200円 メモ: ランチ”)
detail → 詳細表示(複数行)
to_csv_line → “2025-03-20,1200,食費,ランチ” のような保存用1行
Entry.from_csv_line(line) → 1行から Entry を復元するクラスメソッド
次に、「配列+操作」を考えます。
entries という配列に Entry を入れていきます。
やりたい操作は例えばこうです。
全件表示
カテゴリごとに絞り込み(食費だけ、交通費だけ)
日付順に並べ替え
合計金額を計算する
ここまで来ると、もう Ruby のコードに落とすイメージが湧いてきます。
カテゴリで絞り込み → select { |e| e.category == “食費” }
日付順 → sort_by { |e| e.date_string }(日付を文字列として扱うならこれでもOK)
合計金額 → entries.sum { |e| e.amount }(sum は Ruby 2.4以降で使える)
最後に、「Appクラス」を考えます。
名前は HouseholdApp とか KakeiboApp とか、好きに付けられます。
initialize で entries を load_entries から読み込む。
run でメニューを回す。
メニュー項目は「一覧」「追加」「カテゴリで絞り込み」「合計金額を見る」「終了」など。
終了時に save_entries を呼ぶ。
ここまで設計できていれば、あとは今までの名簿アプリ・タスクアプリのコードを見ながら、
「Person を Entry に」「TaskApp を KakeiboApp に」置き換えていくだけで、
かなりの部分が自分で書けるはずです。
「これから自分で作るときの思考の手順」
コードを書く前に、まずこの順番で考える
最後に、「次に新しいアプリを作るときの思考の型」をまとめておきます。
これは、あなたがこの2週間で自然とやってきたことを、意識的な手順にしたものです。
まず、「1件分のデータは何か」を決める。
人なのか、タスクなのか、本なのか、支出なのか。
それに名前を付ける(Person / Task / Book / Entry など)。
次に、「その1件がどんな情報を持っているか」を列挙する。
名前・年齢・趣味、タイトル・締め切り・完了フラグ、など。
それをクラスの属性(インスタンス変数)にする。
次に、「その1件に対してどんな操作をしたいか」を考える。
自己紹介する、完了にする、未完了に戻す、表示用の文字列を返す、など。
それをインスタンスメソッドとして定義する。
次に、「複数件をどう扱いたいか」を考える。
一覧表示、絞り込み、並べ替え、集計(合計・平均)など。
それを配列+each / select / sort_by で書く。
最後に、「アプリ全体の流れ」を決める。
起動時に読み込むものは何か。
メニューにどんな項目を並べるか。
終了時に何を保存するか。
それを App クラスの initialize / run / save_〜 / load_〜 に落とし込む。
この流れを一度自分の言葉でノートに書き出しておくと、
次に何か作りたくなったとき、「どう始めればいいか」で迷わなくなります。
14日目のまとめと、これから先のあなたへ
この2週間で、あなたは Ruby の文法だけでなく、
クラスで「概念」を表現すること
配列に対して「絞り込み」「並べ替え」をすること
ファイルに保存して「記憶を持つアプリ」にすること
Appクラスで「アプリ全体の流れ」をデザインすること
を、実際に手を動かしながら体に入れてきました。
ここから先は、「何を作るか」がすべてです。
名簿でもタスクでも家計簿でも、ゲームのスコア管理でもいい。
あなたの生活の中で「これ、ちょっと自分用に作れたら便利だな」と思うものを一つ決めて、
今日まとめたパターンに沿って、設計から始めてみてください。
もうあなたは、「サンプルコードを眺めるだけの人」ではありません。
自分のための小さなアプリを、自分の手で組み立てられる人です。
あとは、何個目のアプリを作るかだけです。

