Java コード設計 プログラミング

オブジェクト指向初心者がまずやること

プログラミング初心者なら誰もがぶつかる壁がオブジェクト指向です。pythonやフロントエンドプログラミングをやったことがある人でもオブジェクト指向の複雑さに混乱します。

今回は、プログラミング初心者かつオブジェクト指向に触れるのも初めての方に向けて、まず何をするべきなのかを書いていきます。

記事の目的

オブジェクト指向とプログラミングの初心者にまずやることを提示する

IT企業で新人研修を受けていたときに、オブジェクト指向で苦しむ人を多く見てきました。自分は2年半ほどはオブジェクト指向に触れていたので抵抗がありませんでしたが多くの人が理解に時間がかかる様子でした。オブジェクト指向は複雑で奥が深く、実際、本にすると結構分厚い本になってしまいます。したがって、始めから全部知ろうとすることは不可能です。いかに、飽きず、折れずに前に進むかが肝心なのです。

記事の信頼性

  • オブジェクト指向プログラミング歴4年
  • オブジェクト指向プログラミングを教えていく中での発見も記事に取り入れています

オブジェクト指向の何に苦しむのか

オブジェクト指向を学び始めたときにつまずくとこは2つあると考えています。

抽象クラス、抽象メソッドの作成が難しい

そもそも、抽象クラスとは、よく使う機能をひとまとまりにして、各クラスから利用できるようにしたものです。車のメーカーによってデザインや製造工程が違うものの、車の部品や走る仕組みでは共通の部分があります。ざっくりと、それを抽象クラスと言います。ここで、共通の部分ってどこなのか、そもそもつくる必要があるほど大量に利用されるかを明確にすることが非常に難しいです。

例えば、お店には名前と電話番号があります。これはどんな店にも存在する共通した情報です。この情報を取り扱うクラスを抽象クラスとしてShopクラスとしましょう。

それに対して、本屋やレストランといった小売店には取り扱う本のリストや料理一覧などの固有の要素があります。これらを具象クラスとして、Book、Restaurantクラスとしましょう。

本屋とレストランの型が一種であればこれでインスタンス(Restaurant A = new Restaurant();)を作成すれば良いです。

ここでレストランの店舗の型(従来のRestaurantクラスでは扱わなかった属性やメソッドを扱うクラス)をさらに登録する必要が出てきたとします。そうするとRestaurant2, Restaurant3, Restanrant4 ...と新たにクラスを作成し属性やメソッドを設定する必要があります。

これは非常に工数が多くなるため、Restaurantクラスという抽象クラスを作る必要性が出てきます。この抽象クラスを作成するタイミングが非常に難しいです。本来、コピーをたくさん作る必要があるなと感じたら抽象クラスを作る必要がありますが、ここの見極めはセンスが必要です。

また、どの部分を抽象メソッドにするのかという部分もなかなか難しいところです。そこを抽象化してしまうとカスタマイズ性がなくなってしまう。あるいは、抽象化してないと具象化作業の工程が多くて抽象化のメリットが活かせてない。このように抽象化メソッドにするかしないかで考えこんでしまう状況がよくあります。

したがって、抽象クラス、抽象メソッドの作成が難しく、コード設計の部分でつまずくことがあります。

作成するクラスが多くなりキャパオーバーになる

理由は単純で、クラスが多くなればすべての機能をを把握しきれないからです。クラスをインスタンス化するとき、メソッドを呼ぶとき、そのコードの意味を頭の中でイメージします。

しかし、使うクラスが多くなり、機能が多様化するとイメージができなくなってきます。そのたびにクラスがどんな処理をしていたか確かめなければいけません。

そして、どんどんブレイクダウンしていくと、情報が多すぎてキャパオーバーになります。

個人的にはブレイクダウンしすぎるのはおすすめしません。「こんなもんなんだ」で留めておき、実行して動作を確認したほうが理解が進むと思います。

まず何をすべきなのか

プログラミングとオブジェクト指向を学び始める上でまずやるべきことは「統合開発環境をインストールしてコンソールに文字を出力する」です。

オブジェクト指向の概念についてまとめたサイトはたくさんあるものの、実用的なものは少ないです。ここで言う実用的とはコードが書ける状態のことを言います。オブジェクト指向を使ってコードを書けるようにするには、コードを書き実行することを何度も繰り返しPDCAを回すことが必要です。

英語に例えると簡単にわかります。英語を普段使わない人が、急に英語を喋れるようにはなれません。

つまり、オブジェクト指向を学んだことがない人にとって、概念を知るための時間(いろんなサイトを見て概念を調べる時間)は最小限に抑えて、コードを書く時間に当てるべきです。

その上で、統合開発環境をおすすめします。それはコンパイラやプロジェクトの設定など、デフォルトでプログラミングに必要な機能が搭載されているからです。

ブラックボックス化されているのが嫌に感じる人もいるかもしれません。しかし、敢えて複雑なエディタを使い、環境設定だったりプログラミングの裏側で行われていることを理解しようとすることは挫折するリスクです。

どの開発環境を使うべきか

私の経験からするとeclipse、visual studioなどの統合開発環境は良かったと思います。

統合開発環境はインストールすれば、コードを簡単にコンパイル、実行してくれます。コンパイルとは書いたコードを機械語に翻訳する作業のことで、実行とは機械語をシステムが実行して何らかの出力をすることです(例えば"Hello world"とか)。

とりあえず、インストールしたらプロジェクト(クラスやプログラミングに必要な機能などが格納されている成果物全体)を作成して、javaクラスやらC#クラスやらを作成してHello Worldをコンソール(統合開発環境の下の方に出てくる)に出力してみましょう。

Unityはオブジェクト指向の勉強に適しているのか

おそらくゲーム開発から始めたい人もいると思うのでUnityに触れておきます。

結論としては学べるが遠回りです。なぜ学べるかというと、Unityで使われる言語はC#でオブジェクト指向言語が主要言語になっているからです。よって、Unityでゲームなどを作る際オブジェクト指向を使わざるを得ません。

しかし、遠回りになります。理由としては2つあります。

1つ目は、Unityの便利機能がオブジェクト指向をブラックボックス化しているところです。Unityはクラスのインスタンス化(Car A = new Car();の処理のこと、あるいはクラスの変数に実体を入れる処理)をGUIでできる機能があります。

これは非常に便利な機能で開発の際、役立つ機能です。しかし、その処理がコード上のどこで行われているかを確認することはできません。これは、オブジェクト指向を理解する上での弊害になります。

別の開発環境を使う際こういった機能は基本的にはないです。よって、別の環境では手動でインスタンス化を行う必要があるため、オブジェクト生成や使用履歴がコード上で確認できます。初心者は手動で行い、コードの進行を確認しながら理解を進めるべきだと思います。

2つ目は、ゲームエンジン特有のライフサイクルです。ライフサイクルとはUnity側が決めた処理の流れです。例えば、Unityでは最初にStart()という関数が呼ばれます。この関数の中にゲームの初期化の処理を書きます。次にUpdate()という関数が1/60秒ごとに呼ばれます。

よって、この関数の中に毎フレーム行う処理を書きます。初心者にとってこのライフサイクルの概念は理解するのに苦しみます。なぜなら、ゲームという成果物は高度なプログラミングの結晶体だからです。

ゲームは一見馴染み深いと思われますが、毎フレームの処理や、映像の描画処理など、プログラミングの前提知識がある中で更に必要とされるUnity独自のフレームワークの知識があります。理解するためには膨大な知識をインプットする必要があるため、かなり精神が削られます。

これら2つの理由から、Unityでオブジェクト指向は学べるが遠回りだと考えています。

まとめ

オブジェクト指向を学ぶ上での問題と、まず何をすべきかを書いてきました。開発環境の話も長々としてしまいました。

オブジェクト指向は奥が深く、簡単に身につけることは難しいと思います。上記でも書いたとおり、まずはできることからやってみるのが一番だと思います。

-Java, コード設計, プログラミング

Copyright© SugLog , 2021 All Rights Reserved Powered by AFFINGER5.