目次
はじめに
プログラミングスクールでボウリングのスコア計算プログラムをオブジェクト指向で書いたときのメモ書きです。休会明けで色々と忘れており、Rubyのインスタンスやメソッドについて色々と調べたのでまとめました🎳
課題のポイントは👇になるかと思います。
- ストライクは 'X' で表示される。それ以外は数字。
- 各フレームは1投 or 2投。最終フレームは3投目があるかも。
- ボーナス得点の算出はフレームをまたぐ。
# 入力: 投球結果 出力: 合計点。 $ ruby bowling.rb '0,1,2,3,4,5,0,1,2,3,4,5,0,1,2,3,X,X,1,0' 68
オブジェクト指向プログラミングについて
考え方について
komagataのブログでは以下のように説明されています。
全てをクラス変数とクラスメソッドで処理するというのは手続き型プログラミングの世界です。
オブジェクト指向プログラミングでは、極力「インスタンス変数を使ってそのインスタンス自身に処理させる」というのが基本です
どれが良い悪いというのはないですが、オブジェクト指向プログラミングは極力、実体(インスタンス)が個別に持つ情報を利用してインスタンスメソッドを呼び出して処理する。そういう書き方が基本です。
また、メンターの方からは以下のようなコメントをいただきました。
オブジェクト指向プログラミングは擬人法プログラミングだと思ってください。
オブジェクトは人間です。自分のことは自分が一番よくわかっていて、一人で全部できる大人です。
クラスメソッドとインスタンスメソッドについて
【プログラミング初心者向け】クラスメソッドとインスタンスメソッドはどう使い分けるべき?で色々と説明されていますが、まずはインスタンスメソッドで実装することを目指せばよさそうです。
オブジェクト指向的に適切なクラス設計がされていれば、クラスメソッドが登場する回数はインスタンスメソッドに比べてずっと少ないはずです。
文法は、以下の公式リファレンスやブログが参考になりました。
インスタンス変数について
改訂版・(あなたの周りでも見かけるかもしれない)インスタンス変数の間違った使い方によると以下のようになりそうです。
インスタンスごとに保持する必然性がある(別々の値になる)データをセットする
- 大きいスコープがほしいという理由でインスタンス変数を使わない
変数のスコープ(変数の寿命)が不必要に大きくなると、クラスが大きくなるにつれて保守性がどんどん低下
- 大きいスコープの変数がほしいならグローバル変数を使うべき(原則NGだけど)
- 処理の過程で使う一時的なデータは、引数、戻り値、ローカル変数で受け渡す
「じゃあインスタンス変数はいつ使えばいいの?」
インスタンス変数はオブジェクト指向プログラミングの文脈で、クラスを定義するときに使います。
たとえば、Person(人間)クラスに名前と血液型を保持させたいときは、名前と血液型をインスタンス変数に保存します。
基本的な考え方として、インスタンス変数はインスタンスが作成されてから(newされてから)最後までほとんど変わらない値だと思ってください。
🤔🤔🤔
メソッドについて
- Rubyではメソッド名と同じ名前のローカル変数を宣言しないようにしようによると、メソッド名は「動詞のみ」または「動詞 + 目的語」がオススメとのことです
参考にさせていただいた資料
- 説明に添えてあるサンプルコードがとてもわかりやすい書籍です。
- 第7章がとても参考になりました。スコープ、書き方、実装例 etc
- 複数のクラスを定義してレシートの集計を実装していきます。ライブコーディング動画。
感想
最後までお読んでいただきありがとうございました。