2017/01/12

[プログラミング言語Go] 第6章 メソッド

スポンサーリンク

丸善出版の『プログラミング言語Go』の読書履歴です。

出てきた内容の気になったポイントのまとめや練習問題の解答(自分なりの)を記載していきます。
(ここに記載されている内容で問題が生じても責任は負えませんのであしからず…。)

練習問題は結構長くなるものが増えてきたので、本文記載のコードの修正の場合は修正部分だけ抜粋しています。
すべてのコードが見たい場合はGitHubにあるので、そちらを見てみてください。
プログラミング言語Go GitHub

とはいえ、練習問題に時間がかかりすぎて、なかなか先に進めない感じもあるので、飛ばしてしまっています。
すみません(;´Д`)
気が向いたら練習問題もやっていこうと思うので、その際は追記します。

さて、第6章はメソッドについてです。

もくじ

6.1 メソッド宣言
6.2 ポインタレシーバを持つメソッド
6.3 構造体埋め込みによる型の合成
6.4 メソッド値とメソッド式
6.5 例:ビットベクタ型
6.6 カプセル化

これまでの章のまとめはこちら

第1章 チュートリアル
第2章 プログラミング構造
第3章 基本データ型
第4章 コンポジット型
第5章 関数

6.1 メソッド宣言

メソッドと関数ってどう違うんだろう?と冒頭の説明を読んでもよくわからなかったり…(汗)
データ型に関連付けられた関数をメソッド、というらしいので、データ型に関数を定義する、というイメージでしょうか。

通常の関数とメソッドを宣言の仕方の違いは以下のようになります。

メソッドの宣言には追加のパラメータ p が書かれているのがわかります。この地下のパラメータのことをメソッドのレシーバと呼びます。

それぞれの呼び出し方は以下のようになります。

このようにメソッドは型に紐付いた形の関数になります。

6.2 ポインタレシーバを持つメソッド

関数の引数値はコピーが渡されます。関数が変数を更新したい場合などはポインタを使って変数のアドレスを渡す必要があります。
メソッドも同様のことが言えて、レシーバ変数を更新する必要がある場合は、ポインタを使うことができます。

6.3 構造体埋め込みによる型の合成

前節で紹介した Point 構造体を持つ ColoredPoint 構造体を定義します。

こうすることによって、ColoredPoint は Point のメソッドを使うことができるようになります。

p.Distance(q.Point) としたときに、まずColoredPoint構造体に Distanceメソッドがないか調べます。
なければ、Point構造体のメソッドを調べる、と言った流れになります。

ここまで来て、メソッドって他の言語のクラスっぽいなぁ、と思いました。
構造体の埋め込みって継承っぽいですよね。

GOはクラス自体はないけれど、構造体とメソッド、それからこのあとに出てくるインターフェースでオブジェクト指向を実装しているようです。

6.4 メソッド値とメソッド式

今まで見てきたメソッドは p.Distance() と言った書き方をしていましたが、p.Distance とするとメソッド値を生成することができます。
メソッド値とは特定のレシーバ値にメソッドを結びつけている関数で、変数に代入することができます。

メソッド値と関係しているものでメソッド式というものもあります。
メソッドを呼び出すときには通常はレシーバーを使いますが(p.Distance(q) のような呼び出し方)、メソッド式の場合はデータ型.メソッドというように書き、レシーバの代わりに普通の第一引数を持つ関数値を生成します。

6.5 例:ビットベクタ型

ビットベクタの操作方法などをメソッドを使って説明しています。
ここはサンプルソースを見てもらえばいいと思うので説明は省きます。

6.6 カプセル化

オブジェクトの変数やメソッドはクライアントからアクセス出来ないようになっていればカプセル化されているといいます。
カプセル化は情報隠蔽とも呼ばれます。

Goでは名前の可視化を制御する仕組みはひとつしかありません。
大文字で始まる識別子は、それが定義されたパッケージ外へ公開され、大文字で始まっていない識別子は公開されません。
他の言語によくある、public や private といったキーワードはGOにはないということですね。

同じ仕組みで構造体のフィールドやメソッドへのアクセスを制限するので、オブジェクトをカプセル化するためには、オブジェクトを構造体にする必要があります。

カプセル化の単位はパッケージであり、他の言語によくある型ではない、というのが特徴的だなと思います。
構造体のフィールドは同じパッケージ内であればアクセス可能になります。

この節ではカプセル化の利点などの説明もされています。

といったところで、メソッドの章は完了です!
ここまでやってようやくGo言語でのオブジェクト指向プログラミングの手法がわかってきましたね。

次章はインタフェースです。がんばろう。

スポンサーリンク