Basit bir soru, ama sık sık, bu tür vahşet ile tanımlanan, ancak yıllar boyunca farklı şeyler ifade ettiğim bilinen bu üç terimi duyuyorum.
"Prosedürler", "Yöntemler", "İşlev", "Altprogramlar" vb. "Doğru" tanımları nelerdir?
Basit bir soru, ama sık sık, bu tür vahşet ile tanımlanan, ancak yıllar boyunca farklı şeyler ifade ettiğim bilinen bu üç terimi duyuyorum.
"Prosedürler", "Yöntemler", "İşlev", "Altprogramlar" vb. "Doğru" tanımları nelerdir?
Yanıtlar:
Burada farklı bir cevaba gidiyorum: pratik olarak konuşursak, gerçekten hiçbir fark yoktur , "metod" un genellikle OO dillerinde bir nesneyle ilişkili bir alt rutini ifade etmesiyle ilgili küçük bir istisna dışında .
"Prosedür, fonksiyon, alt program, alt program ve yöntem" terimlerinin tümü aynı anlama gelir: daha büyük bir programdaki çağrılabilir bir alt program. Ancak, bu terimlerin tüm değişken kullanımlarını yakalayan bir tanım bulmak zor, çünkü bunlar programlama dilleri veya paradigmalarda tutarlı bir şekilde kullanılmazlar.
Bir fonksiyonun bir değer döndürdüğünü söyleyebilirsiniz. Peki, aşağıdaki C işlevi bir değer döndürmez:
void f() { return; }
... ama buna prosedür diyecek birini bulacağınızdan şüpheliyim.
Elbette, Pascal'da prosedürler değerleri döndürmez ve fonksiyonlar değerleri döndürür, ancak bu sadece Pascal'ın nasıl tasarlandığının bir yansımasıdır. Fortran'da bir fonksiyon bir değer döndürür ve bir alt yordam birden çok değer döndürür. Ancak bunların hiçbiri gerçekten bu terimler için "evrensel" bir tanım bulmamıza izin vermiyor.
Aslında, "prosedürel programlama" terimi, C, Fortran ve Pascal da dahil olmak üzere bütün dilleri ifade eder; bunlardan sadece biri aslında "prosedür" terimini bir şey ifade etmek için kullanır.
Yani bunların hiçbiri gerçekten tutarlı değil. Bunun tek istisnası, muhtemelen, neredeyse tamamen OO dilleriyle kullanılmış gibi görünen, bir nesneyle ilişkili bir işleve işaret eden "yöntem" dir. Buna rağmen, bu bile her zaman tutarlı değildir. Örneğin, C ++, genellikle yöntem yerine "üye işlevi" terimini kullanır ("yöntem" terimi, programcılar arasında yerel C ++ 'a çarptıysa bile).
Mesele şu ki, bunların hiçbiri gerçekten tutarlı değil. Bu, o dönemde hangi dilde olursa olsun kullanılan terimleri yansıtıyor.
Bir işlev bir değer döndürür, ancak işlem yapmaz
Bir yöntem, bir işlevine benzer, ama iç bir sınıfın bir parçası. Terimi, bir yöntem , nesne yönelimli programlama hemen hemen sadece kullanılmaktadır.
function
her iki rolü de yerine getiren kesinlikle doğrudur , ancak JS işlevleri tüm dönüşü gerçekleştirir. Bir return ifadesinin değeri yoktur, değer örtüktür undefined
. Bir return ifadesi olmadığında, yorumlayıcı örtük bir return ifadesi ekler. Ezoterik, belki, ama burada verilen tanımla tutarlıdır. Bu yüzden var x = function() {}();
JS'de yasaldır; Örtük getiriler için değilse, bunun Pascal'da olduğu gibi bir hata olması gerekir.
Bir fonksiyon girdilerin bir demet alır ve bir veya daha fazla değer döndüren bir şeydir. Döndürülen değerler tamamen girdiler tarafından belirlenirse ve işlevin herhangi bir yan etkisi yoksa (günlüğe kaydetme, belki de kendi dışında durum değişikliklerine neden olma), o zaman saf işlev olarak adlandırılır.
Bir prosedür, bir değer dönmez bir fonksiyonudur. Özellikle bu, bir prosedürün yalnızca yan etkilere neden olabileceği anlamına gelir. (Bu, bir giriş parametresinin mutasyona uğramasını içerebilir!)
Bir yöntem , bir dizi değişken üzerinde kapanan, yani bir kapanma fonksiyonudur . Sıfır veya daha fazla giriş parametresi alır, bu değişken grubuna erişebilir 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 dilinde, bu kapalı değişkenler bir nesnenin üye alanları veya örnek değişkenleri olarak adlandırılır. Bir yöntem saf bir işlev, saf bir işlev veya bir işlem olabilir.
İkinci tanım nesne = struct + kapanış yazışmalarına yol açar .
foo.doSomething()
parametresiz değil. foo
Bazı sözdizimsel şeker ile verilen bir parametreye (nesne ) sahiptir. Bir kapatma, böyle bir parametreye ihtiyaç duymadan nesnesine başvurabilir. Bu, yöntemlerin kapanış olamayacağı anlamına gelmez , sadece çoğunun yapılmayacağını ve OO olmanın bir dili kapatmaları desteklemek için yeterli olmadığını söylemez .
foo.doSomething()
foo
değişkeni kapatır . İçindeki herhangi bir ifade , diline bağlı olarak veya içinden doSomething
erişebilir . Bu "yakından" nin tanımıdır. Sınıflar, üye değişkenleri üzerine yaklaşırlar, bu nedenle ("OO nedir" dikkate alınmazsa), OO yeterlidir. Bu literatürde oldukça iyi bilinmektedir ...foo
this
self
foo.
önünde foo.doSomething()
? Bu doSomething()
bir parametreyi geçiyorsun. Sadece parantez arasında olmadığı için parametre olmadığı anlamına gelmez. this
Ya da self
yöntem içinde bu parametre referans için sadece sözdizimsel şeker.
Bruce'un iyi bir cevabı var . Anlamsal olarak ekleyeceğim:
printf
).A procedure should "do something" to the arguments
- veya başka bir yan etkiye neden olabilir (örn. printf
).
printf
Bir değer döndüren not - yazdırılan karakter sayısı - bu yüzden teknik olarak bir fonksiyondur.
printf
bir değer olduğu konusunda hemfikir değilim . Çalıştırma kapsamı dışında belirli bir yan etkiye sahipti: standart çıktının ne olması gerektiğine göre I / O. Buna rağmen, Scott bu ayrımdan açık değildi, ancak işlevsel programlama işlevlerinde yan etkilerin olmadığı ve döndüğü veriye sahipmiş gibi soruları yanıtlayabilmesi gerekiyordu.
yukarıdaki iyi ayrıntılı cevaplar; Kısa hikaye şu ki, tüm alt programların lezzetleri olacak; Her bir terimin kastedilen, programlama dili bağlamına göre değişecektir.
genel olarak, işlevler bir değer döndürür, ancak buna gerek yoktur
yöntemler şu anda genel bir OOP terimleridir .
SQL'de, saklı yordamların çıktıları vardır, ancak genellikle yalnızca bir hata kodu döndürür, kullanıcı tanımlı işlevler bir değer döndürmelidir (sonuç olarak belirlenmiş olabilir)
Yine, bu terimler arasındaki kesin fark, kiminle konuştuğunuza bağlıdır!
Yeterliliğin% 80'i doğrudan isimlendirme konusundaki aşinalık ile ilgilidir,
Verimliliğin% 95'i, tarif etmek için kullanılan terimlere rağmen, şu anda neyin yararlı olduğunu belirleme yeteneğidir.
Sproc'lara sahip olduğumuz MSSQL kullandığım zamanlar haricinde tüm yöntemleri c # olarak adlandırmayı tercih ediyorum ama elbette şimdi Postgres kullanıyoruz ve bunlara fonksiyon deniyor.