Prosedürel Programlama Nedir?

Bu yazıda prosedürel programlamanın temel özellikleri, avantaj ve dezavantajları, nesne yönelimli programlama ile farklarından bahsettim. Ayrıca prosedürel programlama nedir, prosedürel programlamanın avantajları nedir gibi soruları; bir uzman gibi değil, ilk duyduğumda kendime nasıl anlatılmasını isterdiysem o şekilde anlatmaya çalıştım.

Tanım: Prosedürel programlama nedir?

Prosedürel programlama, yeni başlamış birinin ilk öğrenmesi gereken programlama paradigmalarından birisidir. Paradigma kelimesi bu konularda çok geçtiği için aşina olmanız için kullandım biraz havalı bir kelime olup model veya yerine göre tarz anlamına gelmekte. Bu programlama tarzı, veri ile fonksiyonları tamamen birbirinden ayırmaya yöneliktir. Basitçe, prosedürel bir program çalıştığı cihaza bir görevi adım adım nasıl bitireceğini söyler. Bu model yukarıdan aşağıya, lineer bir hiyerarşi içerisindedir ve tanımlanan fonksiyonları veri kirliliğinden arındırmayı hedefler. Bu programlama modelinde fonksiyonel programlamanın aksine sıralama önemlidir.

Örnek: Prosedürel programlama neye benzer?

Aşağıda çok çok basit bir prosedürel program örneği gösterdim:

/*toplaminKaresi() fonksiyonunda kullanılmak üzere, öncelikle toplama() fonksiyonu tanımlanır.*/
int toplama( int a, int b ){
  return a + b;
}
int toplaminKaresi(int a, int b){
  int c = toplama(a, b) * toplama(a, b);
  return c;
}

int main(void){
  int a = 3,
      b = 4;
  int c = toplaminKaresi(a, b);
  return 0;
}

Burada görüldüğü üzere, değişkenler bir fonksiyonun içerisinde değil , fonksiyona girdi olacak şekilde lokal olarak deklare edilmiş durumda. Bunu belki üçüncü kod bloğunu görünce daha iyi anlayacaksınız. Sonuç olarak toplaminKaresi() fonksiyonu kullanılarak tek bir fonksiyon çağrısı ile a ve b değişkenlerinin toplamının karesi alınmış olur. Mesela toplaminKaresininKaresi() şeklinde bir fonksiyona ihtiyaç duyulduğunda şöyle bir şey yapılabilir:

int toplaminKaresininKaresi(int a, int b){
  int c = toplaminKaresi(a, b) * toplaminKaresi(a, b);
  return c;
}

Bu şekilde örneğin, her bir işin üstesinden gelebilen birer fonksiyon yazıp bunları iyi bir hiyerarşiye oturtursanız, istediğiniz zaman, istediğiniz adımdaki bir fonksiyonu çağırıp kullanabilecek prosedürel bir program yazmış olursunuz. Yani istediğiniz zaman toplama yapabileceğiniz gibi, istediğiniz zaman toplamanin küpünü de, fazla zahmete girmeden hazır fonksiyonunuzla hesaplayabilirsiniz.

Aynı fonksiyonun prosedürel modele uygun olmayan örneğini de basit bir şekilde verelim:

int AveBtoplami(){
  const int a = 3,
            b = 4;
  return a + b;
}

Bu örnekte, AveBtoplami() fonksiyonu a ve b‘yi girdi olarak almadığı için, sabit bir sonuç verecektir ve veri, yani a ve b, doğrudan fonksiyonun içerisinde tanımlandığı için prosedürel programlama modeline aykırıdır. Bu fonksiyon bir anlamda sonucu belli olan bir işlemdir, yani sabit bir sayı olduğunu varsayabiliriz, ki bunun da bahsettiğimiz programlama modelinde yeri yoktur.

Nesne yönelimli programlama ve fonksiyonel programlama ile farkları nelerdir?

Prosedürel programlama: Yukarıdan aşağı yaklaşımlı bir yapıya sahiptir. Bilgisayara adım adım ne yapacağını söylersiniz.

/*toplaminKaresi() fonksiyonunda kullanılmak üzere, öncelikle toplama() fonksiyonu tanımlanır.*/
int toplama( int a, int b ){
  return a + b;
}
int toplaminKaresi(int a, int b){
  int c = toplama(a, b) * toplama(a, b);
  return c;
}

int toplaminKaresininKaresi(int a, int b){
  int c = toplaminKaresi(a, b) * toplaminKaresi(a, b);
  return c;
}

int main(void){
  int a = 3,
      b = 4;
  int c = toplaminKaresininKaresi(a, b);
  return 0;
}

Fonksiyonel programlama: Verinin fonksiyondan fonksiyona aktarılmasıyla sonuç elde edilen programlama modelidir. Fonksiyona veri muamelesi yapılır, yani bir fonksiyonu bir diğerine parametre olarak sokabilirsiniz ve genel bir sonuç elde edersiniz.

int karesi(int a){
    return a * a;
}

int toplami(int a, int b){
    return a + b;
}

int a = 3,
    b = 4;
int AkareartiBkare = toplami(karesi(a), karesi(b));

Nesne yönelimli programlama: prosedürelin aksine metodları (fonksiyonları) ve özellikleri (değişkenleri) bir objeye enkapsüle etmeyi amaçlar. Buradaki objenin bir insan olduğunu varsayarsak; bu insanın bir ismi olabilir ve bu insan yürüyebilir. Bunu da şöyle gösterebiliriz:

 class insan{
public: 
    std::string isim;
    void yuru();
}