Googleクラウドサービスを利用して時間指定メール送信システムを作る（その２）

***
＜[前へ](http://qiita.com/matsuhandy/items/ba080eaf6e168e225915)＞　＜[次へ](http://qiita.com/matsuhandy/items/66fd2789e5a7c9d753fc)＞
　c言語理解者向けに，こう考えれば書ける的なメモになっています。そのため，オブジェクト指向について正確な表現・正しい解釈になっていない場合があります。
***

#1. C言語理解者向けGASとC言語との違い
　C言語は理解しているけど，他の言語は･･･，という方を対象として，まとめてみます。間違いや不正確な部分もありますが，理解しやすさを優先しています。このページは説明が下手なことも手伝って退屈ですが，そんなもんか，位のつもりで読んでいただければと思います。メモ書きに近い感じで表現したので，体言止めやである調になってますが，ご容赦。

* 型など，人間側で厳密に書かなくても自動判定できるところは勝手にやってくれる印象。
* 変数のスコープ（変数が有効な範囲）はCと同じと考えてほぼ間違いない。
* リマーク分は，//，や，/**/が使える。
* 変数はどんな値でも代入できる（実行時に動的に型を変えてくれる）。型指定せずvarとして宣言する。
* プリミティブ（原始的）な型は，newを使ってインスタンス（オブジェクト）を生成する必要はない。具体的なプリミティブな型は整数・実数・文字・文字列など。インスタンス・オブジェクトは後述。
* 代入するもので型が決まったり型が自動変換されるなどする。

```java:変数の宣言例
var num = 0;
var str = "abc";
for(var i=0; i<10; i++){
  ･･･
}
```

* 配列の初期化は大括弧[]でくくる。
* for文は通常の使い方の他，配列の要素数を気にしない拡張for文が使える。

```java:拡張for文
  var strings = ["Good Morning\n", "Good Afternoon\n", "Good Evening\n"];
  for(var index in strings){
    strings[index]を表示するなどのプログラム
  }
```

* 次のようなnewを使った配列の作り方もある。
 
```java:配列
  var strings = new array("Good Morning\n", "Good Afternoon\n", "Good Evening\n");
  for(var i in strings){
    strings[i]を表示するなどのプログラム
  }
```

* 文字列・文字を表現するのに，ダブルクォーテーション，シングルクォーテーションのどちらで囲っても良い。一文字の時シングル，文字列の場合ダブル，というように決めておくと良い。
* 配列の場合は，stringsの様に変数名に「s」を付けるというルールが一般的。
* 変数名・関数名は小文字で始めて単語の切り替わりは大文字にするルールが一般的。例えば，googleAppsScriptという感じに大文字を入れる。
* GAS（JAVA, C#, C++等の言語）では，インスタンスやオブジェクトを作成して変数に代入できる。プリミティブな場合は，単に，変数，とか，プリミティブな変数，と言われる。
* クラス名の表記は一般的に最初の文字が大文字。例えば，Documentとか，DocumentForDebugなど。
* GASプログラミングで出てくる，クラス，インスタンス，オブジェクト，メンバ変数，メソッド，thisの意味は次の通り。

```text:クラス等の言葉の意味
クラス　　　･･･設計図，例えばテレビの設計図。（なお，GASはクラスの概念はあるが仕様としてクラスを持っている
　　　　　　　訳ではなく，クラスのように見せている。）

インスタンス･･･実体。設計図に従って生産された実際のテレビ。何台でも生産できる。生産（生成）には演算子newを使う。

　　例：var tv = new Television;//Terevisionという設計図から新しくテレビを作成。tvがインスタンス。
　　　　もちろんTelevisionという設計図はプログラム中のどこかに書いておく（定義しておく）。

オブジェクト･･･物体。インスタンスと同じと考えて良い。
　　　　　　　テレビは物体であり，Televisionという設計図の実体。
　　　　　　　つまり，Televisionクラス（型）のインスタンス（実体）tvは，オブジェクト（物体）の一つである。
　　　　　　　Televisionクラスのオブジェクト，Tevevitionクラスのインスタンス，と表現してもおかしくない。
　　　　　　　インスタンスもオブジェクトもニュアンスの違いしかないので，同じと考えて良い。

メンバ変数･･･構造体のメンバ変数と同じ。
　　　　　　　Televitionクラスのインスタンスとしてtv1，tv2があったとして，映っている番組が違う場合，
　　　　　　　各インスタンス内のchannelというメンバ変数の値が異なると考えて良い。

メソッド　･･･構造体の中の関数。C言語では構造体の中に関数は書けないが，クラスではメソッドと呼ばれる
　　　　　　　メンバ関数が記述できる。例えば，channnelというメンバ変数の値によって，
　　　　　　　画面に映像を映すメソッドdisplay()。

this　　　･･･クラス（設計図）の中で，やがて生成されるであろうインスタンスを指す。
　　　　　　this.channelと書けば，「そのインスタンスtvのchannel」という意味。次の章を参照。
```

参考：http://marupeke296.com/IKDADV_JAVAS_Class.html

* プリミティブ（原始的）でない型，つまりクラスについては，自分で定義する場合もあるが，たくさん準備されているのでそれを利用する機会が大半。オブジェクトの生成は，new演算子を使う。次の例ではすでにシステム側で用意されているDateクラスのオブジェクトnowを作っている。Dateクラスは筆者が定義を書いた（つまり，プログラミングで記述した）わけではない。

```java:オブジェクト（インスタンス）の生成
var now = new Date();  //現在時間を取得，シリアル値で得られる
var str = now.toString(); //シリアル値を文字列に変換（例：'Sat Oct 29 2016 16:05:42 GMT+0900 (JST)'）
var strings = str.split(' '); //半角スペースで切り分けて配列に入れる, splitはメンバ関数（メソッド）
ここでstrings[4]を表示するプログラムを書くと，時間が表示される。
```

* すでにファイルとして存在するスプレッドシートやドキュメント等はすでに存在するオブジェクトなので，それを扱うのにnewはしない。それらを新規作成する場合もnewでなく，専用の関数（メソッド）がある。
* ファイルは固有のIDで管理される。従って同じファイル名も存在できる。ややこしいので注意する。
* ファイルIDはファイルをブラウザ上で開いて，URLで確認する。
* フォルダIDも同様に，そのフォルダを開いて，URLで確認する。
* 関数はすべて，次のように定義。returnは必要に応じて書く。返すものがなければ書かなくてよい。型は自動判定されるので関数に型指定は不要。可変引数（ここでは取り扱わない）も可能。

```java:関数の定義の方法
function funcName(argument1, argument2, ･･･){
  ･･･
  return ･･･;
}
```
* Cの構造体をGASではクラスと呼ぶ。クラスにはメンバ変数の他，メンバ関数がある。それらはインスタンスに「.」でつなげて指定する。例えば次の`toString()` や`split(' ')`がメンバ関数である。

```java:インスタンスのメンバ関数の呼び出し方
var now = new Date();  //現在時間を取得，シリアル値で得られる
var str = now.toString(); //シリアル値を文字列に変換（例：'Sat Oct 29 2016 16:05:42 GMT+0900 (JST)'）
var strings = str.split(' '); //半角スペースで切り分けて配列に入れる
ここでstrings[4]を表示するプログラムを書くと，時間が表示される。
```
* 上の例では，newでオブジェクトを作っているが，newしなくても使えるスタティックなクラスも存在する。（そのうち，あぁこれか，と気づくと思う）
* メンバ関数は，メソッドと呼ばれる。どんなメソッドがあるのかは，マニュアルやネット情報によるしかない。
* 文字列などプリミティブ（原始的）な型も実はメソッドを持っているように見える場合がある。例えば次の例のsplit。（内部で，メソッドを持つオブジェクトに自動変換されることで実現している）

```java:プリミティブな型のメンバ関数
  var str = "Good Morning";
  var words = str.split(' ');//半角スペースで分離。splitはメンバ関数。
  ここにwords[1]を表示するプログラムを書くと，Morning が表示される。
```

* 文字列の連結は，単に「+」でつないでいけばよい。strcatの様な関数は使わない。連結するデータが入った変数が数値でもうまく勝手に変換してくれる。itoaの様な関数は使わない。
* この本を読めばいい，という王道はない。ひたすらネット検索でメソッド等の情報を集めたり，誰かが書いたサンプルプログラムを研究するしかない。
*  GASのマニュアル：https://developers.google.com/apps-script/

***
　このあたりは，私自身まだまだ勉強不足です。c言語だけ理解している人には，こう説明すればよりわかりやすいよ，というご意見いただけるとうれしいです。
＜[前へ](http://qiita.com/matsuhandy/items/ba080eaf6e168e225915)＞　＜[次へ](http://qiita.com/matsuhandy/items/66fd2789e5a7c9d753fc)＞
***