Bu programlama paradigmaları arasındaki farklar nelerdir ve belirli sorunlara daha uygun mu veya herhangi bir kullanım örneği diğerinden daha iyi mi?
Mimari örnekler takdir!
Bu programlama paradigmaları arasındaki farklar nelerdir ve belirli sorunlara daha uygun mu veya herhangi bir kullanım örneği diğerinden daha iyi mi?
Mimari örnekler takdir!
Yanıtlar:
Hepsi kendi yollarında iyidir - Aynı sorunlara basitçe farklı yaklaşımlardır.
Tamamen prosedürel bir tarzda, veriler üzerinde çalışan fonksiyonlardan yüksek oranda ayrılma eğilimindedir.
Nesneye yönelik bir tarzda, veriler beraberinde bir işlev koleksiyonu taşıma eğilimindedir.
İşlevsel bir tarzda, veri ve işlevler, işlevlerin gerçekte nasıl kullanıldığı konusunda daha fazla esneklik sunarken (Lisp ve Şema'da olduğu gibi) birbirleriyle daha fazla ortak yönlere sahip olma eğilimindedir. Algoritmalar ayrıca döngüler ve yineleme yerine özyineleme ve kompozisyon açısından tanımlanma eğilimindedir.
Tabii ki, dilin kendisi sadece hangi stilin tercih edildiğini etkiler. Haskell gibi saf işlevsel bir dilde bile, prosedürel bir tarzda yazabilirsiniz (bu çok cesaret kırılmış olsa da) ve C gibi bir prosedürel dilde bile, nesne odaklı bir tarzda (GTK + ve EFL API'ları).
Açıkçası, her paradigmanın "avantajı" sadece algoritmalarınızın ve veri yapılarınızın modellenmesidir. Örneğin, algoritmanız listeler ve ağaçlar içeriyorsa, işlevsel bir algoritma en mantıklı olabilir. Veya, örneğin, verileriniz oldukça yapılandırılmışsa, dilinizin yerel paradigmasıysa, bunları nesne olarak oluşturmak daha mantıklı olabilir - veya, monad'ların işlevsel bir soyutlaması kadar kolay bir şekilde yazılabilir; Haskell veya ML gibi yerel diller paradigmasıdır.
Hangi seçeneği kullanacağınız, projeniz ve dilinizin desteklediği soyutlamalar için daha anlamlı olan şeydir.
Mevcut kütüphanelerin, araçların, örneklerin ve toplulukların bu günlerde paradigmayı tamamen ortadan kaldırdığını düşünüyorum. Örneğin, ML (ya da her neyse) nihai çok amaçlı programlama dili olabilir ancak yaptığınız şey için iyi bir kitaplık alamazsanız berbatsınız.
Örneğin, bir video oyunu yapıyorsanız, C ++ 'da daha iyi kod örnekleri ve SDK'lar vardır, bu yüzden muhtemelen daha iyi durumda olursunuz. Küçük bir web uygulaması için, çok hızlı bir şekilde çalışmanızı sağlayacak bazı Python, PHP ve Ruby çerçeveleri vardır. Java, derleme zamanı denetimi ve kurumsal kitaplıklar ve platformlar nedeniyle daha büyük projeler için mükemmel bir seçimdir.
Eskiden farklı diller için standart kütüphanelerin oldukça küçük ve kolayca çoğaltılabildiği durum buydu - C, C ++, Assembler, ML, LISP, vb. ağ iletişimi, şifreleme, grafik, veri dosyası formatları (XML dahil) gibi, dengeli ağaçlar ve karma tablolar gibi temel veri yapıları bile dışarıda bırakıldı!
Python, PHP, Ruby ve Java gibi modern diller artık çok daha iyi bir standart kütüphane ile geliyor ve kolayca kullanabileceğiniz birçok iyi üçüncü parti kütüphaneye sahip, büyük ölçüde kütüphanelerin birbirleriyle çarpışmasını önlemek için ad alanlarını benimsemeleri sayesinde, ve kütüphanelerin bellek yönetim şemalarını standartlaştırmak için çöp toplama.
Bu paradigmaların birbirini dışlaması gerekmez. Python'a bakarsanız, işlevleri ve sınıfları destekler, ancak aynı zamanda işlevler de dahil olmak üzere her şey bir nesnedir. İşlevsel / oop / yordamsal stili tek bir kodda karıştırabilir ve eşleştirebilirsiniz.
Demek istediğim, fonksiyonel dillerde (en azından Haskell'de, çalıştığım tek kişi) herhangi bir ifade yok! işlevleri sadece bir ifade içinde izin verilir !! AMA, fonksiyonlar birinci sınıf vatandaşlar, onları bir dizi başka yetenekle birlikte parametre olarak iletebilirsiniz. Birkaç kod satırı ile güçlü şeyler yapabilirler.
C gibi yordamsal bir dilde iken, işlevleri çevirebilmenin tek yolu işlev işaretçileri kullanmaktır ve bu tek başına pek çok güçlü görevi etkinleştirmez.
Python'da bir işlev birinci sınıf bir vatandaştır, ancak keyfi sayıda ifade içerebilir. Böylece, işlem kodu içeren bir işleve sahip olabilirsiniz, ancak bunu işlevsel diller gibi geçirebilirsiniz.
Aynı şey OOP için de geçerli. Java gibi bir dil, sınıf dışında prosedürler / işlevler yazmanıza izin vermez. Bir işlevi geçirmenin tek yolu, işlevi o işlevi uygulayan bir nesneye sarmak ve sonra o nesneyi etrafa aktarmaktır.
Python'da bu kısıtlamaya sahip değilsiniz.
GUI için Nesneye Dayalı Paradigmanın çok uygun olduğunu söyleyebilirim. Pencere bir Nesnedir, Metin Kutuları Nesnelerdir ve Tamam-Düğmesi de birdir. Öte yandan, String Processing gibi El işleri çok daha az genel masrafla yapılabilir ve bu nedenle basit prosedür paradigması ile daha basittir.
Bunun bir dil sorunu olduğunu da sanmıyorum. Bazılarında ek çaba olsa da, hemen hemen her popüler dilde işlevsel, prosedürel veya nesne yönelimli yazabilirsiniz.
Sorunuzu cevaplamak için iki öğeye ihtiyacımız var:
Yazılım mimarisi yazılarında yazılım mimarisi stillerinin / deseninin bir listesi gösterilirWikipeida'daki . Web üzerinde kolayca araştırma yapabilirsiniz.
Kısacası ve genel olarak, Prosedür prosedürü takip eden bir model için iyidir, OOP tasarım için iyidir ve Fonksiyonel yüksek seviye programlama için iyidir.
Bence her paradigmada tarihi okumaya çalışmalı ve insanların neden onu yarattığını görmelisiniz ve bunları kolayca anlayabilirsiniz.
Her ikisini de anladıktan sonra, mimari stil / desen öğelerini programlama paradigmalarına bağlayabilirsiniz.
Arkadaşlarımdan biri NVIDIA CUDA kullanarak bir grafik uygulaması yazıyor . Uygulama OOP paradigmasına çok iyi uyuyor ve sorun modüllere düzgün bir şekilde ayrılabiliyor. Bununla birlikte, CUDA'yı kullanmak için mirası desteklemeyen C'yi kullanmanız gerekir . Bu nedenle, zeki olmanız gerekir.
a) Belli bir dereceye kadar mirası taklit edecek akıllı bir sistem tasarlarsınız. Yapılabilir!
i) Bir kanca sistemi kullanabilirsiniz Ebeveyn P'nin her bir alt çocuğunun F fonksiyonu için belirli bir geçersiz kılma yapmasını bekleyen .
ii) Yapısal bellek hizalamasını kullanabilirsiniz Çocukları ebeveynlere aktarmak için özelliğini kullanabilirsiniz.
Bu düzgün olabilir, ancak geleceğe yönelik, güvenilir bir çözüm bulmak kolay değildir. Sistemi tasarlamak için çok zaman harcayacaksınız ve projenin yarısında sorun yaşamayacağınızın garantisi yok. Birden fazla mirasın uygulanması , daha da zor olmadığını neredeyse imkansız değildir.
b) Bir program oluşturmak için tutarlı adlandırma politikası kullanabilir ve böl ve fethet yaklaşımını kullanabilirsiniz. Herhangi bir mirasa sahip olmayacaktır, ancak işlevleriniz küçük, anlaşılması kolay ve sürekli biçimlendirilmiş olduğundan buna ihtiyacınız yoktur. Yazmanız gereken kod miktarı artar, odaklanmak ve kolay çözümlere (kesmek) yenmek çok zordur. Ancak, bu ninja kodlama yöntemi C kodlama yöntemidir. Düşük seviye özgürlük ve iyi kod yazma arasında dengede kalmak. Bunu başarmanın iyi bir yolu fonksiyonel bir dil kullanarak prototip yazmaktır. Örneğin, Haskell prototip algoritmaları için son derece iyidir.
Yaklaşım eğilimindeyim b. A yaklaşımını kullanarak olası bir çözüm yazdım ve dürüst olacağım, bu kodu kullanarak çok doğal olmayan hissettim.