スコープ

そもそもスコープとは?

スコープはプログラムのオブジェクトの参照可能な範囲です。
定義する変数やオブジェクトには使用できる範囲が決まっています。そうすることで、極力想定外のことが発生しないようにしておきます。
これは実際に様々な機能を持たせたソフトやアプリを開発していると身をもって大切さを知ります。
では、スコープは参照可能な範囲と言いましたが、スコープを広くした場合と狭くした場合のメリット。デメリットを挙げていきます。

スコープの範囲が広い場合のメリット・デメリット

広い場合 狭い場合
エラー発生時
  • 全く関係ない場所で定義したオブジェクトが原因の可能性がある
  • エラー箇所のチェックする範囲が広いため、特定に時間がかかりやすい
  • エラー箇所のチェックする範囲が狭いため、エラー特定に時間が少なくて済む可能性が高い
  • 特定の範囲内で使用されるため、想定外のところで初期化されないまま再利用されるリスクが小さくなる
オブジェクトの扱いの利便性
  • クラス間やメソッド間での値の受け渡しが直感的にできる
  • 定数定義など、アプリ全体で使用するようなものを、一回定義するだけで済む
  • 参照渡しなどの概念や、デリゲートなどの概念も理解する必要がある

以上のように、それぞれメリット・デメリットがありますが、基本的にはスコープは狭い方が良いですし、一般的です。
やはり、エラーの特定のしやすさなどを考えると狭い方が都合が良いからです。
ですが、保存できるファイルの最大数など、アプリ全体で使用するものは最大までスコープを広くしておくのが適切です。
用語を使うなら、グローバル変数にした方が良いです。グローバル変数とは、メソッドの外で定義されている変数のことです。
逆に、とある画面の文言など、使用する範囲が一部分のものに関しては狭くする方が良いです。

スコープの設定の仕方

基本的に、オブジェクトのスコープは「{」から「}」までです。
メソッド内で定義したものならメソッド内のみ、if文やfor文の中で定義したものはそのif文やfor文でのみ使用可能な変数になります。

import java.math.BigDecimal;
import java.math.RoundingMode;

public class ScopeExample {
	// ScopeExampleクラス内全体で使える変数
	int attackValue = 100;
	
	int damageCalc (int damage, double rate) {
		// damageCalcメソッド内のみで使える変数
		double revisdDamage = damage * rate;
		
		BigDecimal bd = new BigDecimal(String.valueOf(revisdDamage));
		BigDecimal bd1 = bd.setScale(0, RoundingMode.UP);
		int decidedDamage = bd1.intValue();
		
		boolean critical = true;
		if (critical) {
			// if文内のみ使える変数
			int enemyDeffence = 400;
			decidedDamage += enemyDeffence;
		}
		return decidedDamage;
	}
	
	void gigaSlashAttack() {
		this.damageCalc(this.attackValue, 2.3);
	}
}