Prosedürel programlama tam olarak nedir? OOP'tan tam olarak ne kadar farklı? İşlevsel programlama ile aynı mıdır?


32

Java'da nesne yönelimli (OO) tarzında programlama yapıyorum . OOP bana sezgisel olarak geliyor, fakat diğer programlama türleri hakkında çok az bilgim var.

Prosedürel programlama tam olarak nedir ? OOP'tan tam olarak ne kadar farklı? İşlevsel programlama ile aynı şey mi?

OO olmayan tüm programlamanın prosedürel olduğunu düşünürdüm. Ama bunun doğru olmadığını düşünmeye başladım.


9
Araştırmanızı paylaşmak herkese yardımcı olur. Bize ne denediğinizi ve neden ihtiyaçlarınızı karşılamadığını söyleyin. Bu, kendinize yardım etmek için zaman harcadığınızı, bariz cevapları tekrar etmemizi önlediğini ve hepsinden daha belirgin ve alakalı bir cevap almanıza yardımcı olduğunu gösteriyor. Ayrıca bkz. Nasıl
Sorulur

2
İşlemsel programlama, işlevsel programlama ile aynı şey değildir; Aslında bu aslında nesne yönelimli programlama ile aynı şeyleri eksi nesneler ve sınıflar.
Mason Wheeler

1
Emir OOP aslında olduğunu o yüzden ... Bunu her zaman tam olarak ne yaptığını, prosedürel programlama
Ingo

Yanıtlar:


68

Wikipedia'nın bu şartlar için iyi açıklamaları var. Ne olursa olsun, işte özeti:

  • Zorunlu programlama modellerideğişken durumları değiştiren ifadelerin bir sırası olarak hesaplanır.
  • Prosedürel programlama , kodu alt programlara ayıran zorunlu programlamadır.
  • Yapılandırılmış programlama , rasgele atlamaları (örneğin, gitmeyi) ve küresel durum değişikliklerini yasaklayan prosedürel programlamaya daha disiplinli bir yaklaşımdır.

  • Bildirimsel programlama , zorunlu programlamanın zıttıdır - nasıl yapılmasından ziyade neyin hesaplanacağını belirler (örneğin, SQL, regexes).

  • İşlevsel programlama modelleri, değerleri değer veren ifadeler olarak hesaplar. İşlevler değerlerdir ve diğer işlevlere iletilebilir veya bunlardan döndürülebilir. Mutasyon önerilmez. tüm değişkenler varsayılan olarak değişmezdir. Sonuç olarak, zorunlu olmaktan çok daha açıklayıcıdır, çünkü elde etmek için gereken durum değişikliği dizisi yerine hesaplananın ne olduğunu vurgulamaktadır.

  • Tamamen işlevsel programlama mutasyona tamamen izin vermez (popüler inancın aksine hala yan etkilere ulaşmak için mekanizmalar vardır).
  • Toplam fonksiyonel programlama ayrıca istisnaları ve sonsuz döngüyü yasaklar. (Matematiğin toplam işlevi, tüm girdileriiçin bir değer döndüren bir işlevdir.)

İlişkileri biraz karışık çünkü OOP oldukça yüklü bir terim. Nesneleri hem işlevsel dillerde hem de yordamsal dillerde kullanabilirsiniz, ancak kendilerini OO olarak ilan eden diller yordamsaldır. Sorunu daha da karıştırmak için:

  • Çoğu insan bir nesne ile soyut bir veri türü arasındaki farkı bilmez .
  • Mainstream OOP dilleri ADT'lerden söz etmez, onlar için çok zayıf destek sağlar ve nesneleri Tek Doğru Yol olarak sunar.
  • Kimse Soyut Veri Tipine Yönelik Programlama demez (çünkü yapılacak aptalca bir şey; hem ADT'lere hem de nesnelere ihtiyacınız var.)

Bu, insanların OOP'nin soyutlamayı elde etmenin tek yolu olduğunu düşünmesine neden olur ve işlevsel programlama ve OOP bir şekilde karşıt ya da karşılıklı olarak münhasırdır. Pek çok insan, tüm fonksiyonel dillerin saf olduğunu ve mutasyona izin vermediğini düşünüyor.

Ek olarak, insanlar genellikle zorunlu / yordamsal olarak birbirlerinin yerine geçer, bazen OOP ile karşılaştırır (soyutlamadan az kod, genellikle C) ve bazen de işlevsel programlama ile karşılaştırırlar. Yapısal programlama terimi , söyleyebildiğim kadarıyla çoğunlukla kullanımdan düştü (muhtemelen bu noktada çoğu insan, goto ve kürenin zararlı olduğu düşüncesini aldı.)


3
"sıçramaları yasaklar" oldukça geneldir; Bu, eğer / while / etc .. belki de "Keyfi atlamaları yasaklar" dır?
Izkata

@ Izkata İyi nokta, değişti.
Doval

1
Bu aslında wikipedia kayıtlarına bağlanmaya değebilir.
haylem

Bu yüzden Nesne "Yönelimli" olarak adlandırılır ve Yalnızca Nesne değil.
JeffO,

1
@OrangeDog nasıl soyut veri türü ile ilgili herhangi bir farklı da üzerinde hareket edebilir veri ve fonksiyon kapsüllenmiş seti tanımlar? Dahası, değişmez nesnelere sahip olabilirsiniz, bu durumda hangi durumda ?
Doval,

12

Prosedürel Programlama, diğer birçok dil tasarımında temel yapı taşlarından biri olan programlamaya (işlevsel olmamak) bir yaklaşımdır.

Çoğu dil “Prosedürel Programlama” kümesine girer ve çoğu insan için muhtemelen en doğal tasarım yaklaşımıdır (OO açısından düşünüyorsanız, o zaman azınlıkta olduğunuzu söyleyebilirim).

TEMEL prosedürdür.

Diğerlerinin de söylediği gibi, programların sıralı bir şekilde yapılandırılması için bir mekanizmadır.

  • İlk önce x yapıyorum
  • İkincisi ben y
  • Üçüncüsü Z yapıyorum

"Prosedürleri" tanımlamak için bir mekanizma gerektirir - OO yöntemlerine benzer adlandırılmış kod blokları, sıfıra birçok parametreyi kabul edebilir ve isteğe bağlı olarak bir değer döndürür (daha sonra genellikle bir işlev olarak adlandırılır - muhtemelen işlevsel dillerle karıştırmanıza neden olur) )

Paradigma, yapacağınız şeylerin ne olduğunu ya da etrafta geçirilenlerin biçimini belirlemez.

Basitçe, programın sıralı bir şekilde çalışan bir dizi prosedür (veya işlev) olarak yapılandırılacağını açıklar. Veriler daha sonra prosedürlerden bağımsız olarak tanımlanır.

Bu, programı veri toplayan veri toplama yöntemleri ve işlevler (işlevler değil) etrafında yapılandıran nesne yönelimli programlamadan farklıdır.

Bunu düşünmenin bir yolu veri kapsamıdır.

Bir prosedürel dilde kapsam belirleme oldukça basittir. Bir değişken, iç içe geçmiş kapsamları olan, en çok aranan şeyleri (genel olarak ilan edilir) seviyesine kadar (yerel olarak ilan edilir) verilen bir prosedür kapsamında olabilir.

Nesne yönelimli bir dilde, şu anda kullanımda olan ve yukarıdakilere dikey olan nesneyi içeren yeni bir kapsam belirleme bağlamı eklersiniz.

Prosedürel olarak düşünmenin bir başka yolu da, nesne yönelimli ile karşılaştırıldığında, tüm yöntemlerin statik olarak bildirilmesi gereken nesne yönelimli bir dili göz önünde bulundurmaktır . Sonuç, sınıfların prosedürleri birlikte gruplamak için kullanılabilecekleri bir prosedür dilidir.


5

Prosedürel Programlama kesinlikle işlevsel programlama değildir.

Prosedürel programlama, kafanızda bir makine olarak bilgisayarın bir modeline sahip olduğunuzda ve bellekteki verileri nasıl değiştirdiğini düşünüyorsunuz. Yani önce A3 değerine ayarladınız , sonra 1 ekleyiniz ve Atekrar hafızaya koydunuz (önceki değerin üzerine yazınız ).

İşlevsel programlama A3'tür ve Bolur A + 1ve ardından bilgisayarın nasıl hesaplanacağını bulmasını sağlar B. Eğer tanımladıktan sonra Abunu gerektiği değişmez olması (non-değiştirme). İşlevsel, bir işlevi birinci sınıf değer olarak geçirme gibi bir şey yapmanıza da izin verir (işlev, işlevi bir argüman olarak alabilir).

Nesneye yönelik programlama genellikle her ikisini de birleştirir ve her ikisine de dikey olan bir türdür. İşlevsel programlamayı kullanabilir ve değişmez bir nesneyi geri döndürebilirsiniz ve bu nesnenin hesaplanan değeri döndüren bir yöntemi olabilir ve hatta bunu tembel olarak yapabilirsiniz - bu işlevsel nesne yönelimli programlamadır. Ayrıca bir "depo" yu temsil eden bir nesneye sahip olabilirsiniz (bir veritabanının soyut versiyonu) ve depodaki öğeleri "kaydedebilir" ve "geri al" öğelerini geri alabilirsiniz ve bu nesnenin nasıl yapıldığının tüm ayrıntılarını ele almasına izin verebilirsiniz . Bu temelde nesne yönelimli prosedürel programlama.


0

OOP, yine daha büyük zorunlu programlama ailesine ait olan, biraz rafine edilmiş bir prosedürel programlama biçiminden başka bir şey değildir. Bu iddianın kanıtı, birçok C # / Java programcısının "bir şeyler yapma" eğiliminde olduğu ve aşağıdaki gibi yöntemleri tercih ettiğidir:

void doThisAndThat(....) { ... do something ... }

Bu nedenle, bir grup geçersiz yöntemden (eski adıyla prosedür (sic!)) Bilinen ve aşağıdaki gibi kodlardan oluşan bir program :

doThis();
if (state is that) doSomethingElse();
doThat();

mükemmel bir prosedürel programlamadır.


doThisAndThat (....), bir yöntemin genelde iyi bir uygulama olmayan birden fazla şey yapacağını belirtir. Java ve C # geliştiricileri çoğunlukla Tek Sorumluluk İlkesine bağlı kalmaktadır. Bence analojiniz hatalı. objectmentor.com/resources/articles/srp.pdf
JohnK

@JohnK Bunun iyi bir uygulama olmadığını biliyorum. Oysa sıradan biri. Özellikle Java geliştiricileri arasında, biri her gün SO'da gördükleriyle karar verebilir.
Ingo

@JohnK Java ve C # geliştiricileri çoğunlukla Tek Sorumluluk İlkesi - Dudak servisine bağlı kalıyor mu?
Ingo

Java geliştiricileri çoğunlukla Tek Sorumluluk'a uyuyor mu? Keşke bu gerçek hayatta doğru olsaydı ...
Sridhar Sarnobat
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.