OOP(オブジェクト指向)の基礎概念

By | March 10, 2022

前書き

自分用。適当です。

概要

■OOPの三つの特徴

要素説明
カプセル化(クラスの利用)・変数とメソッドをまとめる
・クラス内に限定される変数とメソッドを隠す
・単一クラスからの複数インスタンスの生成
・同一変数および同一処理の再利用(static)
ポリモーフィズム・呼び出し元メソッドの一元化
(=異なる処理を同一のメソッドから呼び出せるので、後から別の呼び出し先を足しても呼び出し元の変更が不要)
継承・スーパークラスの変数とメソッドをサブクラスで利用できる
→Template Methodパターン以外では使わない
→99.99%のケースにおいては、staticメソッドor委譲(別クラスのインスタンス化)を利用した方が望ましい。

■用語整理:三つの変数

変数特徴メモリに存在する期間
ローカル変数当該メソッド内でのみ有効(※狭すぎ)メソッドを抜けるまで
グローバル変数全クラスで有効(※無駄すぎ)アプリケーションが終了するまで
インスタンス変数当該クラス内で有効(※ちょうどよい)インスタンスが不要になるまで

■隠蔽の例=getterとsetter

クラス

class Account{
  private String name;
  public void setName(String input){
    this.name = input;
  }
  public String getName(){
    return this.name;
  }
}

インスタンスの生成

Account acc1 = new Account();
acc1.setName("TestAccount1");
Account acc2 = new Account();
acc2.setName("TestAccount2");

System.out.printLn(acc1.getName());
System.out.printLn(acc2.getName());

■Visualforceにおけるgetterとsetter

get:Apex→VFの値のパス(=表示値を送信)

set:VF→Apexの値のパス(=入力値の受け取り)

VF↓

<apex:page controller="VfTest">
  <apex:form>
    <apex:outputlabel value="Enter String here"/>
       <apex:inputtext value="{!input}"/>          
  </apex:form>    
</apex:page>

Apex Controller↓(※これだけでOK)

public class VfTest
{
    public String input{get; set;}
}

Apex Controller↓(※表示の初期値の設定&setに関して丁寧な書き方をした場合)

public class VfTest
{  
    public String userinput;
    public String getinput(){return 'Neko';}
   
    public void setInput(String input)
    {
        this.input = input;
    }   
}

■ポリモーフィズムの例

スーパークラス:ここでwrite()メソッドを定義

public virtual class TextWriter {
    public virtual void write() {
        System.debug('Write some text.');
    }
}

サブクラスA:write()メソッドをA仕様に上書き

public class WriterA extends TextWriter {
  @Override
    public override void write() {
        System.debug('Write some text using the A class');
    } 
}

サブクラスB: write()メソッドをB仕様に上書き

public class WriterB extends TextWriter {
  @Override
    public override void write() {
        System.debug('Write some text using the B class');
    } 
}

メソッド:write()メソッドの呼び出し

TextWriter[] textWriterList = {new WriterA(), new WriterB()};
for(TextWriter tw: textWriterList){
    tw.write();
}

メモリ領域について

格納されるもの確保の単位確保タイミング
静的領域グローバル変数・コード(クラスなど)システム単位常時
ヒープ領域インスタンス・SOQL取得結果同期処理:6MB
非同期処理:12MB
Apex実行時
スタック領域メソッドの引数・ローカル変数・戻り先スレッド単位LIFO