クラスとオブジェクトの作成
学習の目的
この単元を完了すると、次のことができるようになります。
- クラスとオブジェクトの関係を説明する。
- パラメーターを定義する。
- 戻り値の違いを説明する。
「Build Apex Coding Skills (Apex コーディングスキルの向上)」トレイルでいきなりこのモジュールに取り組むには少し無理があります。まずは「Apex Basics for Admins (システム管理者のための Apex の基本)」モジュールを受講してください。すでに「Apex Basics for Admins (システム管理者のための Apex の基本)」バッチを獲得している場合は、このモジュールが適切な次のステップです。
「Apex Basics for Admins (システム管理者のための Apex の基本)」で、Apex の構文、変数、コレクション、条件ステートメントについて学習しました。また、開発者コンソールでサンプルコードも実行しました。このモジュールでは、こうした概念の上に知識を構築していきます。では始めましょう。
オブジェクト指向とは?
ソフトウェア開発やコーディングについて何か読んだことがある方なら、オブジェクト指向クラスやオブジェクト指向の概念、オブジェクト指向プログラミングなど、オブジェクト指向という用語を目にされたと思います。オブジェクト指向とは何なのでしょうか?
プログラミング言語においてオブジェクト指向とは、オブジェクトを中心にコードを記述することを意味します。人でも、取引先でも、花でも、固有の特性を持つものはすべてオブジェクトにすることができます。オブジェクト指向がどのようなものなのかきちんと把握するためには、まずクラスとオブジェクトの 2 つを理解する必要があります。
一緒にトレイルを進みましょう
エキスパートの説明を見ながらこのステップを実行したい場合は、次の動画をご覧ください。これは Trailhead Live の「Trail Together」(一緒にトレイル) シリーズの一部です。完全なセッションへのリンクは、「リソース」セクションを参照してください。
クラス
クラスは設計図です。オブジェクトはクラスに基づきます。クラスは、そのクラスのすべてのオブジェクトに共通する一連の特性と動作を定義します。
花について考えてみましょう。花には色や草丈などの特性があり、育ったり萎れたりといった動作があります。Apex クラスでは、特性を変数、動作をメソッドといいます。
特性 (変数) |
動作 (メソッド) |
Color (色) |
Grow (成長) |
Height (草丈) |
Pollinate (受粉) |
maxHeight (最大草丈) |
Wilt (萎凋) |
numberOfPetals (花弁数) |
|
庭を思い浮かべてみてください。バラ、ユリ、ヒナギクは色や丈が異なりますが、すべて花で、それぞれ色や丈に特性があります。
クラスの宣言
次のコードはクラスを宣言 (作成) します。
宣言されるクラスは、アクセス修飾子、キーワードクラス、class 名、クラス本文の 4 つの部分で構成されます。本文 (中括弧 {}
の内側) でクラスのメソッドと変数が定義されます。
アクセス修飾子
アクセス修飾子はクラスまたはメソッドの宣言のキーワードです。他のどの Apex コードがこのクラスまたはメソッドを参照や使用できるかをアクセス修飾子が決定します。他にもアクセス修飾子はありますが、最も一般的なのは public
です。public クラスは、組織内の他のすべての Apex クラスが使用できます。
メソッド
メソッドはクラス内で定義されます。メソッドは、そのクラスのオブジェクトに継承される動作を表します。クラスには 1 つ以上のメソッドを設定できます。Flower クラスには、grow
、pollinate
、wilt
の 3 つのメソッド (動作) があります。
メソッドは次のように宣言 (作成) します。
パラメーター
メソッドの作成時に、コードの実行に必要なすべての値が判明しているとは限りません。多くの場合は、1 つのタスクを実行するメソッドを記述し、次に同様のタスクを実行する 2 つ目のメソッドを記述するというように書き足していきます。そして、後になってどのメソッドも同じようなものであることに気付きます。これらは、わずかな違いがあるものの重複しています。
1 つのメソッドに異なる内容を入力できる手段があればよいのですが...。ちょっと待ってください。パラメーターを使用できます! パラメーターは、値を受け取るまでの間のプレースホルダーとして機能する変数です。パラメーターは変数と同じように宣言され、データ型の後にパラメーター名を続けます。次の宣言では、wilt
メソッドに numberOfPetals
というパラメーターが設定されています(パラメーター名は自由に指定できますが、パラメーターが保持する値を説明する名前にすることをお勧めします)。numberOfPetals
パラメーターは、整数型の値を受け取ることを求めます。
wilt
メソッドはどのようにコール (使用) するのでしょうか? 次のサンプルコードでは、1 行目でメソッドをコール (使用) し、4
という値を渡します (送信)。渡す値を引数といいます。引数 (この場合は 4
) は、メソッド名の後に括弧で囲んで示されます。
wilt(4); public static void wilt(Integer numberOfPetals){ system.debug(numberOfPetals); }
パラメーターが設定されたメソッドに値が渡されると、この引数値がパラメーターの値になります。パラメーターは変数として機能するため、他の変数と同じように操作できます。
Flower クラスを見てみましょう。
public class Flower { public static void wilt(Integer numberOfPetals){ if(numberOfPetals >= 1){ numberOfPetals--; } } }
Flower
クラスの 2 ~ 6 行目で、wilt
メソッドが numberOfPetals
の値を確認します。その数が 1
以上の場合は、wilt
メソッドが numberOfPetals
を減分 (1 つ減少) します。
戻り値のデータ型
たとえば、レストランで旬の料理があるかどうかを知りたいとします。ウェイターに「夏野菜のサラダはありますか?」と尋ねます。この場合、特定の形式の答えを予想します。つまり、数字や文章ではなく、「はい」か「いいえ」のいずれかで返答されるものと考えます。
メソッド宣言では、戻り値にどのデータ型を求めるかを明示的に指定する必要があります。引数がパラメーターで指定されたデータ型と一致していなければならないのと同様に、返される変数もメソッド宣言で指定された戻り値のデータ型と一致していなければなりません。戻り値のデータ型は、Boolean、String、Account などの特定のデータ型です。あるいは、次のように void (なし) にすることもできます。
public static void wilt(Integer numberOfPetals){ system.debug(numberOfPetals); }
メソッドの戻り値のデータ型が void
の場合は、このメソッドが値を返しません。値を返すには、void
を別の戻り値のデータ型に変更する必要があります。
たとえば、次の場合、wilt
メソッドは、整数の戻り
(応答) 値を求めています。
public static Integer wilt(Integer numberOfPetals){ if(numberOfPetals >= 1){ numberOfPetals--; } return numberOfPetals; }
1 行目の Integer
という戻り値のデータ型 (public static
の直後) は、メソッドが整数値を返すことを示しています。6 行目で return
ステートメントの後に numberOfPetals
という変数名を続けて、結果の numberOfPetals
値を返します。メソッドが変数値を返すときは、変数のデータ型が、メソッドが宣言した戻り値のデータ型と一致していなければなりません。この場合は、wilt
メソッドに整数値を返すことが求められ、numberOfPetals
変数が整数になっています。
では、wilt
、grow
、pollinate
メソッドをテストしてみましょう。まず、メソッドのコーディングを完成させます。
メソッドを記述する
- 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
- クラス名に
「Flower」
と入力します。 - [OK] をクリックします。
- Flower.apxc クラスで、既存のコードを次のコードに置き換えます。
public class Flower { // class variables: public String color; public Integer height; public Integer maxHeight; public Integer numberOfPetals; public static Integer wilt(Integer numberOfPetals){ if(numberOfPetals >= 1){ numberOfPetals--; } return numberOfPetals; } public static void grow(Integer height, Integer maxHeight){ height = height + 2; if(height >= maxHeight){ pollinate(); } } public static void pollinate(){ System.debug('Pollinating...'); } }
- [File (ファイル)] | [Save (保存)] をクリックします。
これでクラスがすべて定義されたため、テストを実施できます。ここで必要なものは、クラス名 (Flower
)、テストするメソッド (wilt
と grow
)、各メソッドに必要な引数です。grow メソッド が pollinate メソッドを コール (使用) するため、pollinate メソッドは直接コールする必要がありません。wilt
メソッドは (numberOfPetals
パラメーターに) 整数値を求め、整数値が返されます。grow
メソッドと pollinate
メソッドは何も返しません。
メソッドを実行する
- [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
- [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
Flower.wilt(4); Flower.grow(5, 7);
- [Open Log (ログを開く)] を選択し、[Execute (実行)] をクリックします。実行ログが開き、コードの実行結果が表示されます。
- [Debug Only (デバッグのみ)] を選択します。
grow
メソッドには、height
と maxHeight
の 2 つのパラメーターがあります。
Flower.grow(5, 7);
は、引数 5
(草丈が 5 インチ) と 7
(最大草丈が 7 インチ) を grow
メソッドに渡します。grow
メソッドは 2 を height
変数 (9 行目) に渡し、height
変数の値を確認します。height 変数の値が maxHeight 変数の値以上になると、grow メソッドが pollinate メソッドをコールします。
pollinate メソッドは、戻り値のデータ型が void のため、何も返しません。
どうなるのでしょうか?
デバッグログにエントリが 1 つ示されます。
grow パラメーターに 2 と 6 を使用した場合はどうなるでしょうか? 試してみましょう。
どうなりましたか?
デバッグログを見ると、何も変わっていないようです。何が起こったのかというと、height を 2、maxHeight を 6 に設定した場合は、if ステートメントの条件が false になるため、pollinate
メソッドが実行されません。
オブジェクト
前述のとおり、Flower
クラスは花を作成するための設計図です。このクラスには、color
、height
、maxHeight
、numberOfPetals
の変数があります。これらの変数は null (値なし) と同じですが、デフォルト値を設定できます。
オブジェクトは、クラスのインスタンスです。子が親から目の色や身長などの遺伝的特性を継承するのと同様に、オブジェクトもクラスから変数やメソッドを継承します。
color = null;
height = null;
maxHeight = null;
numberOfPetals = null;
|
Flower クラス
|
grow()
pollinate()
wilt()
|
|
|
|
color = 'yellow'; |
color ='red'; |
color = 'pink'; |
height = 3; |
height = 6; |
height = 9; |
maxHeight = 6; |
maxHeight = 8; |
maxHeight = 9; |
numberOfPetals = 4; |
numberOfPetals = 6; |
numberOfPetals = 10; |
Flower tulip = new Flower(); |
Flower rose = new Flower(); |
Flower peony = new Flower(); |
tulip
オブジェクトは Flower
クラスのインスタンスです。花の 3 つのオブジェクトはどれも、Flower
クラスに基づく特定の花です。Flower
クラスに基づいて、tulip
という名前のインスタンスを作成するには、次の構文を使用します。
Flower tulip = new Flower();
ドット表記を使用すれば、オブジェクトのメソッドをコールできます。オブジェクト名の後に .method();
を追加するだけです。次に例を示します。
tulip.grow();
これで、オブジェクトがクラスのインスタンスであることがわかりました。クラス内で、変数がオブジェクトを説明し、メソッドがオブジェクトの実行可能なアクションを定義します。また、パラメーターを操作して変数で渡された値を受け取り、何かを送信する (あるいは、データ型によっては何も送信しない) データ型をメソッドに返します。
リソース
-
Trailhead Live: Trail Together - Object-Oriented Programming for Admins (システム管理者のためのオブジェクト指向プログラミング)
- Apex 開発者ガイド: Apex の List のメソッド
- Apex 開発者ガイド: Apex の Boolean のメソッド
- 外部リンク: Understand Object-Oriented Programming (オブジェクト指向プログラミングについて)
- Apex 開発者ガイド: Apex クラスの定義
- Apex 開発者ガイド: クラス変数
- Apex 開発者ガイド: クラスメソッド
- Apex 開発者ガイド: Static and Instance Methods, Variables, and Initialization Code (静的およびインスタンスメソッド、変数、初期化コード)