web-dev-qa-db-ja.com

関数とメソッドの違いは何ですか?

メソッドは関数よりもオブジェクト指向であると聞いたことがあります。誰かが関数とメソッドの例を見せて、メソッドと関数の違いを説明できるかどうか疑問に思っていましたか?

私はJavaプログラミングと関数の4分の3を取り上げたことはありません。違い、長所と短所を知りたいです。

5
Andrew

厳密に言えば、procedureは、その副作用(画面に何かを出力するなど)のためだけに実行され、値を返さないサブルーチンです。 functionは、同じ入力を指定すると常に同じ値を返し、副作用のないサブルーチンです。 methodは、クラスまたはオブジェクトに関連付けられているプロシージャまたは関数です。

混乱する部分は、人々がこれらの用語を使用するとき、彼らは常に純粋な定義を参照しているわけではないということです。利便性と一貫性を保つために、プログラミング言語は、関数、プロシージャ、メソッドを常に区別しているわけではありません。サブルーチンを宣言する方法は1つまたは2つあり、それが技術的に関数、プロシージャ、メソッドのどれであるかは、プログラマがそれをどのように使用しているかによって異なります。

たとえば、Javaでは、procedureは、メソッドにvoid戻り値の型を持つことによって作成されます。 functionは、次のように、戻り値の型と副作用のないメソッドです。

int add(int x, int y) {
    return x + y;
}

Javaのような言語のプログラミング経験しかない人々は、違いがあることに気づかないことがよくあります。なぜなら、Java Javaのみのコンテキストでは、プログラマーはanyサブルーチンをfunctionとして参照することが多く、違いを知っている人でも、それらは非常に知識のある人以外はほとんど修正されません。

プロシージャと関数の違いが重要であり、コンパイラによって強制される関数型プログラミング言語とは対照的です。その文脈では、あなたが他のことを意味するとき、あなたは一方の用語を使うことに腹を立てることでしょう。

関数型プログラミングには、その利点を宣伝する支持者がたくさんいます。 「関数型プログラミングの利点」を検索してください。簡単に言えば、純粋な関数は簡単に構成でき、遅延して実行されたり、順序が狂ったり、並列化されたりします。

不利な点は、実際のプログラムの多くが主に状態を処理することであり、ほとんどのプログラマーは、命令的な方法で状態について推論することが容易であると感じています。

28
Karl Bielefeldt

Javaにはそれ自体の機能はありません。持っているのはメソッドだけです。関数を模倣するために、Javaは一般に静的メソッドを使用します(Java.lang.Mathのように)。

ただし、独立した機能を提供するオブジェクト指向言語は数多くあります。その中には、Python、Ruby、JavaScript、C++、Object Pascal、さらにはPHPさえあります。その背後には正当な理由があります。

メソッドは基本的に1つの追加パラメーターを持つ関数です(Javaでは非表示)。 this として参照します。そのthisにより、メソッドが呼び出されているオブジェクトにアクセスできるため、オブジェクト全体は、通常定義するパラメーターに加えて、常にメソッドに対する暗黙のパラメーターであると考えることができます。

メソッドは、そのオブジェクトを使用する場合に意味があります。他のメソッドを呼び出したり、データメンバーにアクセスしたりします。たとえば、リストには、リストの長さを計算する方法を知っているgetLength()メソッドを含めることができます。各メンバーをスキャンする。暗黙のthisオブジェクト、つまりリストを使用しています。これが明示的なパラメータを必要としない理由です。

そうでなければ、機能で十分です。たとえば、角度の余弦を計算するには、角度だけが必要であり、他の状態は必要ないため、cos(float angle)は関数であり、明示的なangleパラメーターにのみ依存します。

もう1つの重要なことは、メソッドのオーバーライドです。 (私の考えでは、これは怪しげな習慣ですが、Javaは非常に広く使用しています。)特定のクラスを宣言します(Zと呼びます)a別のクラスのサブクラス(これをAと呼びます)、someの実装を変更しますそのメソッドの(メソッドfoo()をオーバーライドしたとします)。

サブクラスは基本クラスのように機能します(が同じインターフェースを提供すると言われます)が、それを行う方法は異なります。 Liskov代入原理 に従って、A型の変数を宣言し、それにZ型のインスタンスを割り当て、メソッドfoo()を呼び出すことができます;呼び出されるのはZではなくAfoo()の実装です。つまり、呼び出すメソッドは、オブジェクトの実際のタイプに基づいて、実行時に検索されます。これは、「動的メソッドディスパッチ」または「仮想メソッド」として知られています。

オーバーライドによって自動的に提供されるメソッドは、関数で直接エミュレートするのが容易ではありません。 (関数の場合、通常、「コールバック」または「高次関数」で同様のことが行われます)。

JavaおよびC#などの特定の言語では、thisパラメータを受け取らない「静的メソッド」を定義できます。これらは「スタンドアロン」関数とまったく同じように機能し、名前空間としてのクラス。このような名前空間は、クラスの静的メソッドを使用してそのクラスの新しいインスタンスを検索または作成するときに意味をなす場合があります。

私はあなたが今より良い絵を持っていると思います。

3
9000

Javafunctionsはありません。

  1. オブジェクトのメソッド
  2. クラスメソッド(静的メソッド)

standalone関数のような関数は、Javaには存在しません。

Javaの公式Webページを引用して、私の簡潔で明確な答えをサポートしたいと思います

ソフトウェアオブジェクトは、概念的には現実のオブジェクトと似ています。これらも、状態と関連する動作で構成されています。オブジェクトはその状態をフィールド(一部のプログラミング言語では変数)に格納し、メソッド(一部のプログラミング言語では関数)を通じてその動作を公開します。メソッドはオブジェクトの内部状態で動作し、オブジェクト間通信の主要なメカニズムとして機能します。内部状態を隠し、すべての対話をオブジェクトのメソッドを通じて実行することを要求することは、データカプセル化と呼ばれます。これはオブジェクト指向プログラミングの基本原理です。

ここにリンクがあります(純粋な言語で始める前にJavaの概念で始める人がいる場合)

Javaチュートリアル-オブジェクトとは

functionsmethodsと区別せずに呼び出すことがよくあると思います。私の場合はレガシーの問題です。私の最初の言語はCとVisual Basicでした。 フロー図を使用してアルゴリズムを設計することは許容されません(ここでprocesses(図で)は(私の先生によって)しばしば呼び出されました関数または手順functionの代わりにmethodsと言って、私は仕事で(かなり頻繁に)自分を見つけます。

Java(10年前))で始めたとき、私の先生はメソッドに2つのグループでタグを付けようとしました:

プロセッサ。受け取った引数またはオブジェクトの属性(状態変更)を変更するメソッド。値を返すかどうか(void)。または、システムに新しい値を生成します。永続化されるかどうか。

コンサルタントは、オブジェクト(属性)またはクラス(静的属性)を変更しないものです。

当時、私はそのようなカタログが設計時に本当に役立つと感じました。全体的に、これらの用語はCとV.B.

数年後、そして非常に多くの悪い慣行と無数の "ヒラリウスコード"の行の後で、私はそのようなラベル付けをあえて提案しませんでした。

実際には、両方の概念を混合して、両方のことを行うメソッドを作成します。しかし、それはベストプラクティスの問題です(または悪い、あなたのデッドラインに依存します)。私は常に自分の仕事仲間が彼らのコードの機能性と彼らがメソッドとそれらの名前を定義する方法に帰着することを奨励します。

これが私の質問へのささやかな貢献です:-)

それが役立つことを願っています。

0
Laiv

メソッド、関数、および手順の間に実際の違いはありません。それらはすべて同じ獣です:サブルーチン、プログラムのセクションであり、多くの場合、特定のタスクを実行するという名前が付けられています。

メソッドは、単に別の名前の関数です。

Even Javaには関数があります: "a + b"では "+"演算子は関数です。別の名前で行っても.

新しい言語を作ると想像してください:JavaBlubは、Javaの逐語的コピーですが、メソッドがなく、blubzorzがあります。JavaBlubのblubzorzも同じことをしますJavaのメソッドとして。

まっすぐな顔をして真剣に言ってくれませんか。JavaBlubはJavaとは異なります。メソッドを使用しないからですか?

0
Pieter B