Yöntem ve işlev arasındaki fark nedir?


1740

Birisi OOP bağlamında yöntemlere karşı işlevlere ilişkin basit bir açıklama sağlayabilir mi?



12
Bir özelliğin değeri bir işlev olduğunda, buna bir yöntem diyoruz
kodlayıcı

2
Bir yöntemin zıttı nedir? Benim sorum bu. "İşlev" ana kavramdır. Yöntem bir tür işlevdir. Yöntem olmayan ancak doğrudan adıyla çağrılabilen bir işlev türünün adı nedir?
Alexander Mills

Yöntem ve fonksiyonları arasındaki farkı özetleyen başka bir açıklaması görmek ilginç olurdu r . Yöntem genellikle bir işlev içereceğinden ilginçtir . Yöntem nesneye bağlı bir işlevse, nesne sınıfı için işlev denetimi if(class(object)) { ... } else {stop()}kavramsal olarak yönteme eşdeğer olur mu?
Konrad

Doğru terminoloji gerçekten dile bağlı olabilir, bu yüzden farklı bağlamlarda biraz farklı şeyler anlamına gelebilir. Yine de, bir dil ile başka bir dil üzerinde çalışan programcılar belirli terminolojilere daha alışkındırlar. Programcılar ayrıca çalışma arkadaşlarının terimleri kullanmasından da etkilenir (doğru ya da yanlış). Bu terimler genellikle birbirlerinin yerine kullanılır. Örneğin, aşağıdaki yorumlardan bazılarına bakın.
jvriesem

Yanıtlar:


1831

Bir fonksiyon adıyla çağrılır kodunun bir parçasıdır. Çalışmak için veriler geçirilebilir (yani parametreler) ve isteğe bağlı olarak verileri döndürebilir (dönüş değeri). Bir işleve iletilen tüm veriler açıkça geçirilir.

Bir yöntem, bir nesne ile ilişkilendirilmiş bir ait olan kod parçasıdır. Çoğu bakımdan, iki temel fark dışında bir fonksiyonla aynıdır:

  1. Bir yöntem, çağrıldığı nesneyi dolaylı olarak geçirir.
  2. Bir yöntem sınıf içinde yer alan veriler üzerinde çalışabilir (bir nesnenin bir sınıf örneği olduğunu hatırlamak - sınıf tanımdır, nesne bu verinin bir örneğidir).

(bu basitleştirilmiş bir açıklamadır, kapsam konularını göz ardı ederek vb.)


249
1) için, C ++ 'daki yöntemlere üye işlevleri denildiğini de eklemelisiniz . Bu nedenle, bu bağlamdaki fonksiyonlar ve yöntemler arasındaki fark, C ++ 'daki fonksiyonlar ve üye fonksiyonlar arasındaki farka benzerdir. Ayrıca, Java gibi dillerin yalnızca yöntemleri vardır. Bu durumda, işlevler statik yöntemlere benzer ve yöntemler aynı anlama gelir. 2) için, bir yöntemin sınıfın bir parçası olarak bildirilen özel örnek (üye) verilerinde çalışabileceğini eklemelisiniz . Herhangi bir kod herkese açık yönetim ortamı verilerine erişebilir.
Raffi Khatchadourian

45
bir fonksiyon matematiksel bir yapıdır. Tüm yöntemlerin işlev olduğunu söyleyebilirim, ancak tüm işlevler yöntem değildir
Tyler Gillies

29
İşlevsel bir programlama geçmişinden geldiğimde, işlev ve yöntem arasında derin bir ayrım olduğunu hissediyorum. Temel olarak yöntemlerin yan etkileri vardır ve bu işlevler saf olmalıdır, bu nedenle referans şeffaflığın oldukça güzel bir özelliğini verir
HHC

26
@TylerGillies ve HHC, "işlev" ve "yöntem" ne istediklerini ifade ettiyse hoş olabileceğini kabul ediyorum, ancak tanımlarınız bu terimlerin çok yaygın kullanımlarını yansıtmıyor.
Paul Draper

9
Bu tanım gereği, statik bir yöntem, belirli bir örnekle ilgisi olmadığı için aslında bir yöntem olarak kabul edilmez mi?
Carcigenicate

961

Yöntem bir nesnenin üzerindedir.
Bir işlev bir nesneden bağımsızdır.

Java ve C # için yalnızca yöntemler vardır.
C için sadece fonksiyonlar vardır.

C ++ ve Python için bir sınıfta olup olmadığınıza bağlıdır.


39
C # ekleme zamanı.
Rosdi Kasim

7
@RosdiKasim C # için yalnızca yöntemler vardır. (statik yöntemlerin bile bir nesne ile ilişkilendirilmesi gerektiğinden)
Lynn Crumbling

38
Bir sınıftaki statik yöntemlere ne dersiniz? Bunlar bir cisimden bağımsız olacaktır (java'da). O zaman bu bir işlev olmaz mı?
Squeazer

12
@Squeazer Son zamanlarda stackoverflow.com/questions/30402169/… hakkında bir soru var Java Dil Spesifikasyonu onları sadece "sınıf yöntemi" (statik) ve "örnek yöntemi" olarak farklılaştırıyor. Yani hala hepsi yöntem.
xji

14
Java'nın yöntem olmayan fonksiyonlar olan lambda ifadeleri vardır
Max Heiber

228

'method' , 'function' için nesne yönelimli kelimedir . Bunun hemen hemen hepsi var (yani, gerçek bir fark yok).

Ne yazık ki, buradaki cevapların birçoğu karmaşık ve anlamlı bir fark olduğu fikrini devam ettiriyor veya ilerletiyor.

Gerçekten - o kadar çok şey yok, sadece aynı şey için farklı kelimeler.

[geç ekleme]


Aslında, Brian Neal'ın bu soruya yaptığı bir yorumda belirttiği gibi , C ++ standardı üye işlevlerine atıfta bulunurken asla 'yöntem' terimini kullanmaz. Bazı insanlar bunu C ++ 'ın gerçekten nesne yönelimli bir dil olmadığının bir göstergesi olarak alabilirler; ancak bunu oldukça zeki bir insan grubunun farklı bir terim kullanmak için özellikle güçlü bir neden olduğunu düşünmediğinin bir göstergesi olarak almayı tercih ediyorum.


14
Yöntem, örtük argüman iletilen özel bir işlev türüdür (yöntemin tanımlandığı sınıfın bir örneği). Bu, işlev olarak, katı terimlerle, argüman listesinde olmayan hiçbir şeyi kullanmamalı veya değiştirmemelidir.
ty1824

4
@ ty1824 yöntemlerin dolaylı argümanlardan geçirilmesi her zaman böyle değildir. Python'da selfargüman açıktır. Ve birçok dilde, örnek geçmeyen statik yöntemler vardır.
Max Heiber

1
mheiber bunlar geçerli bazı noktalar. Benlik ile ilgili olarak, haklısınız, açıkça tanımlanmıştır . Anahtar, orijinal nesne başvurusunu temel alarak çağrının örtük olmasıdır. A thisveya öğesinin geçersiz kılmayı destekleyen diller vardır self, ancak bu yapılara genellikle yöntemler yerine işlevler denir.
ty1824

1
Statik yöntemler söz konusu olduğunda, java bunları bir geçici çözüm olarak uyguladı, böylece işlevler bir bağlama gerek kalmadan uygulanabilir. Ben 'statik yöntem' yanıltıcı bir terim ve ideal bir teorik dünyada ... değiştirilmesi gerektiğini önermek için şimdiye kadar giderdim
ty1824

1
@ ty1824 C ++, Scala, Python, Ruby, JavaScript ve Scala'nın statik yöntemleri vardır, bu yüzden bunun sadece bir Java işi olduğunu düşünmüyorum. Ben de onları sevmiyorum: onlar ad alanları gibi nesneleri (devlet demetleri) kullanarak tutar.
Max Heiber

99

Genel olarak: yöntemler bir sınıfa ait işlevlerdir, işlevler kodun başka bir alanında olabilir, böylece tüm yöntemlerin işlev olduğunu, ancak tüm işlevlerin yöntem olmadığını belirtebilirsiniz:

Aşağıdaki python örneğini alın:

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

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

knock_door()

Verilen örnek, "kapı" adlı bir sınıfı veya "açık" adında bir eylemi olan bir sınıfı gösterir; buna sınıf içinde bildirildiği için bir yöntem denir. Kodun hemen altında "def" ile bir işlevi tanımlayan başka bir bölüm vardır, bu bir işlevdir, çünkü bir sınıf içinde bildirilmez, bu işlev görebildiğimiz gibi sınıfımızda tanımladığımız yöntemi çağırır ve son olarak işlev kendi kendine çağırdı.

Gördüğünüz gibi bir işlevi herhangi bir yere çağırabilirsiniz, ancak bir yöntemi çağırmak istiyorsanız, ya sınıfla aynı türden yeni bir nesne iletmeniz gerekir (yöntemin bildirildiği (Class.method (object)) ya da çağırmanız gerekir. en azından python'da nesnenin içindeki (object.Method ()) yöntem.

Yöntemleri sadece bir varlığın yapabileceği şeyler olarak düşünün, bu yüzden bir Köpek sınıfınız varsa, sadece bu sınıfın içinde bir kabuk işlevine sahip olmak mantıklı olacaktır ve bu bir yöntem olacaktır, eğer bir Person sınıfınız da varsa mantıklı olabilir hem insanlar hem de köpekler beslenebileceğinden ve özellikle herhangi bir sınıfa ait olmadığı için bu işlevi çağırabildiğiniz için, bunun için herhangi bir sınıfa ait olmayan "işlev" yazın.


2
Bu cevap - çoğunlukla ilk cümlesi --- sorunun en özlü ve genel olarak en iyi yanıtıdır.
yourcomputergenius

61

Hatırlamanın kolay yolu:

  • F → fonksiyonu F ree (Serbest bir nesne veya sınıf aittir anlamına gelir)
  • M ethod → M kor (Bir nesnenin veya sınıfın üyesi)

genellikle değiştirilebilir olduğu için neden bir anımsatıcıya ihtiyacınız var?
Sapphire_Brick

44

Bir İşlev ve Yöntem arasındaki ana farkın çok genel bir tanımı :

Fonksiyonlar sınıfların dışında tanımlanırken, Yöntemler sınıfların içinde ve sınıfların bir kısmında tanımlanır.


30

Burada okumak istiyorsanız "OO yöntemlerine girişim"

Nesneye Dayalı paradigmanın arkasındaki fikir, yazılımın "iyi" nesnelerden "oluştuğunu" tehdit etmektir ". Gerçek dünyadaki nesnelerin özellikleri vardır, örneğin bir Çalışanınız varsa, çalışanın bir adı, çalışan kimliği, pozisyonu vardır, bir departmana aittir vb.

Nesne ayrıca öznitelikleriyle nasıl başa çıkılacağını ve bunlar üzerinde bazı işlemlerin nasıl yapılacağını da bilir. Bir çalışanın şu anda ne yaptığını bilmek istiyorsak, ona soracağımızı varsayalım.

employe whatAreYouDoing.

Bu "whatAreYouDoing", nesneye gönderilen bir "mesaj" dır. Nesne bu sorulara nasıl cevap verileceğini bilir, soruyu çözmek için bir "yöntem" olduğu söylenir.

Bu nedenle, nesnelerin davranışlarını ortaya çıkarma biçimine yöntemler denir. Bu nedenle yöntemler, yapay nesnenin bir şey "yapması" gerektiğidir.

Diğer olası yöntemler

employee whatIsYourName
employee whatIsYourDepartmentsName

vb.

Diğer yandan işlevler, bir programlama dilinin bazı verileri hesaplaması için gerekli yöntemlerdir, örneğin 16 döndüren addValues ​​(8, 8) işlevine sahip olabilirsiniz.

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

İlk popüler programlama dilleri (fortran, c, pascal gibi) OO paradigmasını kapsamadığından, sadece bu yapay yapılara "işlevler" adını verir.

örneğin C'deki önceki işlev şöyle olur:

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

Bir nesnenin bazı eylemleri gerçekleştirmek için bir "işlevi" olduğunu söylemek "doğal" değildir, çünkü bir Çalışanın üzerinde çok az matematik varken işlevler matematiksel şeylerle daha fazla ilişkilidir, ancak işlevlerle tamamen aynı yöntemlere sahip olabilirsiniz, örneğin Java'da bu eşdeğer addValues ​​işlevi olacaktır.

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

Tanıdık geliyor? Çünkü Java'nın kökleri C ++ ve C ++ C'dir.

Sonunda sadece bir kavram, uygulamada aynı görünebilirler, ancak OO belgelerinde bunlara yöntem denir.

Java'da daha önce Çalışan nesnesine bir örnek.

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.

Fark, uygulandığı "etki alanı" üzerindedir.

AppleScript, bir noktada OO'nun sahip olduğu "doğal dil" matphor fikrine sahiptir. Örneğin Smalltalk. Umarım bunu okuduktan sonra nesnelerdeki yöntemleri anlamanız daha kolay olabilir.

NOT: Kod derlenmemeli, sadece örnek olarak gösterilmelidir. Gönderiyi değiştirebilir ve Python örneği ekleyebilirsiniz.


3
Bravo! Yöntemlerin nesnelere nasıl komut verildiği konusunda mükemmel açıklama. Bu, OO'yu anlamak için önemlidir ve bu cevapta gösterdiğiniz retorik eksikliği, OO'nun bugün sektörde bu kadar kötüye kullanılmasının nedenidir. Mükemmel gönderi.
moffdub

18

OO dünyasında, ikisi aynı şeyi ifade etmek için yaygın olarak kullanılır.

Saf bir Math ve CS perspektifinden bakıldığında, bir işlev aynı bağımsız değişkenlerle çağrıldığında her zaman aynı sonucu döndürür (f (x, y) = (x + y)). Öte yandan, bir yöntem tipik olarak bir sınıfın bir örneğiyle ilişkilendirilir. Yine de, çoğu modern OO dili artık çoğunlukla "işlev" terimini kullanmamaktadır. Birçok statik yöntem, tipik olarak durumları olmadığından (her zaman doğru değildir) işlevlere oldukça benzer olabilir.


17

Bir işlevin, bazı argümanlar alabilen ve bir sonuç döndürebilen bir kod bloğu (genellikle kendi kapsamıyla ve bazen kendi kapanışıyla) olduğunu varsayalım.

Yöntem, bir nesnenin sahip olduğu bir işlevdir (bazı nesne yönelimli sistemlerde, bir sınıfa ait olduğunu söylemek daha doğrudur). Bir nesneye / sınıfa "sahip olmak", yönteme nesne / sınıf üzerinden başvurduğunuz anlamına gelir; örneğin, Java'da, bir "door" nesnesinin sahip olduğu "open ()" yöntemini çağırmak istiyorsanız, "door.open ()" yazmanız gerekir.

Genellikle yöntemler ayrıca nesne / sınıf içindeki davranışlarını açıklayan bazı ekstra özellikler kazanır, örneğin: yöntemin hangi nesnelerden (veya sınıflardan) çağrılabileceğini tanımlayan görünürlük (nesneye yönelik kapsülleme kavramı ile ilgili).

Birçok nesne yönelimli dilde, tüm "işlevler" bir nesneye (veya sınıfa) aittir ve bu nedenle bu dillerde yöntem olmayan işlevler yoktur.


1
Javascript (sorunuzda bahsettiğiniz), sınıflara değil nesnelere ait yöntemlere sahip nesnelere sahip yöntemlere sahip olarak nesne yönelimli dillerin genel eğilimini bulan dillerden biri olduğu için yöntemlerin bir nesneye veya sınıfa ait olabileceğini belirtmiştim. sınıflar var).
Mike Tunnicliffe

15

Yöntemler sınıfların işlevleridir. Normal jargonda, insanlar yöntemi değiştirir ve her yerde çalışırlar. Temel olarak bunları aynı şey olarak düşünebilirsiniz (global işlevlerin yöntem olarak adlandırılıp adlandırılmadığından emin değilsiniz).

http://en.wikipedia.org/wiki/Method_(computer_science)


13

Fonksiyon matematiksel bir kavramdır. Örneğin:

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

f () işlevinin, ikinci parametrenin kosinüsüne eklenen ilk parametrenin günahını döndüreceğini söylüyor. Sadece matematik. Olduğu gibi sin () ve cos () da işlevlerdir. Bir işlevin başka bir özelliği daha vardır: aynı parametrelere sahip bir işleve yapılan tüm çağrılar aynı sonucu döndürmelidir.

Öte yandan yöntem, nesne yönelimli bir dilde bir nesneyle ilişkili bir işlevdir. Örtük bir parametresi vardır: Üzerinde işlem yapılan nesne (ve durumu).

Bu nedenle, g (x) yöntemine sahip bir Z nesneniz varsa, aşağıdakileri görebilirsiniz:

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

Bu durumda, x parametresi, daha önce fonksiyon örneğindeki gibi aktarılır. Bununla birlikte, cos () parametresi Z. Z nesnesinin içinde yaşayan bir değerdir ve onun içinde yaşayan veriler (Zy) Z'nin g () yöntemine örtük parametrelerdir.


13

İşlev veya yöntem, bazı işlemleri gerçekleştiren ve isteğe bağlı olarak bir değer döndüren adlandırılmış çağrılabilir kod parçasıdır.

In C dilinde terim fonksiyonu kullanılır. Java ve C # kullanıcıları bunu bir yöntem olarak söyler (ve bu durumda bir işlev bir sınıf / nesne içinde tanımlanır).

A C ++ programcısı bir işlev veya bazen yöntem olarak adlandırılabilir (yordamsal stil c ++ kodu yazıyorlarsa veya C ++ 'ın nesne yönelimli yolunu yapıyorlarsa bağlı olarak, yalnızca bir C / C ++ programcısı muhtemelen bir işlev olarak adlandırır çünkü' yöntem 'terimi C / C ++ literatüründe daha az kullanılır).

Bir işlevi sadece adı gibi arayarak kullanırsınız,

result = mySum(num1, num2);


Bir yöntemi ilk önce nesnesine başvurarak,

result = MyCalc.mySum(num1,num2);

13

Tarihsel olarak, bir "yöntemin" bir değer döndürmeyen bir şey olması ve bir "işlev" ile küçük bir fark olmuş olabilir.Her dilin kendi terim sözlüğü vardır özel anlamı olan.

In "C" , kelime "işlev" anlamına bir program rutini .

In Java terimi "işlev" herhangi bir özel anlama sahip değildir. Oysa "yöntem" , bir sınıfın uygulanmasını oluşturan rutinlerden biri anlamına gelir.

In C # bu kadar tercüme ediyorum:

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

Ama gerçekten, iki kavramda gerçekten hiçbir fark olmadığını tekrar ediyorum. Java hakkında gayri resmi tartışmalarda "işlev" terimini kullanırsanız, insanlar "yöntem" demek istediğinizi varsayar ve devam eder. Java ile ilgili uygun belgelerde veya sunumlarda kullanmayın yoksa aptalca görüneceksiniz.


Aslında, örneğin her ikisi de method... yoksa It çağırır procedureve function.
Yousha Aleayoub

9

İşlev, verileri işlemek için kullanılabilecek bir mantık kümesidir.

Süre, Yöntem ait olduğu nesnenin verilerini işlemek için kullanılan bir işlevdir. Yani teknik olarak, tamamen sınıfınızla ilgili olmayan ancak sınıfta beyan edilen bir fonksiyonunuz varsa, bu bir yöntem değildir; Buna kötü tasarım denir.


8

Sınıftaki yöntemler, nesnenin adı verilen sınıf örneğine göre hareket eder.

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 veya C ++ gibi OO dillerinde, bir "yöntem" bir nesne ile ilişkili bir fonksiyondur. Örneğin, bir "Köpek" nesnesinin bir "kabuk" işlevi olabilir ve bu bir "Yöntem" olarak kabul edilir. Buna karşılık, "StrLen" işlevi tek başınadır (bağımsız değişken olarak sağlanan dizenin uzunluğunu sağlar). Dolayısıyla bu sadece bir "işlev" dir. Javascript teknik olarak Nesneye Yöneliktir, ancak C ++, C # veya Pascal gibi tam gelişmiş bir dile kıyasla birçok sınırlama ile karşı karşıyadır. Bununla birlikte, ayrım hala devam etmelidir.

Birkaç ek gerçek: C # tamamen nesne yönelimli olduğundan bağımsız "fonksiyonlar" yaratamazsınız. C # 'da her işlev bir nesneye bağlıdır ve bu nedenle teknik olarak bir "yöntemdir". En önemlisi, C # 'da çok az insanın "yöntem" olarak adlandırdığıdır - sadece "işlevler" terimini kullanırlar çünkü yapılacak gerçek bir ayrım yoktur.

Son olarak - herhangi bir Pascal guru bana burada atlamıyor - Pascal da "fonksiyonlar" (bir değer döndüren) ve "prosedürler" arasında ayrım yapmaz. Elbette bir değer döndürüp döndürmemeyi seçebilmenize rağmen, C # bu ayrımı açıkça yapmaz.


8

Python'dan bahsettiğinizden beri, aşağıdakiler çoğu modern nesne yönelimli dilde yöntemler ve nesneler arasındaki ilişkinin yararlı bir örneği olabilir. Özetle, "yöntem" olarak adlandırdıkları şey, sadece (diğer cevapların işaret ettiği gibi) ekstra bir argümandan geçen bir işlevdir, ancak Python bunu çoğu dilden daha açık hale getirir.

# 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")

Şimdi işlevi greet_with_greeterve yöntemi karşılaştırın greet: tek fark ilk parametrenin adıdır ("karşılama" olarak adlandırdığım işlevde, "self" olarak adlandırdığım yöntemde). Böylece greetyöntemi greet_with_greeter( ben "sınıf" sözdizimini kullanarak, bir sınıf içinde tanımladığından beri) işlevini kullanarak tam olarak aynı şekilde kullanabilirsiniz :

Greeter.greet(hello_greeter, "World")

Bu yüzden bir yöntemi etkili bir şekilde bir işleve çevirdim. Bir işlevi bir yönteme dönüştürebilir miyim? Python, tanımlandıktan sonra sınıflarla uğraşmanıza izin verdiği için deneyelim:

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

Evet, işlev greet_with_greeterartık yöntem olarak da bilinir greet2. Bu, yöntem ve işlev arasındaki tek gerçek farkı gösterir: bir nesneyi "on" yöntemiyle çağırarak çağırdığınızda object.method(args), dil sihirli bir şekilde dönüştürür method(object, args).

(OO puristleri bir yöntemin bir işlevden farklı bir şey olduğunu iddia edebilirler ve eğer gelişmiş Python veya Ruby - ya da Smalltalk! 'A girerseniz, onların amacını görmeye başlayacaksınız. Ayrıca bazı diller yöntemlere bir nesnenin bitlerine özel erişim sağlar. ana kavramsal fark hala gizli ekstra parametredir.)


7

benim için: bir yöntemin işlevi ve bir işlevi kabul edersem aynıdır:

  • bir işlev bir değer döndürebilir
  • parametreler bekleyebilir

Her kod parçası gibi, içine koyduğunuz nesneler olabilir ve sonuç olarak gelen bir nesneniz olabilir. Bunu yaparken bir nesnenin durumunu değiştirebilirler, ancak bu benim için temel işlevlerini değiştirmez.

Nesnelerin veya diğer kodların çağrı işlevlerinde bir tanım farklılığı olabilir. Ama bu sözel farklılıklar için bir şey değil mi ve bu yüzden insanlar onları değiştiriyorlar mı? Dikkat ettiğim hesaplama örneğinden bahsediyor. çünkü işe benim hesaplamaları yapmak için istihdam:

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

Bu şekilde hesaplardan sorumlu bir işverene güvenebilirim. Daha fazla para istiyorsa onu serbest bırakıyorum ve çöp toplayıcısının kullanılmayan çalışanları atma işlevine izin verdim gerisini halledin ve yeni bir çalışan alın.

Bir yöntemin bir nesneler işlevi olduğunu ve bir işlevin bağlantısız hesaplama olduğunu iddia etmek bile bana yardımcı olmaz. İşlev tanımlayıcının kendisi ve ideal olarak işlevin belgeleri bana neye ihtiyacı olduğunu ve neyin geri dönebileceğini söyleyecektir. Gerisi, bazı nesnelerin durumunu değiştirmek gibi benim için gerçekten şeffaf değil. Hem işlevlerin hem de yöntemlerin, iddia ettiklerini, nasıl yaptıklarını ayrıntılı olarak bilmelerine gerek kalmadan sunmalarını ve manipüle etmelerini bekliyorum. Saf bir hesaplama işlevi bile konsolun durumunu değiştirebilir veya bir günlük dosyasına eklenebilir.


5

Çok basit bir cevap olması gerekeni fazla karmaşık hale getirmeyelim. Yöntemler ve işlevler aynı şeydir. Bir işleve sınıf dışındayken bir işlev olarak adlandırırsınız ve bir işlevin sınıf içine yazıldığında bir yöntem olarak adlandırırsınız.


4

Anladığım kadarıyla bir yöntem, bir sınıfta gerçekleştirilebilecek herhangi bir işlemdir. Programlamada kullanılan genel bir terimdir.

Birçok dilde yöntemler fonksiyonlar ve alt rutinler ile temsil edilir. Çoğu dilin bunlar için kullandığı temel ayrım, işlevlerin arayana bir değer döndürebileceği ve bir altyordamın geri dönmeyebileceğidir. Bununla birlikte, birçok modern dilin sadece işlevleri vardır, ancak bunlar isteğe bağlı olarak herhangi bir değer döndüremez.

Örneğin, bir kediyi tanımlamak istediğinizi ve bunun esnemek istediğinizi varsayalım. Büyük olasılıkla herhangi bir dönüş değeri olmayan bir işlev olabilecek bir Esneme yöntemiyle bir Cat sınıfı oluşturacaksınız.


4

Birinci dereceden bir yaklaşım için, bir yöntem (C ++ stili OO'da) üye işlevinin başka bir kelimesidir, yani bir sınıfın parçası olan bir işlevdir.

C / C ++ gibi dillerde bir sınıfın üyesi olmayan işlevlere sahip olabilirsiniz; sınıfla ilişkili olmayan bir işlevi yöntem olarak çağırmazsınız.


4

İşlev, temel olarak bir işlevin verileri işleyebilen ve size değer döndüren bir varlık olduğu Prosedür odaklı programlamaya ait kavramdır

Yöntem, bir yöntemin çoğunlukla sınıf üyeleri üzerinde işlem yapan bir sınıfın üyesi olduğu Nesne Tabanlı programlama kavramıdır .


3

IMHO insanları, nesnelerin içindeki işlevlere başvurmak istediklerinde programcılar arasında daha kolay iletişim için yeni bir kelime icat etmek istiyorlardı.

Eğer yöntemler söylüyorsanız, sınıf içindeki işlevleri kastediyorsunuz demektir. Eğer fonksiyonlar söylüyorsanız, sadece sınıfın dışındaki fonksiyonlar demek istersiniz.

Gerçek şu ki, her iki kelime de fonksiyonları tanımlamak için kullanılır. Yanlış kullansanız bile yanlış bir şey olmaz. Her iki kelime de kodunuzda neyi başarmak istediğinizi açıklar.

İşlev, bir şey yapma rolünü ( işlevini ) yürütmesi gereken bir koddur . Yöntem, sorunu çözmek için bir yöntemdir .

Aynı şeyi yapar. Aynı şey. Süper hassas olmak ve kuralla birlikte gitmek istiyorsanız, yöntemleri nesnelerin içindeki işlevler olarak çağırabilirsiniz.


2

Ben bir uzman değilim, ama bunu biliyorum:

  1. İşlev C dili terimidir, bir kod parçasına karşılık gelir ve işlev adı bu işlevi kullanmak için tanımlayıcı olacaktır.

  2. Yöntem OO terimidir, genellikle function parametresinde bu bir işaretçi vardır. C gibi bu kod parçasını çağıramazsınız, onu çağırmak için nesne kullanmanız gerekir.

  3. Çağırma yöntemleri de farklıdır. Burada bu kod parçasının adresini bulmak için anlam çağırın. C / C ++, bağlantı zamanını bulmak için fonksiyon sembolünü kullanır.

  4. Objecive-C farklıdır. Adresi bulmak için veri yapısını kullanmak üzere bir C işlevi anlamına gelir. Bu, her şeyin çalışma zamanında bilindiği anlamına gelir.


2

Başkalarının zaten cevap verdiğini biliyorum, ancak aşağıdaki basit ama etkili tek satırlık bir cevap olduğunu buldum. Diğerlerinin cevaplarından çok daha iyi görünmese de, ancak dikkatlice okursanız, yöntem vs işlevi hakkında bilmeniz gereken her şeye sahiptir.

Yöntem, tanımlanmış bir alıcıya sahip bir işlevdir, OOP terimleriyle yöntem, bir nesnenin örneğindeki bir işlevdir.


2

Yöntemler ve İşlevler Arasındaki Fark

Bu dokümanı Microsoft'ta okumaktan

Yürütülebilir kod içeren üyeler topluca bir sınıfın işlev üyeleri olarak bilinir. Önceki bölümde, birincil işlev üyesi türü olan yöntemler açıklanmaktadır. Bu bölümde, C # tarafından desteklenen diğer işlev üyeleri açıklanmaktadır: yapıcılar, özellikler, dizinleyiciler, olaylar, işleçler ve sonlandırıcılar.

Yöntemler, işlevlerin alt kümesidir. Her yöntem bir işlevdir, ancak her işlev bir yöntem değildir, örneğin constructorbir yöntem olarak söylenemez, ancak bir işlevdir.


Özellikler, dizinleyiciler ve olaylar işlev değildir. Alıcılar, ayarlayıcılar (özellikler ve dizinleyiciler için), toplayıcılar ve kaldırıcılar (etkinlikler için) işlevlerdir. İşlev üyeleri, bir veya daha fazla işlevle ilişkilendirilmiş ancak bir işlev olması gerekmeyen üyelerdir.
Jon Hanna

2

İşlev - Bağımsız bir kod parçasında, bazı mantık içeren ve bağımsız olarak çağrılması gereken bir işlev ve sınıf dışında tanımlanmış .

Yöntem - Yöntem , bazı nesnelere referans olarak adlandırılan ve sınıf içinde tanımlanan bağımsız bir kod parçasıdır .


Statik bir sınıfta, aynı zamanda statik olan bir kod parçasına ne denir, bu bir yöntem veya işlev mi? Bir sınıfın statik işlevi / yöntemi, bildirildiği sınıfın bir nesnesine ihtiyaç duymaz.
Wolfgang Roth

1

JavaScript örneklerini kullanarak yöntem ve işlev için bazı açıklamalar:

test(20, 50); işlev, bazı adımları çalıştırmak veya bir yerde saklanabilen / kullanılabilen bir şeyi geri döndürmek için tanımlamak ve kullanmaktır.

Kodu yeniden kullanabilirsiniz: Kodu bir kez tanımlayın ve birçok kez kullanın.

Farklı sonuçlar elde etmek için aynı kodu farklı argümanlarla birçok kez kullanabilirsiniz.

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(); Burada test (), bir nesnenin yöntemi olabilir veya dahili nesneler için özel olarak tanımlanmış bir prototip olabilir, işte daha fazla açıklama:

JavaScript yöntemleri, nesneler üzerinde gerçekleştirilebilecek eylemlerdir.

JavaScript yöntemi, işlev tanımı içeren bir özelliktir.

Javascript dizeleri için yerleşik özellik / yöntem:

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

Özel örnek:

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'

Örneğin, String, Array, vb. İçin özellikler tanımlayabilirsiniz

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");

Bazı referanslar: Javascript Nesne Yöntemi , İşlevler , Prototip hakkında daha fazla bilgi


Lütfen birden fazla soruya özdeş cevaplar göndermeyin. İyi bir yanıt gönderin, ardından diğer soruları kopya olarak kapatmak için oy verin / işaretleyin. Soru yinelenmiyorsa, yanıtınızı soruya uygun hale getirin.
Paul Roub

Geri bildiriminiz için teşekkür ederim, başka bir cevap vermedim, o cevabı sildim. :-)
Lahar Shah

1

TL; DR

İşlev, çalıştırılacak bir kod parçasıdır.
Yöntem, bir Nesnenin içindeki bir İşlevdir.

Bir işlev örneği:


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

Bir Yöntem Örneği:

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

Bu nedenle, bir İşlev içindeki bir "bu" anahtar kelimenin arama, uygulama veya bağlama ile birlikte kullanmadıkça çok yararlı olmadığını söylüyoruz çünkü çağrı, uygulama, bağlama bu işlevi nesne içindeki bir yöntem olarak çağırır ==> temelde işlevi yönteme dönüştürür


1

Genellikle değiştirilebilirler, ancak bir yöntem genellikle bir sınıf içindeki bir alt yordama ve bir işlev genellikle sınıf dışındaki bir alt yordama karşılık gelir. örneğin, Ruby'de:

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


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

Her şeyin (paket ve içe aktarma ifadeleri hariç) sınıf içinde olması gereken Java'da, insanlar hemen hemen her zaman "yöntem" olarak adlandırırlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.