プログラミングと投資と時々オタク

自己啓発メイン。日常も。

【python】自動販売機のシステムを考える

どうも、けい( @kei_kei_se )です。
今回はプログラミング初心者向けに実例を交えて機能開発について書いてみたいと思います。
あまり優先度は高くなかったのですが、気が向いたので・・・
タイトルにもある通り、自動販売機のシステムを構築してみましょう。
勉強中の言語であるpythonでやりたいと思いますが、考え方はどれも同じなのであまり言語にとらわれる必要はないと思います。

■目次

1. はじめに

3. 実践⇐メイン(忙しい人はここだけでおk)

4. まとめ


では参りましょう。

1. はじめに

この記事を読んでもらいたい人
・何かプログラムで作ってみたい
・ソフトウェア(機能)開発がどんな感じが知りたい

また、私も勉強中の身であるため、間違いやもっと良い方法等ありましたらぜひコメントください。

2. 開発プロセス

『ソフトウェア開発 プロセス』でネット検索すると様々な記事がヒットしますが、今回はV字プロセスという手法で行っていきたいと思います。理由はまぁ私が実際の仕事でも使っている手法だからです。このお話しだけでも書こうと思えば余裕で1記事書けてしまうので、詳細はまたの機会にしてサラッといきたいと思います。私が記事にするのはいつになるかわかりませんので、気になる方は調べてみてください。笑

簡単に言うと
要件定義→基本設計→機能設計→詳細設計→実装→単体テスト結合テスト→総合テスト
といった流れで開発を進めていくことです。
言葉だけだとイマイチよくわからないと思うので次の章で実例を交えてやっていきます。
※今回はソフトウェア開発なのでハードの要件は無視します。

3. 実践

それではメイントピックです。
実際にプロセスに従って自動販売機のシステムを構築していきたいと思います。

・要件定義

まず始めに要件定義です。 そもそもなぜ自動販売機を作るのか、を考えるところです。

・人件費を削減すること

本来はもっと深堀りしますが、簡単に言えばこれでしょう。

・基本設計

次に基本設計です。
ここでは自動販売機に求める機能を定義していきます。
最初から難しく考えるとあとで詰まってしまうのでまずはシンプルに行きましょう。
実際に利用する手順に沿って書き出していくといいと思います。

自動販売機に求める機能
・お金を受け取る
・提供可能な飲み物を表示する
(・選択された飲み物を提供する ※ハード要件)
・お釣りを返す

まぁこんな感じですかね。

・機能設計

次に機能設計です。
基本設計で考えたことを機能に落とし込みます。
できればこの段階でプログラム作成を意識した形にしておくといいと思います。
具体的にはプログラムのコメントを作成するイメージです。

・お金を受け取る
→投入金額をカウントする
・提供可能な飲み物を表示する
→飲み物のリストを作る
・お釣りを返す
→投入金額から購入分を差し引く

ソフト単体で作るのでちょっと実際と違う部分もありますがこんな感じでいきましょう。

・詳細設計

ここでは機能設計で考えたことを文字通り詳細化します。
今回はシンプルで既に詳細化できているため割愛します。

・実装

では設計した内容を具体的に形にしていきましょう。
いきなり全部盛りだとエラーばっかで嫌になるのでプロトタイプを作ってちょいちょい足していくのがいいと思います。
ということでプロトタイプ↓

drink = 120 #飲み物の価格設定

x = input('お金を入れてください。\n') #投入金額入力

y = int(int(x) - drink) #お釣り計算

print('お釣りは %d 円です'。 % y)#お釣り出力

出力

お金を入れてください。
200
お釣りは 80 円です。


まぁこれだけでも自動販売機としてはいいのかなと思いますがさすがに寂しいので機能拡張していきましょう。

飲み物の種類を増やしてそれぞれ価格設定をします。
何が選択されたかを表示します。
またユーザー側が入力する機能を作る場合は、設定以外のものが入力されたときにエラー判定する機能もセットで用意しましょう。

ver2

drink = {'Water':100, 'Tea':120, 'Cola':150, 'Monster':200} #飲み物の価格設定

x = input('お金を入れてください。\n') #投入金額入力

if False == x.isdigit(): #金額が入力されなかったら
    print('金額を入力してください。')
    
else: #それ以外(金額が入力されたら)
    print('\n',drink) #飲み物の一覧を表示
    
    select = input('購入する商品を選んでください。\n') #飲み物選択
    
    try:
        z = drink[select] #選択した飲み物の価格格納
        
    except(KeyError): #リストにないものが入力されたら
        print('%s はありません。' %select)
    
    else: #それ以外(リストにあるものが選択されたら)
        y = int(int(x) - z) #お釣り計算
        
        if y > 0: #お釣りがプラスなら
            print('\n%s を選択しました。 お釣りは %d 円です。' % (select, y)) #お釣り出力
        
        else: #それ以外(お釣りがマイナス)
            print('金額が不足しています。')

出力(正常)

 {'Water': 100, 'Tea': 120, 'Cola': 150, 'Monster': 200}

購入する商品を選んでください。
Tea

Tea を選択しました。 お釣りは 80 円です。

いい感じにできましたね。
せっかくエラー対処も考えたのでそのパターンも実行させてみましょう。

出力(リスト以外のものを入力)

お金を入れてください。
200

 {'Water': 100, 'Tea': 120, 'Cola': 150, 'Monster': 200}

購入する商品を選んでください。
soda
soda はありません。

できてますね。
では最後に金額以外のものを入力してみましょう。

出力(金額以外のものを入力)

お金を入れてください。
money
金額を入力してください。

はい。こんな感じです。
システム構築で注意しなければならないのは以下2点ですかね。
①抜け漏れがないこと
②エラー時には最初に戻れるようにしておくこと(無限ループに入らないようにする)

今回は割愛しますがしっかりテストする場合はすべてのパターンを検証する必要があります。
(例で実行したTea以外でもやる、大きな金額を入力する、負の値を入れてみる等々)

もし少しでもおもしろいなと思っていただけたのであれば以下のことに挑戦してみてください。
とてもいい勉強になると思います。

・お釣りが100円以上ある場合にもう1度購入できるようにする
例:まだ購入しますか?
  はい→購入する商品を選んでください
  いいえ→お釣り

・お釣りを具体的にする
例:お釣り〇円で100円〇枚、50円〇枚、10円〇枚です)
  枚数が最小になるように(10円10枚×, 100円1枚〇)

その他にも当たり(スロット)の機能をつけたり、支払方法(現金、電子マネー)とかの機能をつけてみるのもおもしろいかもですね。
ぜひぜひトライしてみてください。

4. まとめ

いかがでしたでしょうか?
プログラムをただ作るだけだと目的を見失いがちですが、自動販売機という身近なもので考えてみるとイメージしやすかったのではないでしょうか。また今回は開発プロセスに従って進めたので、実務に近いような体験ができるような内容になっていたかなぁと思います。このプロセスはその他の様々な機能開発でも使える技ですので、ぜひ他のシステムを自分で構築してみてください。 また話は変わりますが個人的には機能開発で一番大切なのは「プログラムを組めるようになること」ではなく「どんな機能を実装すればよくなるか」を考えることだと思います。目的と手段が逆にならないように・・・というやつですね。プログラミングはあくまで手段なので目的意識をしっかり持って取り組んでいきましょう。機能を考える上で大事なのが使う側の立場になって考えることです。どういうシステムだと使う側は便利と感じるかを常に考える癖をつけておくとプログラミング能力は別として十分活躍できる優秀な人材になれると思います。冒頭にも書きましたが私の勉強している身ですので、お互い優秀な人材目指して頑張っていきましょう。不明点や質問等あればコメントでもTwitterでもなんでもいつでも聞いて下さい。
ではではまた次回~