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


1742

OOPコンテキストでのメソッド関数の簡単な説明を誰かが提供できますか?



12
プロパティの値が関数である場合、それをメソッドと呼びます
コーダー

2
メソッドの反対は何ですか?それが私の質問です。「機能」は親概念です。メソッドは関数の一種です。メソッドではないが名前で直接呼び出すことができる関数のタイプの名前は何ですか?
Alexander Mills

rのメソッドと関数の違いを概説する別の説明を見るのは興味深いでしょう。メソッドには通常関数が含まれているので興味深いです。メソッドがオブジェクト依存関数の場合、オブジェクトクラスの関数チェックはif(class(object)) { ... } else {stop()}概念的にメソッドと同等ですか?
Konrad

適切な用語は実際には言語に依存する可能性があるため、状況によっては少し異なることを意味します。それでも、ある言語で作業するプログラマーは特定の用語に慣れているためです。プログラマーは、同僚の用語の使用(正しいか正しくないかに関係なく)にも影響を受けます。これらの用語は、ほとんど同じ意味で使用されます。たとえば、以下のコメントの一部を参照してください。
jvriesem

回答:


1832

関数は名前で呼ばれるコードの一部です。操作対象のデータ(パラメーターなど)を渡すことができ、オプションでデータ(戻り値)を返すことができます。関数に渡されるすべてのデータは明示的に渡されます。

この方法は、オブジェクトに関連付けられた名前によって呼び出されるコードの一部です。ほとんどの点で、2つの重要な違いを除いて、関数と同じです。

  1. メソッドには、それが呼び出されたオブジェクトが暗黙的に渡されます。
  2. メソッドは、クラスに含まれるデータを操作できます(オブジェクトはクラスのインスタンスであることを思い出してください。クラスは定義であり、オブジェクトはそのデータのインスタンスです)。

(これは、スコープなどの問題を無視して簡略化した説明です)


249
1)については、C ++のメソッドがメンバー関数と呼ばれることも追加する必要があります。したがって、このコンテキストにおける関数とメソッドの違いは、C ++の関数とメンバー関数の違いに似ています。さらに、Javaのような言語にはメソッドしかありません。この場合、関数は静的メソッドに類似しており、メソッドは同じ意味を持ちます。2)の場合、メソッドがクラスの一部として宣言されたプライベートインスタンス(メンバー)データを操作できることを追加する必要があります。どのコードでもパブリックインスタンスデータにアクセスできます。
Raffi Khatchadourian 2012年

46
関数は数学的な構造です。私は、すべてのメソッドが機能しているではなく、すべての機能がメソッドであると言うだろう
タイラーギリーズ

29
関数型プログラミングのバックグラウンドから来て、関数とメソッドの間には大きな違いがあると感じています。主にメソッドには副作用があり、その関数は純粋である必要があるため、参照の透明性というかなり良い特性を提供します
HHC

26
@TylerGilliesとHHC、 "関数"と "メソッド"があなたが望んでいたことを意味するのであればいいかもしれませんが、定義にはこれらの用語の非常に一般的な使用法が反映されていません。
Paul Draper

9
この定義では、静的メソッドは特定のインスタンスとは何の関係もないため、実際にはメソッドとは見なされませんか?
カルシジェネート

963

メソッドはオブジェクト上にあります。
関数はオブジェクトから独立しています。

JavaおよびC#の場合、メソッドのみがあります。
Cの場合、関数のみです。

C ++とPythonでは、クラスにいるかどうかによって異なります。


39
C#を追加します。
Rosdi Kasim 2014

7
@RosdiKasim C#の場合、メソッドのみがあります。(静的メソッドでさえオブジェクトに関連付ける必要があるため)
Lynn Crumbling 2014

38
クラスの静的メソッドはどうですか?それらは(Javaの)オブジェクトから独立しています。それはその関数ではないでしょうか?
Squeazer 2014

12
そのことについて質問があります@Squeazer最近stackoverflow.com/questions/30402169/... Java言語仕様は、単に「クラスメソッド」(静的)と「インスタンスメソッド」としてそれらを異なります。したがって、それらはすべてすべてのメソッドです。
xji

15
Javaにはラムダ式があります。これはメソッドではない関数です
Max Heiber

228

「メソッド」「関数」のオブジェクト指向の単語です。これですべてです(つまり、実際の違いはありません)。

残念ながら、ここでの答えの多くは、いくつかの複雑で意味のある違いがあるという考えを永続させたり、進めたりしていると思います。

本当に-それほど多くはありませんが、同じことを別の言葉で表すだけです。

【後付】


実際、Brian Nealこの質問へのコメントで指摘したように、C ++標準では、メンバー関数を指すときに「メソッド」という用語を使用していません。一部の人々は、C ++が実際にはオブジェクト指向言語ではないことを示していると考えるかもしれません。しかし、私はそれを、かなり賢い人々のグループが別の用語を使用する特に強い理由があるとは考えていなかったことを示すものとして採用することを好みます。


14
メソッドは、暗黙的な引数(メソッドが定義されているクラスのインスタンス)が渡される特殊なタイプの関数です。これは関数として重要です。厳密に言えば、引数リストにないものを使用または変更してはなりません。
ty1824 2014年

4
@ ty1824メソッドに暗黙の引数が渡されるとは限りません。Pythonでは、self引数は明示的です。また、多くの言語にはインスタンスが渡されない静的メソッドがあります。
Max Heiber 2016年

1
@mheiberそれらはいくつかの有効なポイントです。自己に関しては、あなたは正しいです、それは明示的に定義されています。重要なのは、元のオブジェクト参照に基づいて、呼び出しが暗黙的であることです。thisまたはのオーバーライドをサポートする言語がありますselfが、これらの構造は通常、メソッドではなく関数と呼ばれます。
ty1824

1
@mheiber静的メソッドに関する限り、Javaは回避策としてそれらを実装したため、コンテキストを必要とせずに関数を実装できました。「静的な方法」は誤解を招く用語であり、置き換える必要があると私が提案するところまで行きます...理想的な理論的な世界では:)
ty1824

1
@ ty1824 C ++、Scala、Python、Ruby、JavaScript、Scalaのすべてに静的メソッドがあるため、単なるJavaだとは思わない。私もそれらが好きではありません。まるで名前空間であるかのようにオブジェクト(状態のバンドル)を使用することになります。
Max Heiber 2016年

99

一般に、メソッドはクラスに属する関数であり、関数はコードの他のスコープに置くことができるため、すべてのメソッドは関数であるが、すべての関数がメソッドであるとは限らないことを示すことができます。

次のpythonの例を見てみましょう。

class Door:
  def open(self):
    print 'hello stranger'

def knock_door:
  a_door = Door()
  Door.open(a_door)

knock_door()

与えられた例は、 "open"と呼ばれるメソッドまたはアクションを持つ "Door"と呼ばれるクラスを示しています。これは、クラス内で宣言されたため、メソッドと呼ばれます。すぐ下に "def"が付いたコードの別の部分があり、関数を定義しています。これはクラス内で宣言されていないため関数です。この関数は、クラス内で定義したメソッドを呼び出します。単独で呼び出されます。

ご覧のとおり、どこでも関数を呼び出すことができますが、メソッドを呼び出す場合は、クラスと同じタイプの新しいオブジェクトを渡すか、メソッドを宣言するか(Class.method(object))、または呼び出す必要があります。オブジェクト内のメソッド(object.Method())、少なくともpythonでは。

メソッドは1つのエンティティのみが実行できるものと考えてください。したがって、Dogクラスがある場合、そのクラス内にのみbark関数を配置することは理にかなっており、それはメソッドです。Personクラスもある場合、人間と犬の両方に餌を与えることができるので、どのクラスにも属さない関数 "feed"を記述します。特にどのクラスにも属していないため、その関数を呼び出すことができます。


2
この回答---主にその最初の文---は、質問に対する断然最も簡潔で全体的な最良の回答です。
yourcomputergenius

61

覚える簡単な方法:

  • 機能F ree(無料はオブジェクトまたはクラスに属していないことを意味します)
  • M ethod→ M燃えさし(オブジェクトまたはクラスのメンバー)

通常互換性があるので、なぜニーモニックが必要なのですか?
Sapphire_Brick

44

関数メソッドの主な違いの非常に一般的な定義:

関数はクラスの外部で定義され、メソッドはクラスの内部および一部で定義されます。


30

ここを読みたくなったら「OOメソッド入門」

オブジェクト指向のパラダイムの背後にある考え方は、ソフトウェアが「オブジェクト」で構成されていることを「脅かす」ことです。実世界のオブジェクトにはプロパティがあります。たとえば、従業員がいる場合、その従業員には名前、従業員ID、役職があり、部署に所属しているなどです。

オブジェクトは、その属性を処理し、それらに対していくつかの操作を実行する方法も知っています。従業員が今何をしているか知りたい場合は、その従業員に尋ねます。

employe whatAreYouDoing.

その「whatAreYouDoing」は、オブジェクトに送信される「メッセージ」です。オブジェクトはその質問に答える方法を知っています。質問を解決するための「メソッド」があると言われています。

したがって、オブジェクトがその動作を公開する方法はメソッドと呼ばれます。したがって、メソッドはアーティファクトオブジェクトが何かを「実行」する必要があります。

他の可能な方法は

employee whatIsYourName
employee whatIsYourDepartmentsName

一方、関数はプログラミング言語がデータを計算する方法です。たとえば、16を返す関数addValues(8、8)があるとします。

// pseudo-code
function addValues( int x, int y )  return x + y 
// call it 
result = addValues( 8,8 )
print result // output is 16...

最初の人気のあるプログラミング言語(fortran、c、pascalなど)はOOパラダイムをカバーしていなかったため、これらのアーティファクト「関数」のみを呼び出します。

たとえば、Cの以前の関数は次のようになります。

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

オブジェクトが何らかのアクションを実行するための「関数」を持っていると言うのは「自然なこと」ではありません。なぜなら、従業員は数学にほとんど関わっていないのに関数は数学的なものに関連しているからですが、関数とまったく同じように機能するメソッドを持つことができます。たとえばJavaでは、これは同等のaddValues関数になります。

public static int addValues( int x, int y ) {
    return x + y;
}

見覚えがある?これは、JavaのルーツがC ++とC ++のC ++にあるためです。

最後は単なる概念であり、実装では同じに見えるかもしれませんが、OOのドキュメントではこれらをメソッドと呼びます。

これは、以前のJavaのEmployeeオブジェクトの例です。

public class Employee {

    Department department;
    String name;

    public String whatsYourName(){
        return this.name;
    }
    public String whatsYourDeparmentsName(){
         return this.department.name();
    }
    public String whatAreYouDoing(){
        return "nothing";
    } 
    // Ignore the following, only set here for completness
    public Employee( String name ) {
        this.name = name;
    }

}

// Usage sample.
Employee employee = new Employee( "John" ); // Creates an employee called John

// If I want to display what is this employee doing I could use its methods.
// to know it.
String name = employee.whatIsYourName():
String doingWhat = employee.whatAreYouDoint();

// Print the info to the console.

 System.out.printf("Employee %s is doing: %s", name, doingWhat );

Output:
Employee John is doing nothing.

違いは、それが適用される「ドメイン」にあります。

AppleScriptには、ある時点でOOが持っていた「自然言語」という考え方があります。たとえば、Smalltalk。これを読んだ後、オブジェクト内のメソッドを理解するのが合理的に簡単になることを願っています。

注:コードは、例として機能するためだけにコンパイルされるものではありません。投稿を自由に変更してPythonの例を追加してください。


3
ブラボー!メソッドがオブジェクトへのコマンドである方法についての見事な説明。これはOOを理解するための鍵であり、この回答に表示されるレトリックの欠如が、今日の業界でOOがそのように悪用されている理由です。素晴らしいポスト。
moffdub 2008年

18

オブジェクト指向の世界では、この2つは一般に同じことを意味するために使用されます。

純粋な数学とCSの観点から、同じ引数(f(x、y)=(x + y))で呼び出された関数は常に同じ結果を返します。一方、メソッドは通常、クラスのインスタンスに関連付けられています。ただし、最近のほとんどのオブジェクト指向言語では、ほとんどの場合、「関数」という用語を使用していません。多くの静的メソッドは、通常状態を持たない(常にtrueであるとは限らない)ため、非常に関数のようになることがあります。


17

関数が、いくつかの引数を受け取り、結果を返す可能性があるコードのブロック(通常は独自のスコープを持ち、場合によっては独自のクロージャーを持つ)であるとしましょう。

メソッドは、オブジェクトが所有する関数です(一部のオブジェクト指向システムでは、クラスによって所有されていると言う方が正しいです)。オブジェクト/クラスが「所有」しているということは、オブジェクト/クラスを通じてメソッドを参照することを意味します。たとえば、Javaでオブジェクト「door」が所有するメソッド「open()」を呼び出す場合は、「door.open()」と記述する必要があります。

通常、メソッドは、オブジェクト/クラス内での動作を説明する追加の属性も取得します。たとえば、可視化(カプセル化のオブジェクト指向の概念に関連)、メソッドを呼び出すことができるオブジェクト(またはクラス)を定義します。

多くのオブジェクト指向言語では、すべての「関数」はいくつかのオブジェクト(またはクラス)に属しているため、これらの言語ではメソッドではない関数はありません。


1
Javascript(あなたが質問で述べた)は、クラスではなくオブジェクトが所有するメソッドを持つことでオブジェクト指向言語の一般的な傾向に反する言語の1つであるため、メソッドがオブジェクトまたはクラスによって所有される可能性があることを私は主張しました(構造は似ていますが)クラスが存在します)。
Mike Tunnicliffe、


13

関数は数学的な概念です。例えば:

f(x,y) = sin(x) + cos(y)

関数f()は、2番目のパラメーターの余弦に追加された最初のパラメーターの正弦を返すことを示しています。それは単なる数学です。sin()とcos()も関数です。関数には別のプロパティがあります。同じパラメーターを持つ関数へのすべての呼び出しは、同じ結果を返す必要があります。

一方、メソッドは、オブジェクト指向言語のオブジェクトに関連する関数です。暗黙のパラメーターが1つあります。対象となるオブジェクト(およびその状態)です。

したがって、メソッドg(x)を持つオブジェクトZがある場合、次のように表示されます。

Z.g(x) = sin(x) + cos(Z.y)

この場合、前の関数の例と同じように、パラメーターxが渡されます。ただし、cos()のパラメーターは、オブジェクトZの内部にある値です。Zとその内部にあるデータ(Zy)は、Zのg()メソッドの暗黙的なパラメーターです。


13

関数またはメソッドは、いくつかの操作を実行し、オプションで値を返す名前付きの呼び出し可能なコードです。

C言語の用語関数が使用されています。JavaおよびC#人々はそれをメソッドと言います(そしてこの場合の関数はクラス/オブジェクト内で定義されます)。

A C ++プログラマは、用語「方法」であるため、また、C / C ++プログラマのみの可能性が高い機能を呼び出します、彼らは手続き型スタイルのC ++コードまたはC ++のオブジェクト指向の方法をやっているを作成している場合に応じて、(関数や、時にはメソッドを呼び出すことができますC / C ++の文献ではあまり使用されていません)。

関数を使用するには、次のような名前を呼び出します。

result = mySum(num1, num2);


あなたは最初にそのオブジェクトを参照してメソッドを呼び出すでしょう、

result = MyCalc.mySum(num1,num2);

13

歴史的に、「メソッド」は値を返さないものであり、「関数」は値を返さないものであるという微妙な違いがあった可能性があります。各言語には、特別な意味を持つ用語の独自の用語集があります。

では、「C」、単語「機能」を意味プログラムルーチンを

ではJavaの、用語「機能」は特別な意味を持ちません。一方、「メソッド」とは、クラスの実装を形成するルーチンの1つを意味します。

ではC#のよう翻訳します:

public void DoSomething() {} // method
public int DoSomethingAndReturnMeANumber(){} // function

しかし、実際には、2つの概念に違いはないということを繰り返します。Javaについての非公式な議論で「関数」という用語を使用する場合、人々はあなたが「メソッド」を意味するものと見なし続けます。Javaに関する適切なドキュメントやプレゼンテーションで使用しないでください。ばかげた見た目になります。


実際に、あなたの例では、両方ですmethod...または私はそれを呼ぶだろうprocedurefunction
Yousha Aleayoub 2017年

9

関数は、データの操作に使用できる一連のロジックです。

一方、メソッドは、それが属するオブジェクトのデータを操作するために使用される関数です。したがって、技術的には、クラスに完全には関連付けられていないがクラスで宣言されている関数がある場合、それはメソッドではありません。それは悪いデザインと呼ばれています。


8

クラスのメソッドは、オブジェクトと呼ばれるクラスのインスタンスに作用します。

class Example
{
   public int data = 0; // Each instance of Example holds its internal data. This is a "field", or "member variable".

   public void UpdateData() // .. and manipulates it (This is a method by the way)
   {
      data = data + 1;
   }

   public void PrintData() // This is also a method
   {
      Console.WriteLine(data);
   }
}

class Program
{
   public static void Main()
   {
       Example exampleObject1 = new Example();
       Example exampleObject2 = new Example();

       exampleObject1.UpdateData();
       exampleObject1.UpdateData();

       exampleObject2.UpdateData();

       exampleObject1.PrintData(); // Prints "2"
       exampleObject2.PrintData(); // Prints "1"
   }
}

8

Object PascalやC ++などのオブジェクト指向言語では、「メソッド」はオブジェクトに関連付けられた関数です。したがって、たとえば、「Dog」オブジェクトには「bark」関数があり、これは「メソッド」と見なされます。対照的に、 "StrLen"関数はスタンドアロンです(引数として提供される文字列の長さを提供します)。したがって、これは単なる「機能」です。Javascriptも技術的にはオブジェクト指向ですが、C ++、C#、Pascalなどの本格的な言語と比較して多くの制限に直面しています。それにもかかわらず、その区別は依然として保持されるべきです。

追加の事実:C#は完全にオブジェクト指向であるため、スタンドアロンの「関数」を作成することはできません。C#では、すべての関数がオブジェクトにバインドされているため、技術的には「メソッド」です。キッカーは、C#で「メソッド」と呼ぶ人はほとんどいないということです。実際に区別する必要がないため、「関数」という用語を使用しているだけです。

最後に-Pascalの達人がここで私にジャンプしないように-Pascalは「値」を返す「関数」とそうでない「手続き」も区別します。もちろん、値を返すかどうかを選択することもできますが、C#はこの区別を明示的に行いません。


8

Pythonについて説明したので、以下は、最新のオブジェクト指向言語におけるメソッドとオブジェクトの関係を示す有用な例です。一言で言えば、彼らが「メソッド」と呼ぶものは、追加の引数が渡される関数です(他の回答が指摘しているように)が、Pythonは、ほとんどの言語よりもそれをより明示的にしています。

# perfectly normal function
def hello(greetee):
  print "Hello", greetee

# generalise a bit (still a function though)
def greet(greeting, greetee):
  print greeting, greetee

# hide the greeting behind a layer of abstraction (still a function!)
def greet_with_greeter(greeter, greetee):
  print greeter.greeting, greetee

# very simple class we can pass to greet_with_greeter
class Greeter(object):
  def __init__(self, greeting):
    self.greeting = greeting

  # while we're at it, here's a method that uses self.greeting...
  def greet(self, greetee):
    print self.greeting, greetee

# save an object of class Greeter for later
hello_greeter = Greeter("Hello")

# now all of the following print the same message
hello("World")
greet("Hello", "World")
greet_with_greeter(hello_greeter, "World")
hello_greeter.greet("World")

次に、関数greet_with_greeterとメソッドを比較しますgreet。唯一の違いは、最初のパラメーターの名前です(関数では「greeter」と呼び、メソッドでは「self」と呼びました)。したがって、私greetgreet_with_greeter関数を使用するのとまったく同じ方法でメソッドを使用できます(クラス内で定義したため、「ドット」構文を使用して取得します)。

Greeter.greet(hello_greeter, "World")

だから私は効果的にメソッドを関数に変えました。関数をメソッドに変換できますか?まあ、Pythonではクラスを定義した後でクラスをいじることができるので、試してみましょう。

Greeter.greet2 = greet_with_greeter
hello_greeter.greet2("World")

はい、関数greet_with_greeterはメソッドとも呼ばれgreet2ます。これは、メソッドと関数の唯一の実際の違いを示しています。を呼び出すことによってオブジェクトのメソッドを呼び出すobject.method(args)と、言語は魔法のようにそれをに変えmethod(object, args)ます。

(オブジェクト指向の純粋主義者は、メソッドは関数とは異なるものであると主張するかもしれません。高度なPythonやRuby、あるいはSmalltalk!主な概念上の違いは、依然として非表示の追加パラメーターです。)


7

私にとって:メソッドと関数の機能は、私が同意する場合は同じです:

  • 関数は値を返すことがあります
  • パラメータが必要な場合があります

コードの一部と同じように、オブジェクトを入れたり、結果としてオブジェクトができたりします。その間、彼らはオブジェクトの状態を変えるかもしれませんが、それは私にとって彼らの基本的な機能を変えません。

オブジェクトや他のコードの呼び出し関数に定義の違いがあるかもしれません。しかし、それは言葉による違いのためではなく、人々がそれらを交換する理由です。私が注意する計算の言及例。私は計算を行うために雇用を雇うので:

new Employer().calculateSum( 8, 8 );

そうすることで、雇用主が計算に責任を持つことに頼ることができます。彼がもっとお金が欲しいのなら、私は彼を解放し、未使用の従業員を処分するというカーベッジコレクターの機能に残りを任せて、新しい従業員を雇います。

メソッドがオブジェクト関数であり、関数が接続されていない計算であると主張しても、助けにはなりません。関数記述子自体と、理想的には関数のドキュメントに、何が必要で何が返されるかが示されています。残りの部分は、オブジェクトの状態を操作するようなものであり、実際には透過的ではありません。私は、関数とメソッドの両方が、彼らが主張するものを提供し、操作することを期待しています。その方法を詳細に知る必要はありません。純粋な計算関数でさえ、コンソールの状態を変更したり、ログファイルに追加したりすることがあります。


5

非常に単純な答えであるべきことを過度に複雑にしないようにしましょう。メソッドと関数は同じものです。クラスの外にあるときは関数を関数と呼び、クラス内に記述されているときはメソッドと関数を呼びます。


4

私の理解では、メソッドはクラスで実行できるすべての操作です。これはプログラミングで使用される一般的な用語です。

多くの言語では、メソッドは関数とサブルーチンによって表されます。ほとんどの言語がこれらに使用する主な違いは、関数は呼び出し元に値を返すことができ、サブルーチンは返さない場合があることです。ただし、多くの現代言語には関数しかありませんが、これらはオプションで値を返すことができません。

たとえば、猫について説明したいとし、あくびをしたいとします。Yawnメソッドを使用してCatクラスを作成します。これは、ほとんどの場合、戻り値のない関数です。


4

一次近似として、メソッド(C ++スタイルOOの場合)は、メンバー関数、つまりクラスの一部である関数の別名です。

C / C ++のような言語では、クラスのメンバーではない関数を持つことができます。クラスに関連付けられていない関数をメソッドと呼ぶことはありません。


4

関数は、主にプロシージャ指向プログラミングに属する概念です。関数は、データを処理して値を返すエンティティです。

メソッドはオブジェクト指向プログラミングの概念であり、メソッドはクラスのメンバーであり、ほとんどがクラスメンバーで処理を行います。


3

IMHOの人々は、オブジェクト内の関数を参照したいときに、プログラマー間のコミュニケーションを容易にするための新しい単語を発明したかっただけです。

メソッドといえば、クラス内の関数を意味します。関数といえば、単にクラス外の関数です。

真実は、両方の単語が機能を説明するために使用されていることです。誤って使用しても、何も問題はありません。どちらの言葉も、コードで達成したいことをうまく説明しています。

関数は、何かを行うための役割を果たす(関数)コードでなければなりません。この方法は、ある方法この問題を解決します。

同じことをします。同じことです。非常に正確にしたい場合は、オブジェクトの関数としてメソッドを呼び出すことができます。


2

私は専門家ではありませんが、これは私が知っていることです:

  1. 関数はC言語の用語で、コードの一部を指し、関数名はこの関数を使用するための識別子になります。

  2. メソッドはオブジェクト指向の用語であり、通常は関数パラメーターにthisポインターがあります。Cのようにこのコードを呼び出すことはできません。オブジェクトを使用して呼び出す必要があります。

  3. 呼び出し方法も異なります。ここで、このコードのアドレスを見つける意味を呼び出します。C / C ++では、リンク時に関数シンボルを使用して検索します。

  4. Objecive-Cは異なります。データ構造を使用してアドレスを検索するC関数を呼び出す。これは、実行時にすべてが既知であることを意味します。


2

他の多くの人がすでに回答していることは知っていますが、以下はシンプルでありながら効果的な1行の回答であることがわかりました。ここでは他の回答よりも見栄えはよくありませんが、注意深く読んだ場合、メソッドと関数について知っておくべきことはすべて揃っています。

メソッドは、レシーバーが定義された関数です。OOP用語では、メソッドはオブジェクトのインスタンスの関数です。


2

メソッドと関数の違い

Microsoftでこのドキュメントを読むことから

実行可能コードを含むメンバーは、まとめてクラスの関数メンバーと呼ばれます。前のセクションでは、関数メンバーの主要な種類であるメソッドについて説明しました。このセクションでは、C#でサポートされている他の種類の関数メンバー(コンストラクター、プロパティ、インデクサー、イベント、演算子、ファイナライザー)について説明します。

したがって、メソッドは関数のサブセットです。すべてのメソッドは関数であるが、すべての機能が方法ではありません、例えば、constructorと言うことができない方法ではなく、それは機能です。


プロパティ、インデクサー、イベントは関数ではありません。ゲッター、セッター(プロパティとインデクサー)、アダー、リムーバー(イベント)は関数です。関数メンバーは、1つ以上の関数に関連付けられているメンバーですが、必ずしも関数である必要はありません。
Jon Hanna

2

関数-いくつかのロジックを含み、独立 して呼び出す必要があり、クラスの外部で定義される、独立したコード部分の関数

メソッド-メソッドは、いくつかのオブジェクトを参照して呼び出され、クラス内で定義される独立したコードです。


静的クラス、つまり静的クラスのコードを何と呼びますか?これはメソッドですか、関数ですか?クラスの静的関数/メソッドは、それがで宣言されたクラスのオブジェクトを必要としません。
ヴォルフガング・ロート

1

以下は、JavaScriptの例を使用したメソッドと関数の説明です。

test(20, 50); 関数定義であり、いくつかのステップを実行したり、どこかに格納/使用できる何かを返すために使用します。

コードを再利用できます。コードを一度定義すれば、何度でも使用できます。

同じコードを異なる引数で何度も使用して、異なる結果を生成できます。

var x = myFunction(4, 3);   // Function is called, return value will end up in x

function myFunction(a, b) {
    return a * b;          // Function returns the product of a and b
}

var test = something.test(); ここでtest()はいくつかのオブジェクトのメソッドであるか、組み込みオブジェクトのプロトタイプをカスタム定義することができます。詳細は次のとおりです。

JavaScriptメソッドは、オブジェクトに対して実行できるアクションです。

JavaScriptメソッドは、関数定義を含むプロパティです。

JavaScriptの文字列の組み込みプロパティ/メソッド:

var message = "Hello world!";
var x = message.toUpperCase();
//Output: HELLO WORLD!

カスタムの例:

function person(firstName, lastName, age, eyeColor) {
    this.firstName = firstName;  
    this.lastName = lastName;
    this.age = age;
    this.eyeColor = eyeColor;
    this.changeName = function (name) {
        this.lastName = name;
    };
}

something.changeName("SomeName"); //This will change 'something' objject's name to 'SomeName'

たとえば、文字列、配列などのプロパティを定義できます。

String.prototype.distance = function (char) {
    var index = this.indexOf(char);

    if (index === -1) {
        console.log(char + " does not appear in " + this);
    } else {
        console.log(char + " is " + (this.length - index) + " characters from the end of the string!");
    }
};

var something = "ThisIsSomeString"

// now use distance like this, run and check console log

something.distance("m");

参考資料:JavaScriptオブジェクトメソッド関数プロトタイプの詳細


複数の質問に同じ回答を投稿しないでください。良い答えを1つ投稿してから、投票またはフラグを立てて、他の質問を重複として閉じます。質問が重複していない場合は、質問に対する回答を調整してください。
ポールルーブ2017

フィードバックをありがとう、私は他の答えを調整しなかったので、その回答を削除しました。:-)
Lahar Shah

1

TL; DR

関数は、実行するコードの一部です。
メソッドは、オブジェクト内の関数です。

関数の例:


function sum(){
  console.log("sum")l
}

メソッドの例:

const obj = {
a:1,
b:2,
sum(){
  }
}

そのため、関数内の「this」キーワードは、call、apply、またはbindで使用しない限り、あまり有用ではないと言います。call、apply、bindは、その関数をオブジェクト内のメソッドとして呼び出す==>基本的に関数をメソッドに変換します


1

それらはしばしば交換可能ですが、メソッドは通常、クラス内のサブルーチンを参照し、関数は通常、クラス外のサブルーチンを参照します。たとえば、Rubyでは:

# function
def putSqr(a)
   puts a ** 2
end


class Math2
   # method
   def putSqr(a)
      puts a ** 2
   end
end

Javaでは、すべて(パッケージおよびインポートステートメントを除く)がクラス内になければならないため、ほとんどの場合、人々はそれらを「メソッド」と呼びます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.