ギタリストやベーシストがオブジェクト指向を完全に理解するための記事
はじめに
皆さん初めまして、そーとくと申します。
今回がQiita初投稿になります。普段はTwitterに生息していてPythonなどを良しなに書いております。
さて、今回の記事ですが、タイトル通りギタリストやベーシスト向けのオブジェクト指向解説記事となっております。
どちらかの経験しかない方はここで「は?」と思われるかもしれませんが、実はギターやベースの演奏とオブジェクト指向にはあるとても分かりやすい共通点があるので、今回はそれを解説していけたらなと思います。
また、この記事ではオブジェクト指向を完全に理解することはできません、タイトル詐欺、誠に反省しております。
初学者向けにわかりやすく解説することが目的であり、また自分自身完全に理解したとは言えない立場のため、間違いだらけの記事になっているかもしれませんが、その場合優しく指摘いただけると幸いです。
この記事の対象者
- ギタリスト
- ベーシスト
- オブジェクト指向が全く分からない人
この記事が対象としていない人
- 楽器が全くわからない人
- オブジェクト指向を完全に理解した人
オブジェクト指向って?
wikioediaによると
オブジェクト指向(オブジェクトしこう、英: object-orientation)は、ソフトウェア工学構想の一つであり、ソフトウェア設計とプログラム記述の際に用いられる考え方あるいは概念(コンセプト)である。
とのことです。
ここにある通り、オブジェクト指向とは大まかに言ってしまえばプログラミングをする上での考え方のようなものです。
後述しますが、設計やチーム開発をする上でこの考え方は非常に役に立つことが多いです。
また、オブジェクト指向型言語と呼ばれるもの、特にJavaは非常にオブジェクト指向が強い言語であり、ある程度の理解がないと実装がうまくいかないことが多いです。
(良く忘れられがちですが、Pythonもオブジェクト指向言語です、私は主にPythonを書いているので、本記事でコードを用いて解説するときはPythonを使います。)
具体的にはどんな概念かというと大雑把にある目的を実現する実態を目的を実現するための複数のオブジェクトに分けて実装するといった考え方だと私は理解しています。
例えば、電卓アプリを実装するときに、入力を受け取るオブジェクト、入力から計算結果を出すオブジェクト(これも目的の計算内容によってさらにわかれたりする。)、出力を返すオブジェクト、という風に分解して個別に実装して、最後にまとめるといったイメージです。
楽器との共通点
ここまで読んできて、ギタリスト・ベーシストの皆さんはなんとなくあれに似てるなあと思ったりしたんじゃないでしょうか?そう、あれですよあれ。
エフェクターです。
エフェクターやアンプ、ギター、あるいはギタリストであるあなた自身は、それぞれ音の加工や入力、出力といった独立した役割を持ったオブジェクトと考えることができます。
では、さらにわかりやすいように実際にあなたのエフェクターボードをオブジェクト指向的に書いてみましょう。(以下のコードは実際には動作しません、わかりやすく記述するためのデモです。)
あなたのギターはムスタング、エフェクターはブルースドライバーとメタルゾーンとかつないでるとしましょう。アンプはジャズコとします。
あなたはこれらのオブジェクトを用いて最終的に「入力した音に対していい感じの出力を返す」ような機能を実装したいとしましょう。オブジェクト指向ではこのように書きます。
# ギターのクラス
class Musutang:
@staticmethod
def pickup('''なんか引いた音'''):
#音を増幅して出力する処理
return cleansound #クリーントーン
# エフェクターの基本のクラス
class Effector:
#エフェクターの基本構造を書きます
@staticmethod
def Efect('''入ってくる音'''):
#エフェクターの基本処理
# エフェクターのクラスを引き継ぐクラス
class BluesDriver(Effector):
#オーバーライドします
@staticmethod
def Effect('''入ってくる音'''):
#音をカッコよくする処理
return bluessound
class MetalZone(Effector):
#オーバーライドします
@staticmethod
def Effect('''入ってくる音'''):
#音を変態にする処理
return metalsound
# アンプのクラス
class amp:
@staticmethod
def JazzChorus('''入ってくる音'''):
#音を増幅して出力する処理
return mixedsound #最後にアンプから出てくる音
# 実際にクラスを組み合わせて動かすメソッド
def main():
sound = input()
clean = Musutang.pickup(sound)
blues = BlusesDriver.Effect(clean)
metal = MetalZone.Effect(blues)
mixed = amp.JazzChorus(metal)
return mixed
# おまじない
if __name__ == '__main__':
main()
コーディング規約もへったくれもないクッソ適当なコードですが、雰囲気は大体これでつかんでいただけると思います。
実際に実装するときは別の機能は別のファイルに書いて、importなどを使って呼び出したりします。
何がうれしいのか
オブジェクト指向を使うと、例えば実装するときに機能別に専門家を割り振ることができます。
ギターの例でいえば、演奏するあなたは多くの場合、エフェクターやアンプの内部構造を知っていることは少ないと思います。
しかしあなたには、ギターを弾く(命令を出して)という機能があります。また、反対にエフェクターの作成者は必ずしもギタリストである必要はなく、回路のプロフェッショナルであることが求められます。
このように、お互い専門領域以外のことをよく知らなくても自分が作ることのできる機能だけを全員が作れば、最終的に良い音を出せるエフェクターボードやシステムが完成するというのがオブジェクト指向の利点であると考えられます。
他にも、コード全体の見通しがよくなったり、機能の追加や拡張がしやすいといった様々なメリットがあります。
これを機に、ギタリストのあなたもオブジェクト指向プログラミング、始めてみてはいかがでしょうか?