Order クラスを設計せよ
師範 / 目安 35分
師範がカウンターに腰を下ろし、あなたの書いたコードを長いこと眺めてから言いました。「商品名の配列と、単価の配列と、個数の配列。3本の配列を、番号を頼りに並走させておるな」。
図星です。3番目の注文を知るには、3つの配列の3番目をそれぞれ見る必要があります。「1本だけ並べ替えたらどうなる。1本だけ1件消したらどうなる。そろそろ限界だろう」
師範は湯呑みを置いて続けました。「注文という『もの』を、1つの型にせよ。商品名と単価と個数を、離れないように束ねるのだ」
ここからが師範の段です。これまで作ってきたのは手続きでした。ここで作るのは型です。
カプセル化
束ねるだけなら、フィールドを3つ並べれば済みます。ただしそれを外から自由に書き換えられると、個数が -5 の注文や、単価が 0 の注文が、いつのまにか混ざります。
そこでフィールドは private にして外から触れなくし、値を取り出す口だけ getName のような getter として開けます。データを守り、必要な操作だけを外に見せる。この考え方をカプセル化と呼びます。
完成条件
Order クラスを作り、Main から使ってください。
Order クラスの中身は次のとおりです。
- フィールドは
name(商品名・String)、price(単価・int)、quantity(個数・int)の3つ。すべてprivateにします - コンストラクタ
Order(String name, int price, int quantity)で3つを受け取ります - getter は
getName()、getPrice()、getQuantity()の3つ。それぞれフィールドの値を返します getSubtotal()は単価 × 個数の小計をintで返します
そのうえで、Main に public static String orderLine(String name, int price, int quantity) を定義してください。受け取った3つで Order を1つ作り、getter と getSubtotal() を使って 珈琲 x3 = 1350円 の形の文字列を返します。
フィールドを直接読んで文字列を組み立てず、必ず getter を通してください。Main から private フィールドが見えないことを、自分の手で確かめるのが今回の課題です。
クラスは1つのファイルにまとめます。public class Main の外側に class Order を並べて書いてください。Order のほうに public を付けないのがこつです。
進め方
白紙から書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使う構文、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
開かずに10分粘って進まないなら、①だけ開けてください。粘る時間そのものには価値がありません。価値があるのは、自分で書いた行が動いた瞬間です。
コンストラクタの引数名をフィールド名と同じにすると、そのままでは引数のほうが優先されて代入が空回りします。this.name = name; の this. が、そこを区別するための印です。
要件
- Order クラスを定義し、name・price・quantity の3つのフィールドをすべて private にすること
- コンストラクタ Order(String name, int price, int quantity) で3つの値を受け取ること
- getName()・getPrice()・getQuantity() の3つの getter を用意すること
- getSubtotal() は単価×個数の小計を int で返すこと
- Main の orderLine(String name, int price, int quantity) は Order を1つ作ること
- 文字列は getter と getSubtotal を通して組み立て、フィールドを直接読まないこと
- 返す文字列の形は「珈琲 x3 = 1350円」であること
- Order クラスは public を付けず、Main と同じファイルに並べて書くこと
入出力例
orderLine("珈琲", 450, 3) → "珈琲 x3 = 1350円"
orderLine("抹茶ラテ", 520, 1) → "抹茶ラテ x1 = 520円"
orderLine("シフォンケーキ", 680, 2) → "シフォンケーキ x2 = 1360円"
orderLine("本日のブレンド", 400, 12) → "本日のブレンド x12 = 4800円"
orderLine("珈琲", 450, 0) → "珈琲 x0 = 0円"ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです