Nesneye yönelik programlamayı öğrenmeden önce neden Prosedürel programlama öğrenmeliyiz [kapalı]


10

Şu anda bir IT üniversitesinde dördüncü sınıftayım ve profesörümle bu konu hakkında konuştuğumda fikrimi reddediyor ve bana çok ağır bir eleştiri veriyor (üniversitemde C (ANSI) Programlama sınıfı - üniversitedeki 1. yılda) C ++ (2. yılda OOP sınıfında) ve diğerleri önce ...

Ama 13 yaşında ağabeyime benden önce Java ve başka hiçbir şey öğretilmedi. Şimdi, normal bir 2. sınıf öğrencisinin Java ile yapabileceği hemen hemen her şeyi yapabilir.

Profesyoneller için, neden önce prosedürel programlama öğretilmemiz gerektiğini düşündüğünüzü bilmek istiyorum.


8
Çünkü Assembler'ın nesnesi yok.

9
Bir hesap makinesinin nasıl kullanılacağını öğrenmeden önce neden düzgün bir şekilde hesaplamamız gerektiğini öğretmemiz gibi.

22
Çünkü nesne yönelimli tasarım kusurludur. Programlar, veriler üzerinde çalışan davranışlar topluluğudur. Nesneler genellikle gereksiz karmaşıklık getirir. "Program Nasıl Tasarlanır: Programlama ve Hesaplamaya Giriş".

8
Başka biri tarafından belirtildiği gibi, "Yeni programcıları OOP ile dikkatinizi dağıtmayın": prog21.dadgum.com/93.html - temelde OOP'un yeni programcılara temelleri öğretme yolunda gitmesi . Onlara aynı anda iki zor kavram öğretiyorsunuz.
John Ripley

7
@juxstapose - nesne yönelimli programlamanın gereksiz karmaşıklık getirdiğini söylemek, araçları tek bir çelik bloktan oymamız gerektiğini söylemek gibidir. Sadece benim fikrim.

Yanıtlar:


23

Hızlı özet:

  1. Çünkü gerçek dünyada, er ya da geç, prosedür koduyla çalışmak zorundasınız.

  2. Çünkü Yordamsal Diller, sadece bir alternatif olmak yerine Nesne Tabanlı Diller için bir uzantı veya bir giriş gibi çalışabilir.

  3. Cevap 2'yi tamamlayın. Çünkü OOP, Prosedürel Programlamadan daha karmaşık olduğundan, önce Prosedürel Programlamayı öğrenmek daha iyidir.

  4. Çünkü gerçek dünyada, programcılar sadece tek bir paradigma ile değil, AKA "çoklu-aradigm programlama" ile çalışmak ve sorunları çözmek için çeşitli yollar birleştirir.

  5. Çoğu programlama dili, tasarımcıları veya ortak geliştiricileri, tam tersi olsa bile, bir düzeyde, çok düzeyli.

  6. [YENİ] Prosedürel Programlama ile yaygın olarak karıştırılan ve karıştırılan Modüler Programlama, OOP'ye uygulanabilir. Bu nedenle soru "Nesneye yönelik programlamayı öğrenmeden önce neden Modüler programlamayı öğrenmeliyiz" şeklinde okunabilir.

Genişletilmiş Sondaj Açıklaması:

Nokta 1 çok açık, daha fazla açıklama değil.

Nokta 2, Sınıflar, Kalıtım, Polimorfizm, Arayüzler, vb ...

Nokta 3, Nesne Odaklı Pascal'ı öğrenmeden önce Yordam Pascal'ı kodluyorum, oraya vardığımda dedim ki: "bak, sınıflar küçük prosedür programları gibidir ... ... ve onların birbirleriyle konuşmasını sağlayabilirsiniz, havalı !!! ".

Aynı şeyi düz C'den C artıya giden insanlardan duydum.

Nokta 4, Çoğu zaman programcılar çeşitli programlama tekniklerini veya paradigmalarını veya bir sorunu çözmenin yollarını birleştirir. Fonksiyonel, Prosedür, OOP, mantıksal.

Java "Pure OO" bile söylediği kadar basit nesne programlama değildir.

"Yapısal Programlama" yerine "Prosedürel Programlama" diyen +1 puan. Veya Modüler Programlama. Bunlar önemlidir.

Bununla birlikte, çoğu zaman bu terimler toghether'ı öğretir ve birbirinin yerine kullanılır, değildir. Yapısal Programlama, sadece prosedürleri kullanmakla kalmayıp birçok kavram içerir ve bunlardan biri "Spagetti Code" gibi görünmemeye yönelik program yapmaktır.

Bugün, "Nesne Odaklı Spagetti Kodu" na benzeyen birkaç "saf" OO programı okudum, yani programcı OOP kullandı, ancak kodu bir karmaşaya benziyor.

Çoğu zaman, bir OO kodunu okuyabilir ve kodun açık ve düzenlenmiş olması nedeniyle programcının OOP'den önce Yapısal Programlama öğrendiğini söyleyebilirim.

Modüler Programlama için birkaç uygulama gördüm. C ++ ve PHP'de modül kullanmayan. *


18

Benzetmenin matematiğe benzer olacağını düşünürdüm. Önce bazı temel kavramları (toplama / çıkarma / ...) öğrenmeniz ve daha karmaşık konulara (cebir / matematik) geçmeniz gerekir. Yordamsal program çok doğrusaldır ve sözdizimini öğrenirken kontrol akışını kavramak daha kolaydır. OOP'un belki de daha karmaşık olduğu düşünülür, prosedür dillerinde kullanılan daha basit yapılara dayanır, ancak daha soyut ve anlaşılması daha zordur. C gibi dillerle başlamak sizi donanıma daha da yaklaştırır ve anlamanız gereken ancak Java / C # gibi dillerde gerçekten kullanmamanız gereken bellek ayırma ve işaretçilerle başa çıkmanızı sağlar. Birinci veya ikinci olmasına bakılmaksızın, okulda buna maruz kalmanın gerçek bir değeri vardır.

FWIW, sonunda değişmek zorunda. Okula başladığımda Pascal ve PL / 1'de öğrendik. İleri dil sınıfına kadar (bu benim tarihime kadar) C'ye ulaşamadık. Lisansüstü okula kadar Java almadım - henüz icat edilmemişti!


+1 - bu tür bir niyet paradoksu ... "daha soyut ve anlaşılması daha zor" :)

10
Spacemoses - gerçekten değil, bir şey ne kadar soyutsa, tartışma o kadar kolay olur, ancak tartışılanın gerçekliğini kavramak daha zordur.

kabul etti, şimdi görüşünü görüyorum.
ses011

12

Nesne yönelimli programlama, prosedürel snippet'lerin organize bir şekilde toplanmasıdır. Bence öğrendiğiniz ders, nesne yönelimli metodolojinin organizasyonun ve sürdürülebilirliğin korunmasına yardımcı olduğudur. Bu ayrımı yapamayan ve programlarının daha prosedürel olduklarında nesne yönelimli olduklarını iddia edecek birçok programcı vardır.


3
ancak fonksiyonlar + durum = nesneler
Dan D.

4
Nesne yönü, kod tabanını şişirdiği için bakımı genellikle çok daha zorlaştırır. Java tabanlı sistemler, o toplulukta bulunan OO saflığı ve tasarım paterniti seviyesi nedeniyle sürdürülmesi gereken bir kabustur.
bit-twiddler

1
"Bu toplulukta bulunan tasarım kalıpları" - duruşunuz buysa "Java topluluğu" nda kişisel bir sorun gibi görünür.
ses011

1
@Dan D: nesne yönelimi, bir nesnedeki işlevleri ve durumu birleştirmekten çok daha fazlası ...
Marjan Venema

4
@ Spacemoses: KISS ilkesini benimsemeyen herhangi bir kalkınma topluluğuyla ilgili bir sorunum var. Bir soruna en iyi çözüm genellikle en basit çözümdür.
bit-twiddler

11

Yapmazsın.

Scheme ile önce fonksiyonel programlamayı öğrendik . Sonra prosedüre, sonra OOP'a ve sonra deklaratif programlamaya geçtik . İster inanın ister inanmayın, programlamayı zaten biliyorken, diğer insanlar için de aslında daha kolay olduğunu düşünüyorum: çünkü FP tıpkı matematik gibidir! Yani temelleri zaten biliyorsunuz.

Bunu kendimle birçok kez tartıştım ve sonuçta öğretmeninizin size kavramları ne kadar iyi öğrettiğine bağlı olduğu sonucuna vardım .

Tek bir cevap yok çünkü:

  • C (veya hatta montaj) gibi prosedürel bir şeyle başlamak iyi bir seçim olabilir, çünkü bilgisayarların gerçekten nasıl çalıştığını öğrenirsiniz

  • Nesne yönelimli bir Java ile başlamak iyi bir seçim olabilir, çünkü OOP'yi gerçek hayata öğrenmek ve uygulamak nispeten kolaydır ve size ** şekillendirme hakkında bilgi verir.

  • Scheme gibi fonksiyonel programlamayla başlamak iyi bir seçim olabilir çünkü size daha soyut düşünmeyi (değişkenler yerine işlevler açısından) öğretir, bu da sizi daha iyi bir programcı yapar.

Eğer öğretmeniniz bunu iyi öğretmezse, ne ile başladığınız gerçekten önemli değildir; hemen hemen aynı olacaklar.


4
+1 patlama ve onu bulmak için pek çok kötü cevaplar kaydırmak zorunda inanamıyorum!
jk.

Aslında bir süre matematik işlevlerini grokking konusunda sorun yaşadım çünkü önce bazı kodlamaları öğrendim ve 'bir şeyler yapmak' yerine 'olan' bir işlev kavramı beni şaşırttı. : 3
StarWeaver

6

Bir dil C ++, Java veya C # gibi nesne yönelimli olabilir. Ve bu dillerle başlayabilirsiniz. Ama asıl mesele, bu OO dillerinde bile, önce prosedürel programlamayı, sonra OOP'yi öğrenmek zorundasınız. Aynı şeyi senin tarafından kardeşine yaptı.


3
+1 Kesinlikle. Her OOP yöntemi kısa bir prosedür programıdır. Eğer küçük parçalar (tipleri, hazır bilgi değerleri, değişkenler, operatörler, birleştirmek nasıl bilmiyorsanız =atama, if, fordaha büyük parçalara (yöntemleri) içine, vb), Hiç umut nasıl OOP anlıyoruz. Çoğu beceride olduğu gibi, çok zeki, motive olmuş ve / veya bire bir talimatlara erişebilmeniz, aynı anda birden fazla ilgili konuyu öğrenmenize izin verebilir.
David Harkness

3

Prosedürel programlama, en azından C gibi bir dilde, programlamayı çok çıplak bir kemik uygulamasına ayırır: algoritmalar ve veri yapıları ve insanın anlaşılabilir kaynak kodu ile montaj kodu arasında mutlu bir ortam olan bir soyutlama seviyesinde.

Bu şekilde, öğrenciler aynı anda biraz bilim (algoritmalar, veri yapıları) ve biraz mühendislik (kaynak-> nesne-> makine derlemesi, von-neuman (olası) mimarisi) öğrenebilirler.

OOP, C ++ / obj-C aracılığıyla öğrenilecek bir şey daha olan bir kod organizasyon modeli sunar. Bu, yukarıdaki kavramları öğrenmeyi biraz daha zorlaştırabilir.

Java üzerinden OOP (diğerlerinin yanı sıra), donanım ve ortamı soyutlayarak daha da ileri gider. Şimdi altta yatan ürün makine kodu değil, altta yatan donanımın nasıl çalıştığını ortaya koymayan bir tür aracı, ancak bunun etkisi öğrencinin kod organizasyon modellerine odaklanmasına izin vermesidir.

Sonunda, donanımın nasıl çalıştığını öğrenmek veya bir kod organizasyon modeli öğrenmek arasında bir denge olduğunu düşünüyorum. Hangisi daha önemli ise, gerçekten bilmiyorum. Gerçek dünya, en azından bir dereceye kadar her ikisinin de bilgisini gerektirir.

Düşük seviyeli prosedürel programlama ile başlayan bir lisans programının muhtemelen bilgisayar bilimcileri / bilgisayar mühendisleri ürettiğini ve daha üst düzey kavramlarla başlayan bir programın yazılım mühendisleri / geliştiricileri / programcıları ürettiğini tahmin edeceğim.


3

OOP nesnelerinin bağırsakları prosedürel programlamadan oluşur.

Eğer bir for döngüsü yapamıyorsanız, işaretçileri doğru kullanın, türlerinizi ve işlevlerinizi beyan edin, sınıflarınız için arabirimler yazamayacağınızı bildirin, içerilerin yapmaya değer bir şey yapmasını sağlayın.

Gerçekten de bir giriş sınıfında OOP öğrenmeyecektiniz, sadece sözdizimi olurdu - doğrudan OOP'a atlamak, (ilk başta) kavramaktan daha karmaşık olan şeyleri zaten olduğundan daha karmaşık hale getirecektir.

OOP, sınıfları oluşturmak için bazı sözdizimi ilan etmekle ilgili değildir, veri yapıları, tasarım modelleri, polimorfizm, kalıtım ve kompozisyonla ilgilidir.

Eğer prosedürel programlama, Sen taşıyabilir kolayca C. yapılabilir şeyler bilmesi gereken şeylerin hepsini yapmak için en Java veya yine C ++ içine üzerinde C öğrenmek her şeyi, size C hafife aldı bazı şeyleri yeniden düşünmek zorunda ANCAK olabilir ... Cümleleri yazmak (dilbilgisi, komedi, kusurlu) sonra paragraflar (veri yapılarını bilmeliler) yazmak için (dilbilgisi, komedi, kusurlu) dilbilgisi (giriş C'de olduğunuz yer) dilbilgisini bilmeniz gerekir. kahraman, nasıl etkileşimde bulundukları ve ne zaman kullanılmayacağı) tam romanlar yazmadan önce (tam OOP sistemi).

Ben olsaydım şu kitaplardan bazılarını seçerdim: C Programlama Dili , Java Programlama Dili , Tasarım Desenleri , Dörtlü Grup ve Desen Tarama . C / C ++ konusunda ciddiysem kesinlikle C Programlama Dili'nin bir kopyasını alırım.

Sadece tüm yolu Java (ve $ için yapmak) id istiyorsanız Java tasarım desenleri ve Java nasıl Apache ve Tomcat web sunucuları ve SQL veritabanı programlama ile ilgili bazı kitaplar almak. Java, web üzerinde çok eşek başladı, üzgünüm ama PHP, sunucu köklü veya SQL veritabanları enjekte tutmak için Windows kadar kıçından bir ağrı kadar yapan bir sürü güvenlik delikleri geçmişi vardı.

Ayrıca SQL öğrenmek için zaman ayırmalısınız, Oracle MySQL Postgresql ve MSSQL sözdizimi ile ilgili çok ortak noktaya sahiptir, ancak kendim için bir tane öğrenmem gerekiyorsa, sadece GPL yerine BSD lisanslı olduğu için Postgresql'yi seçmeliyim (bir karşılaştırma bakmalısınız ve GPL / BSD lisanslarında da kontrast)


2

Java gibi nesne yönelimli dillerde yazılmış kodların çoğunun aslında nesne yönelimli olmadığını söylemek zorundayım. OO'nun arkasındaki fikirleri gerçekten anlamak zordur, sonuçta en çok OO kodu gerçekten prosedüreldir.

Ancak, Java'da yordamsal kod yazarken bu gerçekten yanlış bir şey değildir. Evet, OO yapmanın faydaları var, ama bu bir başlangıç ​​programcısını karıştırmak istediğim bir şey değil. Bu temelde Java öğretirken yanlış bir şey görmüyorum. Ondan gerçek OO beklemeyin, ama işe yarıyor.

Bununla birlikte, Java, bilgisayarın içinde olup bitenler hakkında birçok düşük düzey ayrıntıyı gizler. C bunları çok daha açıkta bırakır. Öğrencilerin kendileriyle ilgilenen bir dili kullanmadan önce bu düşük seviyeli detayların nasıl çalıştığını öğrenmesi iyi bir durum olabilir. Ancak bu ayrıntıları görmezden gelmeniz ve daha sonra öğrenmeniz gereken bir durum da yapabilirsiniz.


2

Birkaç kişi bu tema boyunca zaten cevap verdi, ancak bence bunu daha açık bir şekilde belirtmeye değer.

Programlamayı Java gibi bir nesne yönelimli dille öğrenmeye başlasanız bile, OO kavramlarına ulaşmadan önce prosedürel programlama tekniklerini öğrenerek başlarsınız . Yeni bir programcı Java öğretirken, bunları önce nesnelere ve sınıflara tanıtmazsınız, bunları deyimlere ve değişkenlere tanıtırsınız. Öğrenci, nesneler ve sınıflar hakkında çok şey öğretilecek bir pozisyondayken, zaten en azından prosedürel programlamanın temelleri vardır.

En azından, Java'da prosedürel programlamayı öğrenmeli ve daha sonra Java'da nesne yönelimli programlamayı öğrenmelisiniz. Prosedürel programlamaya bir yıl boyunca ya da programlama kursunun ilk birkaç haftasını geçirip geçirmediğinize ve bunun için farklı bir dil kullanıp kullanmadığınıza bakılmak, ayrıntılar hakkında tartışıyor.


0

Bu konuda aşırı derecede künt olmak için, bunun ivme, öncelikle eski zamanlar isteyen eski programcılardan geldiğini düşünüyorum.

Başka bir şey söylemeden önce, yaşlı programcılar için kesinlikle çekişme yapmıyorum , birçoğu inanılmaz derecede yetenekli. Ne yazık ki bazen olmayanlar, yıkananlar ve asla gerçekten programlama konusunda gerçekten iyi olanlar ... 'gerçek dünyada' hackleyemedikleri zaman profesör olun. ( Tüm profesörler de değil ... ama ... BİRÇOK)

OOP, yapıldığı programlamanın kutsal kâsesi değil, prosedürel programlama da bir kalıntı değildir. Her ikisinden de en az bazılarını bilmek güzel , ama bence prosedürel programlama olarak öğretilenlerin genel uygulaması dev bir zaman ve çaba kaybı olma eğilimindedir. Akademide programlamayı sadece bir stil ya da diğeri değil, öğrenmeliyiz . Ben de dahil olmak üzere, buna biraz korkunç kod ve yanlış anlama atıfta bulunuyorum.


2
'89'dan C'yi kullanan bir öğretmenim vardı, ama c '99'u bekleyen bir mikroçip içindi. Sonra 'c ++' kullanan ancak STL veya şablonlar olmayan başka bir öğretmen vardı. Bunların içinde işlev işaretçileri olan yapılar da olabilir.
Ape-inago

1
Adil olmak gerekirse, STL ve şablonlar genel olarak giriş niteliğindeki C ++ konuları değildir. 101 seviyeli herhangi bir programlama dersinin temel amacı, belirli bir sözdiziminin kısıtlamaları dahilinde iyi yapılandırılmış sıralı, koşullu ve yinelemeli mantığın nasıl oluşturulacağını öğretmektir. Diğer tüm dil özellikleri, sadece temel kontrol yapılarını gruplandırmasına ve bunları verilere bağlamaya izin veren sözdizimsel şekerdir.
bit-twiddler

ah iki aşağı oy. Biri = P garip geldiğini gördüm ama fikir aslında kötü öğretimden kurtulmama yardımcı olan eski bir programcıdan geldi. @Ape: CS bölümümüzün başı 2004 XD'de bize bir yıl boyunca COBOL öğretmeye çalışıyordu ('öğretim' stilinden en az endişe duyduğum için, bazı satış noktalarında çalışabileceğim için umursamıyorum makineleri lol ama geeze ... ciddi?)
Garet Claborn

1
@ bit-twiddler - Evet efendim, çok garip. Bu görüşte bu deneyime fazla güvenmiyorum , ancak diğer yerlere baktım. Her iki programlama tarzını da çok seviyorum ve bana birlikte öğretmeleri gerektiğini düşünüyorum. Biraz daha genç profesörlerin bile bu konuda aynı gayrete sahip olmadığını görüyorum. IMO bu iyi bir şey. Bazılarının önce prosedürün önemli olduğunu düşündüğünü anlıyorum.
Garet Claborn

1
@ bit-twiddler: evet, ama bu bir giriş kursu değildi. Veritabanı tasarımında 4 yıllık ileri bir derstir ve c ++ kullanmamız gerekiyordu. Sadece önceki kursları ile böyle yüksek bir seviyeye c ++ yaşadıktan sonra yanlış hissettim.
Ape-inago

0

Benim için iki neden: Bir OO programlama prosedürel programlama problemlerini çözmek için geldi. Bu yüzden bazı prosedürel kodlama ve sonra aynı şeyleri OO'ya yazarak, farkı anlamayı kolaylaştırır.

Burada ek bir unsur daha var: Programlama konuları hakkında eğitim vermek için iki yaklaşım. Kişi olabildiğince düşük olarak başlayabilir (örnek montaj, birçok yerde prosedürel, bazıları devrelerle başlar) ve sonra yukarı çıkar (OO / Fonksiyonel / Yönetilen'e doğru). Diğer yaklaşım, fiziksel dünyadan (ör. Tarayıcı / Windows 7 vb.) Başlamak ve daha derine inmektir. Her yaklaşımın artıları ve eksileri vardır. Üniversiteniz ilkini seçti ve prosedürle başlasın. Biraz mantık olabilir ya da başka birini kopyalamış olabilirler :-).


1
"OO programlama prosedürel programlama sorunlarını çözmek için geldi." Amaç buydu, ama OO çözdüğü kadar çok sorun yarattı.
bit-twiddler

@ bit-twiddler: Çok büyük bir hikaye. Pedagojik yöne odaklanmak (veya daraltmak), bir durum ortaya koyuyor: Neye sahip olduk, nasıl daha iyi hale getirdik: o (daha iyi olup olmadığını tartışıyorsunuz)
Dimitrios Mistriotis

0

Kurumsal atalet dışında bir neden yoktur. CMU'ya bakın, tüm OOP müfredatlarını attılar ve yerine fonksiyonel programlama uyguladılar. Bu nedenle, sorunuzun cevabı, hangi okula gittiğinizin yöneticileri tarafından yapılan keyfi bir seçimdir. Herkesin burada yaptığım olgusal açıklamaları merak etmesi durumunda, bir profesör / yönetici tarafından CMU'daki müfredatın değiştirilmesine ilişkin yazı: Öğrencilere FP öğretimi .


1
-1 yanıltıcı - CMU'nun ilk yıl CS müfredatından OOP'yi bıraktığını ve işlevsel programlama ile değiştirdiğini iddia eden bir konu (google arama yoluyla) görürken , resmi CMU müfredatı, Alice programlama dili ile başlar. odaklı [bkz. enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Steven A. Lowe

1
@ davidk01: (1) cevapta aslında yanlış iddia. (2) "Alice, bir öğrencinin nesneye yönelik programlamaya ilk maruz kalması için tasarlanmış serbestçe kullanılabilir bir öğretim aracıdır "
Steven A. Lowe

2
@Steven A. Lowe: Doğruca atın ağzından: "Nesne yönelimli programlama tamamen tanıtım müfredatından çıkarılır, çünkü doğası gereği hem anti-modüler hem de anti-paraleldir ve dolayısıyla modern bir CS müfredatı için uygun değildir. Bu konuyu incelemek isteyen öğrenciler için ikinci sınıfta nesne yönelimli tasarım metodolojisi üzerine yeni bir ders önerilecek. " -
Birinci

1
@ davidk01: mükemmel bağlantı, teşekkür ederim. "Nesne yönelimli programlama (sayısız formlarında) endüstriyel yazılım geliştirmede baskın bir tema olarak kalsa da, giriş düzeyinde Java gibi nesne yönelimli dillerin kullanılması, önemli düzeyde karmaşıklık ve dikkat dağıtıcı unsurlar getirmektedir. çekirdek hedeflerden giriş seviyesinde . giriş düzeyinde temel üzerinde daha odaklı konsantrasyonunu sağlamak için müfredatta sonraki bir OO tasarım ve uygulama metodolojisinin dolgun kapsama vermek tercih gibi görünüyor." [vurgu mayın] ...
Steven A. Lowe

1
@ davidk01: Katılmayı kabul ettiğim için mutluyum. İsterseniz bana bilgiçlik deyin, ama bana göre başlangıç ​​düzeyindeki vurguyu değiştirmek ve "tüm OOP müfredatlarını atmak" arasında önemli bir fark var. Giriş sınıflarının kapsamını azaltmaya "süpürme değişikliği" ;-) demek istemem
Steven A. Lowe
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.