第19回「たかが文法されど文法]

更新日:

こんにちは、森川です。

今回は、小難しいオブジェクト指向についての続きを書こうと思います。
前回までは、


の流れで説明してきた。
前回の内容をおさらいすると、OO(オーオー)を使いこなすために、まずGofのデザインパターンの習得を目指そうというお話をしました。

今回は、Gofを身につけるために「たかが文法されど文法」というお題で書いてみたい。

はじめに

以前も書いたけど、オブジェクト指向のプログラミング言語の文法を100%マスターしたからと言って、オブジェクト指向を使えるわけではない。
でも、逆にオブジェクト指向を使いこなせる人は、オブジェクト指向の文法はきちんと理解できている。

Gofを理解するためにも、オブジェクト指向のプログラミング言語の文法はきちんと理解しておきたいところである。

文法と言っても幅広いのだけど、特に重要なのはプログラミングの原理原則に関係するところだと思う。
~~のメソッドがどうとか継承はこう書くとか動作に関するところは後付けでもなんとかなると思うし、if文など基本ステートメントなどはこの記事を読んでいただいている人には問題ないと思う。

プログラミングの原理原則って???

例えば、

  • 1. staticは「唯一の」と言われますが、なぜ「唯一」なのですか??その原理を説明してください。
  • 2. ミュータブル、イミュータブルとは何ですか??
  • 3. ボクシング、オートボクシングとは何ですか??
  • 4. ラッパークラスとは何ですか??
  • 5. 参照渡し、値渡しとは何ですか??


1のstatic。これが説明できないとシングルトンパターンは理解できないと思う。
他にもいろいろあるけれど、ここであげている例がちんぷんかんぷんと言うのであれば一度オブジェクト指向言語の文法について再考することをお薦めする。
(例題の回答は時間の関係で割愛。Google先生に聞けばいくらでも出てくると思う。)

Try~catchとException

オブジェクト指向の言語になって新しく出てくるところっていくつかあるけれど、Try~catchとExceptionも重要なところなので書いておく。

構造化プログラミングが主体となる言語では、処理の成功の可否は、処理する関数を動かしてその戻り値で判断すると思う。
処理が複数あれば、それぞれフラグを作って成功の可否をフラグに蓄えておいて、それを後で条件分岐で判別することになる。

このフラグを使った考え方は私もプログラミングを始めた頃にすげーなと感動した記憶がある。
こんなやつ↓

		int fl=this.getFl();
if(fl==0){
	処理 A
}else if(fl==1){
	処理 B
}else if(fl==2){
	処理 C
}else if(fl==3){
	処理 D
}
		

でも、オブジェクト指向ではこの考え方は「親の敵」のように扱われる(笑)。
フラグ、それを使った条件分岐をなるべく減らしてプログラムをいかにシンプルにスマートに作っていくかが重要と考えられている。
これらはプログラムを複雑にしてしまうシステムの天敵のようなもの。
システムを運用していくと、機能変更や機能追加によりどんどんフラグ増えて分岐が複雑になっていくことが推測されるからである。


これら天敵を減らすための方法としてはいろいろある。
例えば、GofのデザインパターンにもStateパターンというのがあるし、連想配列でマッピングしてやるのもそうだろうし、DIコンテナのように外部からコントロールできるようにするのも一つの方法。

当然すべてのフラグ、条件分岐をなくすことは不可能で、そういう場合は条件分岐の部分だけを切り分けて局所化してカプセル化していき、変更・拡張に強くするのが常套句だと思う。
ファクトリー系のパターンやストラテジーパターンなんかはまさにこれをやっているよね。

上記のようなフラグ、条件分岐への対応方法はいろいろあるけれど、Try~catchを使うことよりフラグを減らすことができる。

具体例

例えば、以下コードは以前うちで作った簡単なアンケート登録システムのデータベースへの登録するプログラムコードの抜粋です。
言語はPHPです。
これは自社で開発しているGTECフレームワークを使っており、そのコントローラー部分になります。

		class Con_complete{
	
	$dbHelper = DBHelper::getInstance();
        $dbHelper->startTransaction();
	try{
		//1.バリデーション
		//★★ひっかかるとValidationExceptionをスロー★★
		FactoryValidate::create('trantbl_presents201802')->checkIsNull($data);

			
		//2.データの重複チェック
		$d=Mod_presents201802::select(null,array('present_filename'=>$data['present_filename']),null);
		if(count($d)>0){
			//★★ひっかかるとDuplicationExceptionをスロー★★
			throw new DuplicationException();
		}
			
		//3.DBへ登録
		//★★ひっかかるとPDOExceptionをスロー★★
		Mod_presents201802::save($data);
		$dbHelper->commit();
                
			
		//メールを送信する場合
		$factory = new MailTextFactory('thankyou');
		$factory->create();
		<<省略>>
		$mailHelper = MailHelper::getInstance('TEXT',$tos,$title,$contents);		
		$mailHelper->sendMail();
			
	}catch(DuplicationException $e){
		
		$dbHelper->rollback();
		
	}catch(ValidationException $e){
		
		$dbHelper->rollback();
		Functions::redirectTo('upload.php',array('error'=>$e->getMessage()));

	}catch(PDOException $e){
	
		$dbHelper->rollback();
		Functions::redirectTo('upload.php',array('error'=>$e->getMessage()));
			
	}
}
		


コードは何も難しくなく、入力チェック(バリデーション)をして重複登録チェックをして合格したものはDBへ登録。登録完了したものはメール配信というよくある流れだと思う。

これを見てもらえばわかるけど、フラグとか使ってないですよ。
このようにTry~catchとExceptionを自由に使いこなせればプログラムの書き方が全然変わります。
すごくシンプルになる。

これを構造化プログラミングで書くと、バリデーション用のフラグ、重複チェック用のフラグ、DB登録可否のフラグとか、そのフラグをみてDB登録やメール送信とかなると思う。

Try~catchとExceptionってコアのApiのエラーをCatchするだけではないです。
自分でExceptionクラスを定義して、それをTry~catchで受ける。
こういう使い方ができればプログラミングの幅が広かる。
よく言う独自例外ってやつです。


Try~catchとExceptionまわりは何気に奥深いよ。

どうやって学習するか

私の場合は、これらのことはJavaで勉強した。
かれこれ10年ぐらい前ですが始めて勉強しようと思ったときは、「こりゃー奥深いわ、独学でぺらぺらっとやるだけじゃ無理」と感じた。
そこでJava資格習得を目標として網羅的に学習することにした。

受験した当初はSJCPと呼ばれていましたが、今はSun MicrosystemsがOracleに買収されてOJCPに変わっています。Javaの資格としては有名なやつ。
OJCPってむちゃ難しいわけでもないけど、そんなに簡単でもないです。
おそらくJavaプログラマとして働いている人でも対策していないと普通に落ちると思う。

私は特に資格がほしかったわけではなく、オブジェクト指向の文法についてきちんと勉強しておきたいと思って取得しています。
OJCPとれるぐらいやっとけば、オブジェクト指向言語の文法的なことはおおよそ困らないと思うのでお勧め。

まとめ

今回はオブジェクト指向プログラミング言語の文法について触れてみた。
構造化プログラミングからオブジェクト指向プログラミングの言語に切り替えるとき文法だけみても新しいことは結構たくさん出てくる。
ここでふれたのは私が重要だと思った部分だけなので、他にもいろいろあるよ。

「たかが文法されど文法」

プログラミング言語ってこう書いたらこう動くだけでなくて、なぜそう動くのか考えらえるように理論的に作られている。
それを理解しておくことは、プログラマーとしてとても大切なことで、何かしらないけどバグがでるうまく動かないとか、何かしらないけどこう変えたら治ったというのは、なくなると思う。
ボリューム的には結構たくさんあるので時間をかけてじっくりと学習することをお薦めします。

今日は以上。何かの参考になれば。ではでは。

システムコンサルティングの詳細はこちらから

本日の独り言

こうやってブログ書いていると森川さんブログ見ました、お元気そうで何よりですとか、メールもらったりします。
何気に見てくれているんだと思いながらうれしく思います。

コンテンツSEOとか言われる時代になってブログを代行で書いてくれるところがある。
私は、自分の考え自分の想いを自分の言葉で表現することってとても大切で、それがGoogleが推奨する唯一無二のコンテンツに繋がるのだと思う。
そしてこの一つ一つの積み重ねがジテックの財産になると思って書いています。

時間がかかるところは割愛しているのでそんな時間かけているわけではないですが、
忙しいときとかは更新頻度下がるけれど、ぼちぼち続けていこうかなと思う、今日この頃。

Step by Step by Step by…