進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

クラスとオブジェクトの作成

学習の目的

この単元を完了すると、次のことができるようになります。

  • クラスとオブジェクトの関係を説明する。
  • パラメータを定義する。
  • 戻り値の違いを説明する。

「Build Apex Coding Skills (Apex コーディングスキルの向上)」トレイルでいきなりこのモジュールに取り組むのはやや野心的です。まずは「Apex Basics for Admins (システム管理者のための Apex の基本)」モジュールを受講してください。すでに「Apex Basics for Admins (システム管理者のための Apex の基本)」バッチを獲得している場合は、このモジュールが適切な次のステップです。 

「Apex Basics for Admins (システム管理者のための Apex の基本)」で、Apex の構文、変数、コレクション、条件ステートメントについて学習しました。また、開発者コンソールでサンプルコードも実行しました。このモジュールでは、こうした概念の上に知識を構築していきます。では始めましょう。

オブジェクト指向とは?

ソフトウェア開発やコーディングについての文書を読んだことがあれば、オブジェクト指向という用語を目にしたことがあるでしょう。オブジェクト指向クラス、オブジェクト指向の概念、オブジェクト指向プログラミングなどです。オブジェクト指向とは何なのでしょうか? 

プログラミング言語においてオブジェクト指向とは、オブジェクトを中心にコードを記述することを意味します。人でも、取引先でも、花でも、固有の特性を持つものはすべてオブジェクトにすることができます。オブジェクト指向がどのようなものなのかきちんと把握するためには、まずクラスとオブジェクトの 2 つを理解する必要があります。 

クラス

クラスは設計図です。オブジェクトはクラスに基づきます。クラスは、そのクラスのすべてのオブジェクトに共通する一連の特性と動作を定義します。

花について考えてみましょう。花には色や草丈などの特性があり、育ったり萎れたりといった動作があります。Apex クラスでは、特性を変数、動作をメソッドといいます。

1 輪の花

特性 (変数)
動作 (メソッド)
Color (色)
Grow (成長)
Height (草丈)
Pollinate (受粉)
maxHeight (最大草丈)
Wilt (萎凋)
numberOfPetals (花弁数)

庭を思い浮かべてみてください。バラ、ユリ、ヒナギクは色や丈が異なりますが、すべて花で、それぞれ色や丈に特性があります。

落ち着いた色調の花はクラスを表し、その下の 3 つの小さな花はクラスのインスタンスを表します。

クラスの宣言 

次のコードはクラスを宣言 (作成) します。

public class Flower { //body of class }

宣言されるクラスは、アクセス修飾子、キーワードクラス、class 名、クラス本文の 4 つの部分で構成されます。本文 (中括弧 {} の内側) でクラスのメソッドと変数が定義されます。 

アクセス修飾子

アクセス修飾子はクラスまたはメソッドの宣言のキーワードです。他のどの Apex コードがこのクラスまたはメソッドを参照や使用できるかをアクセス修飾子が決定します。他にもアクセス修飾子はありますが、最も一般的なのは public です。public クラスは、組織内の他のすべての Apex クラスが使用できます。

メソッド

メソッドはクラス内で定義されます。メソッドは、そのクラスのオブジェクトに継承される動作を表します。クラスには 1 つ以上のメソッドを設定できます。Flower クラスには、growpollinatewilt の 3 つのメソッド (動作) があります。

メソッドは次のように宣言 (作成) します。

public static Integer wilt(Integer numberOfPetals){ //body of method }

パラメータ

メソッドの作成時に、コードの実行に必要なすべての値が判明しているとは限りません。多くの場合は、1 つのタスクを実行するメソッドを記述し、次に同様のタスクを実行する 2 つ目のメソッドを記述するというように書き足していきます。そして、後になってどのメソッドも同じようなものであることに気付きます。これらは、わずかな違いがあるものの重複しています。 

1 つのメソッドに異なる内容を入力できる手段があればよいのですが...。ちょっと待ってください。パラメータを使用できます! パラメータは、値を受け取るまでの間のプレースホルダとして機能する変数です。パラメータは変数と同じように宣言され、データ型の後にパラメータ名を続けます。次の宣言では、wilt メソッドに numberOfPetals というパラメータが設定されています(パラメータ名は自由に指定できますが、パラメータが保持する値を説明する名前にすることをお勧めします)。numberOfPetals パラメータは、整数型の値を受け取ることを求めます。

<p>public static void wilt (Integer numberOfPetals){</p><p> //body of method</p><p>}</p>

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、文字列、Account などの特定のデータ型です。あるいは、次のように void (なし) にすることもできます。

public static void wilt(Integer numberOfPetals){
    system.debug(numberOfPetals);
}

メソッドの戻り値のデータ型が void の場合は、このメソッドが値を返しません。値を返すには、void を別の戻り値のデータ型に変更する必要があります。 

たとえば、次の場合、wilt メソッドは、整数の戻り (応答) 値を求めています。

public static Integer wilt (Integer numberOfPetals){ //body of method}

public static Integer wilt(Integer numberOfPetals){
    if(numberOfPetals >= 1){
        numberOfPetals--;
    }
    return numberOfPetals;
}

1 行目の Integer というキーワード (public static の直後) は、メソッドが整数値を返すことを示しています。5 行目で return キーワードの後に numberOfPetals という変数名を続けて、結果の numberOfPetals 値を返します。メソッドが変数値を返すときは、変数のデータ型が、メソッドが宣言した戻り値のデータ型と一致していなければなりません。この場合は、wilt メソッドに整数値を返すことが求められ、numberOfPetals 変数が整数になっています。 

では、wiltgrowpollinate メソッドをテストしてみましょう。まず、メソッドのコーディングを完成させます。

メソッドを記述する

  1. 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
  2. クラス名に「Flower」と入力します。
  3. [OK] をクリックします。
  4. Flower.apxc クラスで、既存のコードを次のコードに置き換えます。
  5. public class Flower {
        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...');
        }
    }
  6. [File (ファイル)] | [Save (保存)] をクリックします。

これでクラスがすべて定義されたため、テストを実施できます。ここで必要なものは、クラス名 (Flower)、テストするメソッド (wiltgrow)、各メソッドに必要な引数です。grow メソッド が pollinate メソッドを コール (使用) するため、pollinate メソッドは直接コールする必要がありません。wilt メソッドは (numberOfPetals パラメータに) 整数値を求め、整数値が返されます。grow メソッドと pollinate メソッドは何も返しません。 

メソッドを実行する

  1. [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
  2. [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
  3. Flower.wilt(4);
    Flower.grow(5, 7);
  4. [Open Log (ログを開く)] を選択し、[Execute (実行)] をクリックします。実行ログが開き、コードの実行結果が表示されます。
  5. [Debug Only (デバッグのみ)] を選択します。

grow メソッドには、heightmaxHeight の 2 つのパラメータがあります。 

Flower.grow(5, 7); は、引数 5 (草丈が 5 インチ) と 7 (最大草丈が 7 インチ) を grow メソッドに渡します。grow メソッドは 2 を height 変数 (9 行目) に渡し、height 変数の値を確認します。height 変数の値が maxHeight 変数の値以上になると、grow メソッドが pollinate メソッドをコールします。

pollinate メソッドは、戻り値のデータ型が void のため、何も返しません。

どうなるのでしょうか?

デバッグログにエントリが 1 つ示されます。

Event: USER_DEBUG.Details: [18]|DEBUG|Pollinating…

grow パラメータに 2 と 6 を使用した場合はどうなるでしょうか? 試してみましょう。 

どうなりましたか?

デバッグログを見ると、どうにもなっていないようです。何が起こったのかというと、height を 2、maxHeight を 6 に設定した場合は、if ステートメントの条件が false になるため、pollinate メソッドが実行されません。 

オブジェクト

前述のとおり、Flower クラスは花を作成するための設計図です。このクラスには、colorheightmaxHeightnumberOfPetals の変数があります。これらの変数は 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();
tulip.grow();

Flower rose = new Flower();
rose.grow();

Flower peony = new Flower();
peony.grow();

tulip オブジェクトは Flower クラスのインスタンスです。花の 3 つのオブジェクトはどれも、Flower クラスに基づく特定の花です。Flower クラスに基づいて、tulip という名前のインスタンスを作成するには、次の構文を使用します。

Flower tulip = new Flower();

ドット表記を使用すれば、オブジェクトのメソッドをコールできます。オブジェクト名の後に .method(); を追加するだけです。次に例を示します。

tulip.grow();

これで、オブジェクトがクラスのインスタンスであることがわかりました。クラス内で、変数がオブジェクトを説明し、メソッドがオブジェクトの実行可能なアクションを定義します。また、パラメータを操作して変数で渡された値を受け取り、何かを送信する (あるいは、データ型によっては何も送信しない) データ型をメソッドに返します。

リソース