it-swarm-tr.com

Bir "işlev" ve "prosedür" arasındaki fark nedir?

Genel olarak, hepimiz programlama dillerinde fonksiyonlar veya prosedürler 'i duyarız. Ancak bu terimleri neredeyse birbirinin yerine kullanabileceğimi öğrendim (bu muhtemelen çok yanlış).

Yani benim sorum şu:

İşlevsellikleri, amaçları ve kullanımları arasındaki fark nedir?

Bir örnek takdir edilecektir.

183
rpr

Bir fonksiyon bir değer döndürür ve bir prosedür sadece komutları çalıştırır.

İsim fonksiyonu matematikten gelir. Girdiye dayalı bir değeri hesaplamak için kullanılır.

Bir prosedür, sırayla çalıştırılabilecek bir komut setidir.

Çoğu programlama dilinde, fonksiyonların bile bir takım komutları olabilir. Bu nedenle fark, yalnızca bir değer parçasını geri getirme yönündedir.

Ancak bir işlevi temiz tutmak istiyorsanız (yalnızca işlevsel dillere bakın), bir işlevin yan etkisi olmadığından emin olmanız gerekir.

273
Toon Krijthe

Bu, içeriğe bağlıdır.

Pascal benzeri dillerde, işlevler ve prosedürler, bir değer döndürüp döndürmeme konusunda farklı olan, belirgin varlıklardır. Farklı davranırlar. Dil sözdizimi (örneğin. prosedür, form ifadelerini çağırır; ifade içindeki bir prosedür çağrısını kullanamazsınız, fonksiyon çağrıları ifadeleri oluşturmaz, bunları diğer ifadelerde kullanmanız gerekir). Bu nedenle, Pascal yetiştirilmiş programcılar bunlar arasında farklılık gösterir.

C benzeri dillerde ve diğer birçok çağdaş dilde bu ayrım ortadan kalkıyor; Statik olarak yazılmış dillerde, prosedürler sadece komik bir dönüş türüne sahip fonksiyonlardır. Bu muhtemelen birbirlerinin yerine kullanılmasının nedeni budur.

İşlevsel dillerde, genellikle prosedür diye bir şey yoktur - her şey bir işlevdir.

37
jpalecek

C'deki örnek:

// function
int square( int n ) {
   return n * n;
}

// procedure
void display( int n ) {
   printf( "The value is %d", n );
}

C Standardının prosedürlerden bahsetmediğine dikkat etmelisiniz, sadece fonksiyonlar.

15
anon

Genel olarak, bir prosedür bir talimat dizisidir.
Bir işlev aynı olabilir, ancak genellikle bir sonuç verir.

11
HS.

subroutine veya subprogram terimi farklı yerlerden çağrılabilen parametreli bir kod parçasını ifade eder.

İşlevler ve prosedürler bunların uygulamalarıdır. Genelde işlevler dönüş değerleri ve prosedürler hiçbir şey döndürmez.

10
sharptooth

Temel farklılıklar

  • Bir İşlev bir değer döndürmelidir, ancak Saklı Prosedürlerde bu isteğe bağlıdır: bir işlem 0 veya n değerlerini döndürür.
  • İşlevler sadece bunun için giriş parametrelerine sahipken, prosedürler giriş/çıkış parametrelerine sahip olabilir.
  • Bir Fonksiyon için bir giriş parametresi almak zorunludur, ancak bir Kayıtlı Prosedür 0 ila n giriş parametreleri alabilir.
  • İşlevler bir Prosedürden çağrılabilir, Prosedürler bir İşlev'den çağrılamaz.

Gelişmiş Farklılıklar

  • İstisnalar, bir Prosedürdeki try-catch blokları tarafından gerçekleştirilebilir, oysa bir catch-catch bloğu bir İşlevde kullanılamaz.
  • İşlem Yönetimi'ne bir Prosedürde gidebiliriz, oysa bir Fonksiyonda yapamayız.

SQL'de:

  • Bir Prosedür, SELECT ve DML (INSERT, UPDATE, DELETE) ifadelerine izin verirken, İşlev yalnızca içinde SELECT ifadesine izin verir.
  • İşlemler, SELECT ifadesinde kullanılamaz, oysa İşlevler bir SELECT ifadesinde gömülebilir.
  • Saklı yordamlar, bir WHERE (veya bir HAVING veya bir SELECT) bloğundaki SQL ifadelerinde kullanılamaz, oysa İşlevler kullanılabilir.
  • Tabloları döndüren işlevler başka bir Rowset olarak değerlendirilebilir. Bu, diğer tablolarla birlikte JOIN bloğunda kullanılabilir.
  • Satır içi İşlevler, parametreleri alan görünümler olarak düşünülebilir ve JOIN bloklarında ve diğer Satır kümesi işlemlerinde kullanılabilir.
6
Mudassar Shahbaz

İç prosedürde DML (Insert/Update/Delete) deyimlerini kullanabiliriz, ancak Inside işlevinde DML deyimlerini kullanamayız.

Prosedür her iki girdi\çıktı parametresine sahip olabilir, ancak İşlev yalnızca girdi parametresine sahip olabilir.

Try-Catch Block'i ​​Saklı Prosedürde kullanabiliriz, ancak İşlevinde Try-Catch bloğunu kullanamıyoruz.

Select deyiminde Saklı Prosedürü kullanamayız, fakat Fonksiyonda Select deyiminde kullanabiliriz.

Saklı Prosedür 0 veya n değerini (en fazla 1024) verebilir, ancak İşlev zorunlu olan sadece 1 değeri döndürür.

Saklı yordam işlevden çağrılamaz, ancak saklı yordam işlevini çağırabiliriz.

İşlemi Saklı Prosedürde kullanabiliriz, ancak işlevde işlemi kullanamayız.

Sql deyimindeki Saklı Prosedürü Where/Having/select bölümünde hiçbir yerde kullanamayız, Ama fonksiyonunda kullanabiliriz.

Saklı Prosedüre katılamıyoruz, ancak fonksiyona katılabiliriz.

daha fazlası için buraya tıklayın ... http://dotnet-developers-cafe.blogspot.in/2013/08/difference-between-stored-procedure-and.html

5
Mukesh Kumar

Daha kesin olarak, bir f işlevi, eğer x = y ise f(x) = f(y), yani aynı sonuc zaman aynı argümanla çağrılır (ve böylece sistemin durumunu değiştirmez.)

Böylece, Rand () veya print ("Merhaba"), vb. İşlevler değil prosedürlerdir. Sqrt (2.0) bir fonksiyon olsa da: ne kadar sık ​​çağırırsa çalsın gözlemlenemeyen bir etki ya da durum değişikliği yoktur ve her zaman 1.41 ve bir miktar döndürür.

5
Ingo

Çoğu bağlamda: bir işlev bir değer döndürür, işlem yapmaz. Her ikisi de aynı şeyi yapmak için birlikte gruplanmış kod parçalarıdır.

İşlevsel programlama bağlamında (tüm işlevlerin değer döndürdüğü), işlev soyut bir nesnedir:

f(x)=(1+x)
g(x)=.5*(2+x/2)

Burada, f, g ile aynı işlevdir, ancak farklı bir işlemdir.

3
xtofl

Burada dille agnostiksek prosedür, genellikle kesin ve güvenilir bir şekilde kesin sonuç elde etmek için gereken bir dizi eylemi belirtir. Yani, bir prosedür temelde bir algoritmadır.

İşlevler, diğer taraftan, daha büyük bir programdaki biraz bağımsız bir kod parçasıdır. Başka bir deyişle, fonksiyon bir prosedürün uygulanmasıdır.

3
Anton Gogolev

Bir fonksiyon bir değer döndürür ve bir prosedür sadece komutları çalıştırır.

İsim fonksiyonu matematikten gelir. Girdiye dayalı bir değeri hesaplamak için kullanılır.

Bir prosedür, sırayla çalıştırılabilecek bir komut setidir.

Çoğu programlama dilinde, fonksiyonların bile bir takım komutları olabilir. Bu nedenle fark, yalnızca bir değer parçasını geri getirme yönündedir.

Ancak bir işlevi temiz tutmak istiyorsanız (yalnızca işlevsel dillere bakın), bir işlevin yan etkisi olmadığından emin olmanız gerekir.

2
OWOEYE GBENGA

Bu cevapların çoğunda tekrar tekrar görmeye devam ettiğim bir şeye itiraz ediyorum, bir işlevi işlev yapan şey bir değer döndürmesidir.

İşlev, yalnızca değer döndüren eski bir yöntem değildir. Öyle değil: Bir yöntemin gerçek bir işlev olması için her zaman belirli bir girdi verilen aynı değeri döndürmesi gerekir. İşlev olmayan bir yönteme örnek, çoğu dilde random yöntemidir, çünkü bir değer döndürse de, değer her zaman aynı değildir.

Bu nedenle, bir işlev bir haritaya daha çok benzemektedir (örneğin, tek boyutlu bir işlev için x -> x'). Bu, normal metotlar ve fonksiyonlar arasında çok önemli bir ayrımdır, çünkü gerçek fonksiyonlarla uğraşırken zamanlama ve değerlendirildikleri sıra hiçbir zaman, nerede olduğu ve hiçbir zaman fonksiyonsuz olduğu durumun hiçbir önemi olmamalıdır.

İşte bu bir fonksiyon olmayan fakat başka bir şekilde bir değer döndürecek başka bir metod örneği.

// The following is pseudo code:
g(x) = {
  if (morning()) {
     g = 2 * x;
  }
  else {
   g = x;
  }
  return g;
}

Ayrıca prosedürlerin değer getirmediği fikrine itiraz ediyorum. Bir prosedür, bir işlev veya yöntem hakkında konuşmanın sadece belirli bir yoludur. Bu, prosedürünüzün tanımladığı veya uyguladığı temel metot bir değer verirse, o prosedürün bir değer verdiğini tahmin edin. Örneğin SICP 'den aşağıdaki pasajı alın:

// We can immediately translate this definition into a recursive procedure 
// for computing Fibonacci numbers:

(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))

Son zamanlarda özyinelemeli prosedürleri duydunuz mu? Özyinelemeli bir işlevden (gerçek bir işlev) bahsediyorlar ve bir değer döndürüyorlar ve "yordam" kelimesini kullanıyorlar. Öyleyse fark nedir?

Bir işlevi düşünmenin bir başka yolu (yukarıda belirtilen anlamın yanı sıra) sayı 1 gibi bir idealin soyut bir temsilidir. Bir prosedür bu şeyin gerçek uygulamasıdır. Şahsen onların birbirlerinin yerine geçebileceğini düşünüyorum.

(Verdiğim bağlantıdan bu bölümü okursanız, kavramak için daha zor bir kavramın bir işlev ile bir işlem arasındaki fark olmadığını, bir işlem ile bir işlem olduğunu fark edebilirsiniz. yinelemeli süreç?)

Prosedürler için bir analog tariflerdir. Örneğin; Diyelim ki make-pies adlı bir makineniz var, bu makine (fruit, milk, flower, eggs, sugar, heat) içeriyor ve bu makine bir pie döndürüyor.

Bu makinenin bir temsili gibi görünebilir

make-pies (fruit, milk, flower, eggs, sugar, heat) = {
   return (heat (add fruit (mix eggs flower milk)))
}

Tabii ki turta yapmanın tek yolu bu değil.

Bu durumda şunu görebiliriz:

A       function     is to a     machine
as a    procedure    is to a     recipe
as      attributes   are to      ingredients
as      output       is to       product

Bu benzetme tamam ama bilgisayar programı ile uğraşırken her şeyin bir soyutlama olduğunu göz önüne aldığınızda bozuluyor. Bu yüzden, bir makineye verilen tarifin aksine, biz kendi soyutlamaları olan iki şeyi karşılaştırıyoruz; aynı şey olabilir gibi iki şey. Ben de onların (niyet ve amaçlar için) aynı şey olduğunu düşünüyorum.

1
dkinzer

İşlev bir sql ifadesinde kullanılabilir, yordam bir sql ifadesinde kullanılamaz.

Ekle, Güncelle ve Oluştur ifadeleri fonksiyona dahil edilemez, ancak bir prosedürde bu ifadeler bulunabilir.

Prosedür işlemleri destekler ancak fonksiyonlar işlemleri desteklemez.

İşlev bir ve yalnızca bir değer döndürmek zorundadır (başka bir OUT değişkeni tarafından döndürülebilir), ancak işlem birçok veri kümesi ve dönüş değeri döndürür.

Hem işlevlerin hem de prosedürlerin yürütme planları önbelleğe alınır, bu nedenle performans her iki durumda da aynıdır.

1
pulak

db bağlamında: Saklı yordam, önceden derlenmiş işlevlerin olmadığı yürütme planıdır.

0
Awais

С #/Java açısından, function, belirli bir değer döndüren kod bloğudur, ancak prosedür, döndüren kod bloğudur void = (hiçbir şey). C #/Java'da hem fonksiyonlar hem de prosedürler daha sık sadece Methods olarak adlandırılır.

    //This is a function
    public DateTime GetCurrentDate()
    {
        return DateTime.Now.Date;
    }

    //This is a procedure(always return void)
    public void LogMessage()
    {
        Console.WriteLine("Just an example message.");
    }
0
user2771704