it-swarm.dev

Yöntem ve İşlev ve Prosedür

Basit bir soru, ama sık sık böyle bir vahşetle tanımlanan, ancak yıllar boyunca farklı şeyler ifade ettiği bilinen bu üç terimi duyuyorum.

"Prosedürler", "Yöntemler", "Fonksiyon", "Alt rutinler", vb. "Doğru" tanımları nelerdir?

113
Django Reinhardt

Burada farklı bir cevap ile gidiyorum: pratik olarak konuşursak, gerçekten hiçbir fark yoktur, "yöntem" genellikle , bir nesne ile ilişkili OO dilde) bir alt rutini ifade eder.

"Prosedür, fonksiyon, altyordam, altprogram ve yöntem" terimlerinin hepsi aynı anlama gelir: daha büyük bir programdaki çağrılabilir bir alt program. Ancak, bu terimlerin tüm varyant kullanımlarını yakalayan bir tanım bulmak zordur, çünkü bunlar programlama dilleri veya paradigmaları arasında sürekli olarak kullanılmazlar.

Bir işlevin bir değer döndürdüğünü söyleyebilirsiniz. Aşağıdaki C işlevi bir değer döndürmüyor:

void f() { return; }

... ama buna prosedür diyecek birini bulacağınızdan şüpheliyim.

Elbette, Pascal'da prosedürler değerleri döndürmez ve işlevler değerleri döndürür, ancak bu yalnızca Pascal'ın nasıl tasarlandığının bir yansımasıdır. Fortran'da bir işlev bir değer döndürür ve bir alt yordam birden çok değer döndürür. Ancak bunların hiçbiri, bu terimler için "evrensel" bir tanım bulmamıza izin vermez.

Aslında, "prosedürel programlama" terimi, C, Fortran ve Pascal da dahil olmak üzere sadece bir dil anlamında "prosedür" terimini kullanan bir dil sınıfını ifade eder.

Yani bunların hiçbiri gerçekten tutarlı değil. Tek istisna, büyük olasılıkla neredeyse tamamen OO dilleri, bir nesne ile ilişkili bir işleve atıfta bulunarak kullanılmış gibi görünmektedir), ancak bu bile her zaman tutarlı değildir. örneğin, genellikle yöntem yerine "üye işlevi" terimini kullanır ("yöntem" terimi, programcılar arasında C++ diline girmiş olsa da).

Mesele şu ki, bunların hiçbiri gerçekten tutarlı değil. O zamanlar hangi dillerdeki diller tarafından kullanılan terminolojiyi yansıtır.

109
Charles Salvia

A işlev bir değer döndürür, ancak bir yordam döndürmez.

A yöntem bir işleve benzer, ancak dahili sınıfın bir parçası. yöntem terimi neredeyse tamamen nesne yönelimli programlamada kullanılır.

69
Bruce Alderman

A function, bir grup girdi alan ve bir veya daha fazla değer döndüren bir şeydir. Döndürülen değerler tamamen girişler tarafından belirlenirse ve işlevin herhangi bir yan etkisi yoksa (belki de günlüğe kaydetme veya durumun kendisinin dışında değişikliklere neden olması), buna saf işlev denir.

A prosedür, değer döndürmeyen bir işlevdir. Özellikle, bu bir prosedürün sadece yan etkilere neden olabileceği anlamına gelir. (Bu bir giriş parametresinin değiştirilmesini içerebilir!)

A yöntem, bir değişken kümesini kapatan bir işlevdir, yani, kapatma. Sıfır veya daha fazla giriş parametresi alır, bu değişken grubuna erişimi vardır ve sıfır veya daha fazla değer döndürür. OO dillerinde bu yöntemler nesnelere veya sınıflara eklenir.

Çoğu ana akım OO dilde, bu kapalı değişkenler bir nesnenin üye alanları veya örnek değişkenleri olarak adlandırılır.

İkinci tanım object = struct + closures yazışmasına yol açar.

53
Frank Shearar

Bruce'un iyi bir cevabı vardır. Semantik olarak şunu eklerdim:

  • Bir yordam, bağımsız değişkenlere "bir şeyler" yapmalı veya başka bir yan etkiye neden olmalıdır (örn. printf)
  • Bir işlev (a) bağımsız değişkenlerle ilgili bir soruyu yanıtlamalı veya (b) bağımsız değişkenlere dayalı yeni bir değer hesaplamalıdır
  • Bir işlev yöntemi nesnenin durumu hakkında bir soruyu cevaplamalıdır
  • Bir yordam yöntemi nesnenin durumunu değiştirmelidir
14
Scott Whitlock

yukarıdaki iyi ayrıntılı cevaplar; kısa öykü, bunların hepsinin altyordam lezzetleri olacağıdır; her terim ile kastedilen, programlama dili bağlamına göre değişir

genel olarak işlevler bir değer döndürür, ancak

yöntemler genel bir OOP terimler şu anda

sQL'de, saklı yordamların çıktıları vardır, ancak genellikle yalnızca bir hata kodu döndürürken, kullanıcı tanımlı işlevler bir değer döndürmelidir (sonuç kümesi olabilir)

yine, bu terimler arasındaki kesin fark kiminle konuştuğunuza bağlıdır!

4
Steven A. Lowe

Yeterliliğin% 80'i doğrudan isimlendirmeye aşinalıkla ilgilidir,

Üretkenliğin% 95'i, onu tanımlamak için kullanılan terimlere rağmen şu anda neyin yararlı olduğunu belirleme yeteneğidir.

Ben hemen hemen MSCQL kullandığımızda geri sproc's vardı, ama elbette şimdi Postgres kullanın ve işlevler olarak adlandırılır dışında c # tüm yöntemleri çağırmayı tercih ederim.

2
MvcCmsJon