JavaRush /Java Blog /Random-JA /Javaのメソッド

Javaのメソッド

Random-JA グループに公開済み
多くの人が聞いたことがある興味深い原則が 1 つあります。それは「分割統治」と呼ばれています。この原則は、政治など人間生活の多くの分野で使用されています。それは、国家内の多数の異質な部分が分裂し、これらの部分間の敵対を煽り、利用することを意味します。言い換えれば、権力に脅威をもたらす可能性のある人々の間に紛争を引き起こすということです。しかし、私たちはプログラマーなので、この原則の技術的な解釈にしか興味がありません。そしてそれは次のようになります。「「分割して征服」の原則は、大きな問題を基本的な問題になるまで小さな問題に分割することです。次に、それらを順番に解決し、すべてを 1 つのシステム全体に結合する必要があります。このプログラムは、与えられた問題を解決するはずです。」 つまり、大きな問題を、あなたが解決できる問題ではない小さな問題に分割するだけです。そして、その解決策を 1 つの大きな解決策にまとめます。このシンプルで便利な原則に従うために、Java プログラミングではメソッドを使用します。 Java のメソッド - 1たとえば、ロボットボクサーを作成しています。私たちにとって、彼がうまく動き、正確な攻撃を実行し、弱点を探して敵を観察することが重要です。これすべてを 1 つのmainメソッドに記述するのは面倒ですよね。すべてを 1 つのメソッドで記述すると、次のようになります。
метод main() {
// Описание действий шага вперед
подача напряжения в отдельные модули;
поднятие ноги;
перевод в другую точку;
поставить ногу;
перенести вес на другую ногу;
если (противникАтакует()) {
        	// Описание действий уклонения робота.
        	...
} еслиНет {
        	// Описание действий обманного атакующего удара.
        	...
}
// Описание действий шага назад
...
}
プログラム内の他の場所でステップフォワードまたはキックを使用する必要がある場合はどうすればよいでしょうか? すべてのアクションをもう一度説明しますか? 合わない。繰り返しのセリフが多すぎて、迷ってしまいがちです。アクションの詳細の記述を、ロボットのステップを実行する別のモジュールに配置する必要があります。そしてメソッドを 1 行で呼び出すことができます。このようなもの:
метод шагВперед() {
// Описание действий шага вперед
  	подача напряжения в отдельные модули;
  	поднятие ноги;
  	перевод в другую точку;
  	поставить ногу;
  	перенести вес на другую ногу;
}

метод уклонение() {
  	// Действия для уклонения
  	...
}

метод обманныйАтакующийУдар() {
  	// Действия для удара
  	...
}

метод шагНазад() {
  	// Действия для шага назад
  	...
}

метод противникАтакует() {
	// Робот проверяет атакует ли противник
}

метод main() {
	шагВперед();
	если (противникАтакует()) {
        	уклонение();
	} еслиНет {
  	  обманныйАтакующийУдар();
	}
	шагНазад();
}
これで、ロボットの機能と、コンパクトで明確なmain()メソッドが分離されました。残りのメソッドも任意の機能に分割できます。たとえば、欺瞞的な攻撃ストライクは、欺瞞の移動脚の移動攻撃のメソッドに分割できます。そして、最終的に一連の基本的なタスクを取得するために、さらに単純なタスクが割り当てられます。さて、Java が受け入れる形式ですべてを美しく書きましょう。
public static void stepForward() {
  	    // Многострочный code, описывающий
  	    // действия робота для выполнения шага
  	    System.out.println("The robot takes a step forward");
}

public static void evasion() {
  	    // Действия для уклонения
  	    System.out.println("Robot shy of impact");
}

public static void deceptiveAttackBlow() {
  	    // Действия для удара
  	    System.out.println("The robot performs a deceptive strike");
}

public static void stepBack() {
  	    // Действия для шага назад
  	    System.out.println("The robot takes a step backwards");
}

public static void main(String[] args) {
    	stepForward();
    	if (isEnemyAttacked()) {
        		evasion();
    	} else {
  	    	deceptiveAttackBlow();
    	}
    	stepBack();
}

public static boolean isEnemyAttacked() {
    	// Метод проверяет, атакует ли враг. returns логическое meaning.
    	return true;
}
このコード、特にvoidreturnなど のいくつかの単語が少しわかりにくいかもしれないことは理解しています。急いでトマトを投げないでください。今からすべて説明します。「分割統治」パラダイムの一般的な考え方は理解できるはずです。これにはメソッドが役に立ちます。メソッド宣言の一般的な構造は次のとおりです。
модификатор_доступа возвращаемое_meaning Name_метода(принимаемые_параметры) {
   	//Тело метода
}

アクセス修飾子

アクセス修飾子は、publicprivatepackageといういくつかのキーワードです。これらの単語は、メソッドの範囲を示します。簡単に説明しますと、この言葉を使うと、あなたはおいしいご馳走を他の人と共有しているように見えます。おいしいのはあなたの方法です。privateの場合、メソッドを他のクラスと共有しません。packageの場合、パッケージ内のクラスとのみ共有します (クラスは特定のパッケージに収集されます。これについては後で学びます)。まあ、公共はあなたが優しさそのものであり、番組全体でおいしいおやつ(方法)を共有していることを示しています。このようなもの。いくつかのレベルを終えると、これらの単語の役割がよりよく理解できるようになります。

戻り値

上の例を見てください。ブール値を返すisEnemy Attackedを除いて、すべてのメソッドはvoidキーワードでマークされています。メソッドがvoid とマークされている場合、何も返さない可能性があります。このメソッドは一連のアクションを実行するだけです。ここでmainメソッドに注目してください。voidを返すメソッドは、メソッドの本体内でそのように呼び出されます。ただし、isEnemy Attackedメソッドはifステートメントのかっこ内で呼び出されます。ブール値を返すという事実により、中間変数を使用せずに直接挿入する機会が得られます。値を返すには、returnキーワードを使用します。メソッドがint型を返す場合、任意の式からメソッドを呼び出すことができます。
public static int getNumber() {
 	    return 5;
}

public static void main(String[] args) {
    	int result = 5 + 6 + getNumber();
    	System.out.println(result);
}
結論:
16
getNumber メソッドはint値を返すため、式から呼び出すことができます。また、このメソッドは、自分で作成したものを含む任意の型を返すことができます。メソッドの戻り値の型を指定した場合は、何かを返す必要があります。次のように書くことはできません。
public static int findMaxNumber(int a, int b) {
 	if(a>b) {
 	    return a;
 	}
}
コンパイラーは、最初の条件が満たされた場合は何かを返すが、2 番目の条件が満たされた場合は何も返さないと叱ります。

パラメータの受け渡し

メソッドの操作中に使用されるパラメータをメソッドに渡すことができます。最も原始的な例は 2 つの数値の合計です。でも私たちは原始的ではないですよね?非常に典型的な別の例を見てみましょう。メソッドChef() (クック)があるとします。パラメーター ブロックでスープの材料をこのメソッドに渡すことができ、その結果、このメソッドはスープを返します。このような:
public static void main(String[] args) {
    	String[] ingredients;
    	// Инициализация массива ингредиентов
    	Soup soup = chef(ingredients);

}

public static Soup chef(String[] ingredients) {
    	Soup soup = new Soup();
    	// Процесс варки супа
    	return soup;
}
(事前に作成されたSoupクラス があるとします。) main メソッドでは、材料の配列を作成し、それを「シェフに渡します」(シェフメソッドに渡します)。「料理人がスープを作り」、それをSoupクラスのオブジェクトとして返します。すべてがとてもシンプルです。パラメータ、プリミティブ型、オブジェクト、配列などをメソッドに渡すことができます。

パラメータを参照および値で渡す

Java プログラミング言語では、パラメータはその値によってメソッドに渡されます。ただし、このメカニズムはプリミティブ型とオブジェクトでは異なります。プリミティブ型をメソッドに渡して変更しても、メイン メソッドでは変更されません。値のコピーを渡すだけで、元の変数は保持されます。最も単純な例:
public static void main(String[] args) {
    	int x = 1;
    	System.out.println(x);
    	getNumber(x);
    	System.out.println(x);

	}

	public static void getNumber(int i) {
    	i = i + 100;
	}
結論:
十一
ただし、オブジェクトの場合、変更は元のオブジェクトに影響します。
public class Program
{
	public static void main(String[] args) {
    	WiseMan wiseMan = new WiseMan();
    	wiseMan.setIq(300);
    	System.out.println(wiseMan);
    	changeObject(wiseMan);
    	System.out.println(wiseMan);

	}

	public static void changeObject(WiseMan m) {
    	m.setIq(100);
	}
}

public class WiseMan {
	int iq;

	public void setIq(int iq) {
    	this.iq = iq;
	}

	public int getIq() {
    	return iq;
	}

	public String toString() {
    	return "Our wise man has an IQ "+iq;
	}
}
結論:
私たちの賢者は IR 300 を持っています 私たちの賢者は IR 100 を持っています
iqプロパティを持つWiseManクラス があります。このフィールドの値を制御する 2 つのメソッド。main メソッドでは、wiseManオブジェクトを作成し、iq 値を 300 に設定します。次に、 iq 300 の賢者をchangeObjectメソッドに渡しますが、このメソッドでは彼は愚かになります。iqの値を100 に設定します。次に、main メソッドでオブジェクトを出力します。ChangeObjectメソッドでは、変数m内の別の sage を操作していることがわかります。ただし、元のオブジェクトを変更しています。実際には、main メソッドのwiseManオブジェクトと、 changeObjectメソッドのmオブジェクトは同じ wiseman であり、オブジェクトへの参照がパラメータとしてメソッドにコピーされます。個々のメソッドでオブジェクトを編集するときは、このことに留意してください。

最後に、static 修飾子について少し説明します。

一般に、ここではいくつかの言葉では不十分ですが、試してみます。この修飾子でマークされていない通常のメソッドは、クラス オブジェクトに属します。そして、静的メソッドはクラス自体に属します。従来の方法を個々のオブジェクトに対して使用できます。上の例のWiseManクラスを見てください。IQ レベルは人それぞれ異なるため、各賢者は独自のgetIqメソッドとsetIqメソッドを持ちます。このクラスに静的メソッドgenerateAWisePhraseを追加すると、オブジェクトなしでそのようなメソッドを呼び出すことができます。
WiseMan.generateAWisePhrase();
一般に、staticについてはいくつかの講義を書くことができるため、現時点ではこの情報で十分です。コード内の順序を維持するメソッドを作成するときは、いくつかのルールに従ってください。
  • メソッドに意味のある名前を付けて、その動作が明確になるようにします。
  • 非常に長いメソッドは記述しないようにしてください。最適な長さは 8 ~ 15 行です。
  • メソッドパラメータの数は 4 ~ 5 を超えてはなりません。
  • コード内に同様の機能が 2 回ある場合は、それを一般化して別のメソッドに入れる価値があるのではないかと考えてください。
これらのテクニックは、プログラムのパフォーマンスを向上させ、最も重要なことに、コードを読みやすくするのに役立ちます。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION