OO programlamaya karşı yapısal programlama


11

Yapısal ve nesne yönelimli programlama arasındaki farkları gösteren bir sunum yapıyorum ve insanların neden OOP'ye ihtiyaç duyduklarını göstermek için OOP kavramlarının uygulanmasının kodlamayı çok daha kolay hale getireceği ve izleyicinin gerçekten OOP'ye ihtiyaç duyduklarını hissettiklerini göstermek istiyorum.

Herhangi bir fikir ??


2
bu soruyu programmers.stackexchange.com adresinde sormak size daha fazla cevap verecektir.
reggie

2
Hedef kitleniz nedir? Deneyimli OO olmayan programcılar (kobol vb.)? az deneyimli programcılar (öğrenciler vb.)? Yöneticiler (programcı olmayanlar)?

Bunu daha önce duymadım ama SSS'yi okudum ve sanırım orada sormak daha iyi.
Ahmed

düşük deneyimli.
Ahmed

4
Keşke bazı OO programları daha iyi yapılandırılmıştı.
Scott Whitlock

Yanıtlar:


17

Bu hızlı video bloguna bakmak isteyebilirsiniz . Sonuç olarak, yapılandırılmış programlama ve OO programlama arasındaki fark, ekledikleri şeyle değil, programlamadan ne aldıklarıyla ilgilidir. Yapısal Programlama ve Nesneye Yönelik Programlama gibi yazılım disiplinleri kısıtlayıcıdır, etkinleştirmez. İşte bazı tanımlar. Uyarı: Onları sevmeyeceksiniz.

  • Yapısal programlama, goto üzerine uygulanan disiplindir (kontrolün doğrudan transferi)

  • OO programlama, işlevlere işaret eden disipline uygulanır (dolaylı kontrol transferi)

  • Fonksiyonel programlama, ödeve yüklenen bir disiplindir.

    Birincisini anlamak çok zor değil. Dijkstra, algoritmalara gitmeye izin verildiğinde genel doğruluk kanıtları oluşturmanın imkansız olduğunu buldu. Kontrol yapıları dizisi, seçim ve yineleme ile sınırlı idi ancak, eğer, doğruluğu daha sonra deliller edildi mümkün. Tabii ki, günümüzde işleri doğrulamaya bile çalışmıyoruz, ancak yapılandırılmış programlamanın sadeliğini ve zarafetini seviyoruz.

OO'yu anlamak biraz daha zor. OO'yu sıklıkla kapsülleme, kalıtım ve polimorfizm olarak tanımlıyoruz. Ne bilir azdır bu özelliklerin üçü ulaşılabilir ve sık sık olmasıdır edildi O C. kapsüle sert aslında değil C'ye aşağı derlenmiş Ne de yapı zor olduğunu, Nitekim C. sadece bir önişlemci olarak başlayan C ++ elde miras simüle eden birbirlerinin alt kümeleri olan veri yapıları. Ancak polimorfizm biraz daha zordur. C'de iyi yönetilmesi zor olan işlevlere işaretçiler gerektirir. C ++ gibi dillerin bize verdiği bu işlevlere işaret eden disiplindi. C ++ derleyicisi bizim için vesileleri inşa etti ve katı bir formalizme göre içlerindeki göstergeleri başlattı. Yani gerçek anlamda OO sadece üzerine uygulanan bir disiplindir.dolaylı kontrol aktarımı yani göstericilerin işlevlere aktarılması.

Yapısal programlama konusunda ise değil goto kullanmak için. OO nasıl olduğunu değil işlevlerine işaretçileri kullanmak. Ve fonksiyonel programlama da ne yapılmaması gerektiği ile ilgilidir. Fonksiyonel programlamada, en sıkı kontrol edilen durumlar dışında değişkenler atamayız.

Sonuç olarak, tüm bu Programlama "teknolojileri" aslında teknolojileri etkinleştirmek yerine disiplinleri kısıtlamaktadır. Onlar bize ne anlatmak değil daha onlar ne bize başka yapacak hiç yok. Bu da yazılım geliştirmenin son 40 yılda büyümediği anlamına geliyor. Aksine, küçüldü. Biz her şeyi öğrendik gibi daha da kısıtlı hale edilir olmamalıdır yapmak.

Ne yapmamayı öğrenmek iyidir; ama burada rahatsız soru: yeni şeyler öğrendik var ne kadar do?


@Ahmed: "TL; DR, Video için teşekkürler" için +1-şüpheli yorum (şaka)
n611x007

bağlantı çürük ... ölü bağlantı
slashdottir

7

Bir bilgisayarı programlamanın 3 temel yolu vardır:

  1. Yapılandırılmamış programlama - gotoeski BASIC yorumlayıcılarında veya montaj dilinde olduğu gibi s ile . Artık çok az insan bu şekilde program yapıyor.
  2. Yapısal zorunluluk programlama - C veya PASCAL gibi.
  3. Haskell, ML veya Lisp gibi yapılandırılmış fonksiyonel programlama.

Bana göre, nesne yönelimli programlama farklı bir şey. Programınızı daha büyük ölçekte nasıl organize edeceğinizle ilgilidir. Yukarıda bahsettiğim 3 paradigmadan hiçbirini değiştirmez ya da geçersiz kılmaz - bir yöntem gövdesi içinde, yine de yazmak için listeden 3 paradigmadan birini seçmeniz gerekir.


Seni iyi anlamıyorum! Yani 3 paradigmadan birini kullanmalıyız ama BİZ Bilmiyoruz .. ve OOP hemen hemen daha fazla organizasyon mu ??
Ahmed

Yapısal zorunluluk programlama veya yapılandırılmış fonksiyonel programlama öğrenmeden programlayamazsınız. Bu iki paradigma, işleri halletmekle ilgilidir. Öte yandan OOP, programınız belirli bir boyuta ulaştığında devreye giren program modülerleştirmesi ile ilgilidir. Her zaman programlarken kullandığınız kütüphanelerde kesinlikle görünse de, kalıtım gibi OO özellikleri olmayan mükemmel bir sınıf kütüphanesine sahip olabilirsiniz, örneğin Haskell, LISP veya Standard ML sınıf kütüphaneleri.
Ken Bloom

4

Her şey değişikliği nasıl beklediğinizle ilgilidir.

Her iki kavram da yeniden kullanılabilirliğe katkıda bulunur, ancak OOP daha kolay değişikliklere kapı açar. OOP, Yapısal programlamanın yaptığı tüm yeniden kullanılabilirliğe sahiptir, ancak bunu daha az çabayla yeni işlevsellik oluşturmak için de kullanabilirsiniz.

OOP'nin ek yapısal miras ile yapısal programlamanın tüm fonksiyonlarını miras aldığını söyleyebilirsiniz! :-D


Şu anda mirastan pek hoşlanmıyorum.

4
Ben de değilim, çünkü hükümet büyükbabamı emekli maaşından kurtardı. Ancak OOP açısından kalıtım bana oldukça iyi hizmet etti!
corsiKa

Deneyimlerime göre, en iyi OOP'de kalıtımdan kaçınılır. Bir Arabirim yerine ne sıklıkla bir üst sınıf oluşturuyorsunuz? Kompozisyonu genel bir kural olarak kabul edin.
Janx

1
@Janx: "Bir Arabirim yerine aslında ne sıklıkla bir üst sınıf oluşturuyorsunuz?" Ha? "Üst sınıflar inşa etmezsiniz"; Onlardan mevcut sınıflar ve yapı subclasss almak ve yapmanız olduğunu her zaman. Kalıtım kullanmıyorsanız, Liskov ikamesi ve polimorfizminin avantajlarından yararlanmıyorsunuz, bu yüzden öncelikle nesne yönelimli programlamada ne yapıyorsunuz? Kompozisyon, farklı bir kullanım durumuna sahip farklı bir araçtır, miras yerine geçmez. Birini diğerinin üzerinde "lehine" bırakmamalısınız; ikisini de kullanmalısınız, her biri yararlı oldukları şey için.
Mason Wheeler

1
@Mason - (Liskov değiştirme İlkesinin) Barbara Liskov aslında belirterek değerinde söyledi (uzun video) o değil özellikle miras gibi yapar.
Aidan Cully

2

Kavramlar dikeydir. Yapısal programlama, kodu prosedürler / fonksiyonlar / yöntemler dahilinde yapılandırmakla ilgilidir. OOP yaparken sınıf metotları içinde yapılandırılmış programlama prensiplerini takip etmek mükemmel bir şekilde mümkündür (ve arzu edilir).


1

Bu bir tür öznel bir ifadedir - yapılandırılmış programlama ve OOP, problem çözme tarzlarıdır ve biri her zaman diğerinden daha iyi değildir. Sayısal yöntemler kitaplığı yazmak, giriş verilerinde dönüşüm gerçekleştirdiğiniz yapılandırılmış bir tarzda yapılırsa mantıklıdır. Bununla birlikte, bir durum makinesi tarafından yönlendirilen basit bir ajan, Java veya C ++ 'da bağımsız bir sınıf olarak kolayca ifade edilebilir. OOP, veri yapıları için saklama kaplarını ifade etmenin doğal bir yolu olabilir.

Bilgi gizleme ve modülerlik hakkında konuşmak, OOP'u bir stil olarak doğal olarak motive etmenin iyi bir yoludur.

Bu konuda ilginç bir yaklaşım Steve Yegge tarafından yazılmıştır - bazı açılardan, iki stil arasındaki yaklaşımlardaki farklılıkların daha iyi tanımlarından biri.


0

İş modeli yaparken OOP'un anlaşılması daha kolaydır. Uygulama öğelerini düşündüğünüzde, aralarında bazı NESNELER ve İLİŞKİLER kullanırsınız, örneğin Kitabın Yazarları, Başlığı, ISBN'si vardır. Kitap Kütüphane izin ve Öğrenci tarafından ödünç alınabilir olduğunu. Yapısal programlama, soyutlamada olmayan belirli süreçler, uygulamalar hakkında düşünmeyi zorlar.

OOP kolay değişiklikler için tasarlanmıştır. Yapısal programda değişiklik mümkündür ancak kodla açıklanmalıdır. OO programındaki değişim soyut model değişikliği ile tanımlanabilir.


0

Değişken Kapsamı:

İyi programlama sağlamak için dillerin prensibi değişkenlerin kapsamını kısıtlamak olduğunu düşünüyorum . C gibi yapılandırılmış dillerde, kapsam esas olarak iki tiptir:

  • Global kapsam
  • Yerel / İşlev / Yöntem Kapsamı

Hepimiz küresel kapsamın zararlı olduğunu biliyoruz. Ancak bazen yerel kapsamlar programı çalıştırmak için yeterli değildir. Global kapsamlardan kaçınmak, daha sonra değişkenlerin kapsam dışında kullanılmasına olanak tanıyan daha geniş işaretçi kullanımına eğilimlidir. Ancak işaretçileri anlamak ve kullanmak zordur.

C ++ gibi OOP dilleri , kapsülleme yoluyla yeni bir scope- Class / Object kapsamı türü ekler . Bu kapsam, özel / kamu varyasyonları ile daha da geliştirilmiştir. Bu, değişken kapsam belirleme ile ilgili birçok sorunu çözer. Kapsamlar OOP'ta daha tanımlanmıştır. Ve işaretçiler daha az gereklidir.

Bu, OOP'un harika özelliklerinden biridir.

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.