Nesneye yönelik programlamanın prosedürel programlamaya göre faydası nedir?


77

C gibi işlemsel diller ile C ++ gibi nesne yönelimli diller arasındaki farkı anlamaya çalışıyorum. Daha önce hiç C ++ kullanmadım, ancak ikisini nasıl ayırt edebileceğim konusunda arkadaşlarımla tartıştım.

C ++ 'a değişkenlerin tanımlanması için genel ve özel modların yanı sıra nesne yönelimli kavramları da olduğu söylendi: C'nin sahip olmadığı şeyler. Bunları Visual Basic.NET'te programlar geliştirirken kullanmak zorunda kalmamıştım: bunların faydaları nelerdir?

Ayrıca, bir değişken genelse, herhangi bir yere erişilebildiği, ancak bunun C gibi bir dilde genel bir değişkenden ne kadar farklı olduğu belli değil. Ayrıca özel bir değişkenin yerel bir değişkenden ne kadar farklı olduğu da belli değil.

Duyduğum bir diğer şey, güvenlik nedeniyle, bir işleve erişilmesi gerekiyorsa önce miras alınması gerektiğidir. Kullanım durumu, bir yöneticinin yalnızca ihtiyaç duyduğu kadar hak sahibi olması ve her şeye değil olması gerektiğidir, ancak şartlı olarak da işe yarayacak gibi görünüyor:

if ( login == "admin") {
    // invoke the function
}

Bu neden ideal değil?

Nesneye yönelik her şeyi yapmanın yordamsal bir yolu olduğu göz önüne alındığında, neden nesneye yönelik programlamaya önem vermeliyim?




26
Bazı indirimlere karşı koymak için +1. Bir iş arkadaşım bana böyle bir soru sorsa, muhtemelen bazı endişelerim olacak ve hatta onu aşağıya çekebilirdim (onun yanında herhangi bir aşağı ok olduğunu varsayarak). Ancak, bu sorunun gelecekteki bir yazılım mühendisi tarafından sorulduğu görülüyor ve konuya göndermeden önce konuyu düşünmek ve tartışmak için biraz zaman harcadığı anlaşılıyor. Görevden almak yerine ona yardım etmek için oy veririm.
DXM

14
@DXM Mükemmel fikir! İş arkadaşlarınız etrafında yüzen okları aşağı oyla / oyla ... Bu harikalar yaratabilir.
yannis

2
Standart sayaç argümanı: C'de yapabileceğiniz her şeyi yapmanın bir montajcı yolu da var, peki neden C'yi önemsemelisiniz? (İpucu: Her şey soyutlama seviyesini yükseltmekle ilgilidir. C ++ bunu, C'nin hızının çoğunu feda
etmeden gerçekleştirmeyi başarır

Yanıtlar:


135

Şimdiye kadarki tüm cevaplar, “c ve c ++ arasındaki fark nedir” derken sorunuzun konusuna odaklandı. Gerçekte, farkın ne olduğunu biliyor gibisiniz, sadece neden bu farka ihtiyacınız olduğunu anlamıyorsunuz. O zaman, diğer cevaplar OO ve kapsülleme açıklamaya çalıştı.

Başka bir cevap ile cevap vermek istedim, çünkü sorunuzun ayrıntılarına dayanarak, birkaç adım geri gitmeniz gerektiğine inanıyorum.

C ++ veya OO'nun amacını anlamıyorsunuz, çünkü sizin için uygulamanızın yalnızca veri depolaması gerektiği görünüyor. Bu veri değişkenlerde saklanır. “Neden erişilmez bir değişken yapmak isteyeyim? Şimdi artık erişemiyorum! Her şeyi halka açık ya da daha iyi hale getirerek, her yerden veri okuyabilirim ve hiçbir sorun yaşamadım.” - Şu anda yazmakta olduğunuz projelerin ölçeğine dayanarak haklısınız, muhtemelen çok fazla sorun yoktur (ya da vardır, ancak henüz farkında değilsiniz).

Bence gerçekten yanıtlamanız gereken temel soru şudur: "Neden veri gizlemek isteyeyim? Bunu yaparsam, onunla çalışamam!" Ve bu yüzden:

Diyelim ki yeni bir proje başlattınız, metin editörünüzü açtınız ve fonksiyon yazmaya başladınız. Bir şeyi saklamak istediğiniz her zaman (daha sonra hatırlamak için), bir değişken yaratırsınız. İşleri kolaylaştırmak için değişkenlerinizi global hale getirirsiniz. Uygulamanızın ilk sürümü harika çalışıyor. Şimdi daha fazla özellik eklemeye başladınız. Daha fazla fonksiyona sahipsiniz, önceden sakladığınız bazı veriler yeni kodunuzdan okunmalıdır. Diğer değişkenlerin değiştirilmesi gerekiyor. Daha fazla fonksiyon yazmaya devam ediyorsun. Fark etmiş olabileceğiniz (ya da değilse bile gelecekte kesinlikle farkedeceğiniz), kodunuz büyüdükçe, bir sonraki özelliği eklemek daha uzun ve daha uzun sürer. Kodunuz büyüdükçe, işe yarayan bir şeyi bozmadan özellik eklemek daha da zorlaşıyor. Neden? Çünkü hepsini hatırlamalısın.Genel değişkenleriniz saklanıyor ve hepsinin nerede değiştirildiğini hatırlamanız gerekiyor . Ve hangi fonksiyonun hangi sırayla çağırılmasının uygun olduğunu hatırlamanız gerekir ve onları farklı bir sırayla çağırırsanız , hatalarınızı alabilirsiniz çünkü global değişkenleriniz henüz tam olarak geçerli değildir. Buna hiç rastladınız mı?

Tipik projeleriniz (kod satırları) ne kadar büyük? Şimdi sizinkinin 5000 ila 50000 katı büyüklüğünde bir projeyi görüntülüyorum. Ayrıca, içinde çalışan birden fazla insan var. Ekipteki herkes bu değişkenlerin ne yaptığını nasıl hatırlayabilir (veya farkında bile olabilir)?

Yukarıda tarif ettiğim şey mükemmel bir şekilde birleştirilmiş kod örneğidir. Ve zamanın başlangıcından beri (zamanın 1 Ocak 1970’te başladığı varsayılarak) insan türü bu sorunlardan kaçınmanın yollarını arıyordu. Onlardan kaçınmanın yolu, kodunuzu sistemler, alt sistemler ve bileşenlere ayırmak ve kaç işlevin herhangi bir veri parçasına erişebilmesini sağlamaktır. 5 tamsayı ve bir tür durumu temsil eden bir dizgem varsa, sadece 5 işlev değerleri belirler / alırsa bu durumla çalışmak benim için daha kolay olur mu? veya eğer 100 işlev aynı değerleri ayarladıysa / alıyorsa? OO dilleri olmasa bile (örneğin C) insanlar, verileri diğer verilerden izole etmek ve kodun farklı bölümleri arasında temiz ayırma sınırları oluşturmak için çok çalışıyorlar. Proje belirli bir boyuta ulaştığında, programlama kolaylığı “Y değişkeninden X değişkenine erişebilir miyim” olmaz,

Bu yüzden OO kavramları tanıtıldı ve bu yüzden bu kadar güçlüler. Verilerinizi kendinizden gizlemenizi sağlar ve bunu bilerek yapmak istersiniz , çünkü o verileri ne kadar az kodlar görürseniz, o kadar az şansı vardır ki, bir sonraki özelliği eklediğinizde bir şeyleri kıracaksınız. Bu, kapsülleme ve OO programlama kavramlarının temel amacıdır. Sistemlerimizi / alt sistemlerimizi daha da ayrıntılı kutulara bölmenize izin veriyorlar, genel projenin büyüklüğü ne olursa olsun, belirli bir değişkenler kümesine yalnızca 50-200 kod satırıyla erişilebilecek bir noktaya kadar! Açıkçası OO programlamanın çok daha fazlası var, fakat özünde, C ++ size verileri / işlevleri özel, korumalı veya genel olarak bildirme seçenekleri sunar.

OO'daki en büyük ikinci fikir soyutlama katmanları kavramıdır. Prosedürel dillerin de soyutlamalar yapabilmesine rağmen, C'de, bir programcının bu katmanları oluşturmak için bilinçli bir çaba sarf etmesi gerekir, ancak C ++ 'da bir sınıf ilan ederken, otomatik olarak bir soyutlama katmanı oluşturursunuz (hala bu soyutlamanın size kalmış olup olmadığına bağlıdır) değer katacak veya kaldıracak). Soyutlama katmanları hakkında daha fazla okumalısınız / araştırmalısınız ve daha fazla sorunuz varsa, bu forumun bu soruları cevaplamaktan daha mutlu olacağından eminim.


5
Büyük cevap, soru verilen uygun seviyeye vurmak gibi görünüyor
Carlos

29
+1 ... çoğunlukla, "Ve zamanın başlangıcından beri (zamanın 1 Ocak 1970’te başladığını varsayarsak ...) ..." satırı
CaffGeek

4
@Chad - Tek başına bu hattın beni en az bir puan alması gerektiğini düşünüyordum :)
DXM

Usul paradigmasında bahsettiğiniz bu ölçek sorunuyla baş etmenin bir yolu var. Buna işlevler denir. Ama sorunu açıklamanın iyi bir yolu.
annoying_squid

@DXM - Cevabı doğru anladığımdan emin değilim. Prosedürel Programlamada da aynı set / get fonksiyonuna ulaşabiliriz. Genel değişkeni değiştirmek / almak için set / get fonksiyonlarını C yazabiliriz. Bu yöntemi kullanarak, global değişkenleri değiştiren işlevlerin sayısını da sınırlıyoruz. OOP'da bile set / get yöntemlerini kullanırsak, değerleri değiştirmek için bu yöntemleri nesnenin dışından kullanacağız.
kadina

10

Hmm ... belki de en iyisi, nesne yönelimli programlamanın temel amacı hakkında bir fikir vermeye çalışmaktır. Nesneye yönelik programlamanın amacı, soyut veri türlerinin oluşturulmasına izin vermektir. Şüphesiz aşina olduğunuz gerçekten basit bir örnek için, bir ipi düşünün. Bir dizgede genellikle dizginin içeriğini tutacak bir tampon bulunur, dizgide çalışabilen bazı işlevler (içinde arama, parçalara erişme, alt dizgiler oluşturma, vb.) Ayrıca (en azından tipik olarak) bir şeyleri olacaktır. dizenin (geçerli) uzunluğunu ve (muhtemelen) arabellek boyutunu takip edin; böylece (örneğin) dizenin boyutunu 1'den 1000000'e çıkarırsanız, büyük olanı tutmak için daha fazla belleğe ihtiyaç duyduğunda anlar. içeriği.

Bu değişkenler (arabellek, geçerli uzunluk ve arabellek boyutu) dizenin kendisine özeldir, ancak belirli bir işleve yerel değildir . Her dize belirli bir uzunlukta içeriğe sahip olduğundan, o dize için o içeriği / uzunluğu izlememiz gerekir. Buna karşılık, aynı işlev (örneğin bir alt dize ayıklamak için) farklı zamanlarda birçok farklı dizgide çalışabilir, böylece veriler tek tek işleve yerel olamaz.

Bu nedenle, dizgeye özel bazı verilerle sonuçlanır, bu nedenle yalnızca (doğrudan) dizge işlevlerine erişilebilir. Dış dünya bir dize işlevi kullanarak dize uzunluğunu alabilir , ancak onu elde etmek için dize içindekiler hakkında hiçbir şey bilmek gerekmez. Aynı şekilde, dize üzerinde değişiklik yapabilir - ancak yine, dize işlevleri aracılığıyla bunu yapar ve yalnızca dize nesnesine yerel olarak bu değişkenleri doğrudan değiştirir.

Bildiğim kadarıyla güvenlik konusunda, gidip bu bir benzetme olarak makul iken, bu kadar dikkat ediyorum değil şeyler gerçekten nasıl çalıştığını. Özellikle, C ++ erişim spesifik olan olmayan bir işletim sistemine erişimi gereksinimleri aynı tür karşılamak üzere tasarlanmıştır. İşletim sistemi, gerekiyordu uygulamak (örneğin) bu yüzden normal kullanıcı kısıtlamaları olamaz yönetici için ayrılmış şeyler yapıyorlar. Buna karşılık, C ++ 'da erişim kontrolü sadece kazaları önlemeye yöneliktir. Tasarım gereği, herhangi bir kişi onları kolayca atlayabilir. Bir dosyayı salt okunur olarak işaretlemekle aynı sıradadır, böylece yanlışlıkla silmemeniz gerekir. Dosyayı silmeye karar verirseniz, dosyayı salt okunurdan okumaya yazmaya değiştirmek önemlidir; sadece salt okunur olarak ayarlanması, en azından bir saniye düşünmenizi ve dosyayı silmeye karar vermenizi sağlar, böylece yanlış zamanda yanlış anahtara basmak sizi kazayla silmez.


6

C'ye karşı OOP gerçekten tartıştığınız şeylerden ibaret değil. Öncelikle istemeden (veya bazen kasıtlı olarak) birbirlerini etkilemeyecek / etkilemeyecek alanlara paketleme kodu ile ilgilidir.

C, herhangi bir işlevi temelde herhangi bir yerden çalıştırmanıza izin verir. OOP, yöntemleri sınıflara ayırarak ve yalnızca bunları içeren sınıfa başvurarak yöntemleri kullanmanıza izin vermesini önler. Bu nedenle, OOP'nin potansiyel olarak büyük bir avantajı, size yapmanız gerektiğini söyleyen çok fazla deneyim olmadan daha iyi bir kod düzenlemesine sahip olmanızın çok daha muhtemel olmasıdır.


4
-1. C'de tüm fonksiyonları küresel yapan özel bir şey yoktur. Herhangi bir işlevi statik olarak ilan edebilir ve böylece kapsamını yerel dosya ile sınırlayabilirsiniz. C bu açıdan C ++, Java vb. Farklı değildir. Ayrıca, OOP dil sözdizimi ile ilgili değildir, OO programlarını C dilinde yazabilirsiniz, ancak OO için sözdizimi desteği olan dillerden biraz daha kaba olacaktır. Ve aksine: OOP almazsınız çünkü OO'yu destekleyen bir dil seçtiniz. Nesne yönlendirme, bir dil özelliği değil , bir programlama stilidir .

@ Lundin: Teknik olarak haklı iken, noktayı kaçırdınız. OOP dilleri, varsayılan davranışını OOP tarzında davranmasını sağlar. C yapmaz.
John Fisher

1
OO dillerinde sizi buna zorlayan hiçbir şey yok. Mesela, sayısız O ++ programını sayısız OO'dan bahsetmeden gördüm. Benzer şekilde, eğer OO hakkında bir ipucunuz yoksa ancak sınıfları, mirası vb. Uygulamaya çalışsanız, karışık bir program oluşturma şansı yaklaşık% 100'dür.

@ Lundin: C ++ 'ın adil bir örnek olduğunu sanmıyorum. Bu (veya en azından) C programlarını (çok) bir değişiklik yapmadan derleyebilmek anlamına geliyordu. En üste sınıf eklemek, C # veya Java düzeyinde bir OOP dili yapmaz, ancak bu tür bir geliştirme sağlar.
John Fisher

OO olmayan programları da Java'da yazabilirsiniz, yalnızca büyük bir ana dosyada kesileceksiniz ... OO hala dile özgü değildir, eğer programcı OO'yu bilmiyorsa, dünyadaki hiçbir dil onları kurtaramaz.

4

İyi yazılmış bir sınıf küçük bir "güven adası" olmalıdır: Onu kullanabilir ve "doğru olanı" yaptığını ve sizi ortak tuzaklardan koruduğunu varsayabilirsiniz. Bu, iyi bir sınıfı, iyi sonuç verebilecek ancak tüm çirkin bağırsaklarını gösteren ve birlikte nasıl çalıştıklarını, nasıl başlatılmaları gerektiğini anlamaya zorlayan bir dizi işlev ve değişken olarak tekrar kullanılabilir bir yapı taşı yapar. İyi bir sınıf bir USB fişi gibi olmalı, prosedürsel çözüm ise bir demet tel, cips, kalay ve bir lehim ucu gibi olmalıdır.

Derinlemesine tartışılmayan bir nokta arayüz / uygulama yönüdür. Bir arayüz davranışı açıklar, ancak gerçekleştirmeyi değil. Yani bir liste arayüzü kavramı açıklarListe ve davranışları: Ekleme, kaldırma ve boyutlandırma yöntemleri gibi şeyler beklenir. Şimdi bu listeyi uygulamak için, örneğin bağlantılı bir liste olarak veya bir dizi tamponu kullanmak için pek çok farklı yol var. OO programlamanın gücü, bir arayüz kullanarak, uygulamayı bilmeden davranışa neden olabileceğinizdir. İç değişkenlere veya yöntemlere erişmek bu soyutlamayı yok eder, bir liste uygulamasını diğeriyle değiştiremezsiniz ve sınıfı kullanarak koda dokunmadan mevcut bir uygulamayı geliştiremezsiniz. Özel değişkenlere ve yöntemlere ihtiyaç duyulmasının ana nedenlerinden biri de budur: Uygulamanın iç detaylarını korumak için, soyutlama bozulmadan kalır.

OO bir adım daha ileri gidiyor: Örneğin, kütüphaneler için henüz var olmayan şeyler için bir arayüz tanımlayabilir ve bu arayüzle çalışan kod yazabilirsiniz. Kullanıcılar, arayüzü uygulayan sınıflar yazabilir ve kütüphane tarafından sağlanan hizmetleri kullanabilir. Bu, prosedürel programlama ile mümkün olmayan bir esneklik derecesine izin verir.


Arayüz kavramı, nesne yönelimli dillere özgü değildir. Bence daha büyük bir faktör, OOP dışı dillerde neredeyse bir modül içerisinde kullanılan tüm fonksiyonların aynı global isim alanına ait olması gerektiğidir. Bu, bir önek ya fonksiyon isimleri üzerine hareket, ya da başka tamamen farklı şeyler yapmak birçok benzer sondaj yöntemleri ne göstermek için gerektirir (örneğin SetLocationbir hareket için kullanılmış olabilir Monsteriken, SetPositionbir hareket olabilir PopupWindowve Movekonumunu ayarlamak için kullanılabilecek a DisplayCursor) Doğru "hamle" yöntemini
bulmaya çalışıyorum

... eğer bir MyMonstor->editör yazdığında sadece tipe göre olan metodların bir listesini gösterirse ... çok daha kolay bir hale getirilebilir Monster. Her biri düzinelerce işlemi destekleyen birçok düzinelerce farklı şey varsa, yöntem listelerindeki karışıklık miktarını% 90 oranında azaltmak, verimliliği büyük ölçüde azaltabilir.
supercat

@supercat name clashing, OOP dışı bir konu değil, bir dil sorunu. Öte yandan, ad alanları problemlidir, çünkü derleyicinin işlevi otomatik olarak yeniden adlandırması ya da mangal yapması gerekir. Peki neden sadece elle yapmıyorsun?
annoying_squid

@ annoying_squid: OOP'un sağladığı şey , ad alanını seçmek için funciton'un birincil argüman türünü etkin bir şekilde kullanma yeteneğidir . Bir ittür değişkenim varsa SuperFancyWhizBang, SuperFancyWhizBangyöntemlerinden birini çağırmak itiçin türün yazılması gerekmez SuperFancyWhizBang; diyerek it.woozle()otomatik aramaya derleyici yönlendirecektir woozleiçinde SuperFancyWhizBang.
Supercat

3

Bir Turing makinesiyle veya en azından C veya C ++ programının sonunda derleyeceği makine kodu için bir montaj dilinde her şeyi yapmanın bir yolu vardır.

Yani fark, kodun ne yapabileceği değil, insanların ne yapabileceği ile ilgilidir.

İnsanlar hata yapar. Çok.

OOP, olası insan kodlama hatalarının uzayının boyut ve olasılık yoğunluğunu azaltmaya yardımcı olan bir paradigma ve sözdizimi sunmaktadır. Bazen hatayı belirli bir veri nesnesi sınıfı için yasa dışı yaparak (bu nesne için bildirilen bir yöntem değil). Bazen hatayı daha ayrıntılı hale getirerek veya dilin kanonik kullanımıyla karşılaştırıldığında stilistik olarak garip görünmesini sağlayarak. Bazen mümkün olmayan çok az tutarsız veya dolaşmayan kullanımlara sahip bir arayüze ihtiyaç duyarak (genel veya özel). vb.

Proje büyüdükçe, hata olasılığı artar. Sadece küçük programlarla karşılaşırsanız, yeni bir kodlayıcıya maruz kalmayacaksınız. Dolayısıyla, OOP'nin neden değerli olduğu konusundaki potansiyel şaşkınlık.


2

Sorunuz farklılıktan ziyade OOP'un amacı hakkında daha fazla görünüyor. Yazınızdaki kavram, Kapsülleme; ve CHANGE'i desteklemek için kapsülleme mevcuttur. Diğer sınıflar içindekilerinize erişirken, onları bölmeden değiştirmek zorlaşır. OOP’de, diğer sınıfların sizinkiyle etkileşimde bulunmasına izin verdiğiniz bir arayüz (genel üyeler) sağlarsınız ve içlerini gizlice değiştirebilecekleri şekilde gizlersiniz.


Sadece fonksiyon prototiplerini kullanın. Bu kapsülleme.
annoying_squid

2

Nerede özel değişkenler okuduğum önemli değil, erişilemiyorsa genel değişkenler neden yerel ve global olarak özel yapmıyorlar? kamu ve özel kullanımın gerçek kullanımı nedir? Lütfen herkes tarafından kullanılabileceğini söyleme, neden bazı şartlar kullanıp arama yapmadığımızı düşünüyorum.

Umarım uygulamanızda birden fazla string istemezsiniz. Ayrıca yerel değişkenlerinizin işlev çağrıları arasında kaldığını da umuyorum. Bu şeyler erişilebilirlik açısından aynı olabilir, ancak ömür boyu ve diğer kullanım açısından? Kesinlikle aynı değiller.


1

Pek çok kişinin söylediği gibi, bir kez derlendiğinde, bir ikili koda dönüştürülür ve bir ikili dizgenin bir tamsayıyı göstermesi için kullanılabileceği gibi, herhangi bir program sonunda sadece bir sayıdır. Bununla birlikte, ihtiyaç duyduğunuz sayıyı tanımlamak oldukça zor olabilir ve bu nedenle yüksek seviyeli programlama dilleri geldi. Programlama dilleri sadece sonunda ürettikleri montaj kodunun modelleridir. Bağlam Odaklı Programlama hakkında bu çok güzel yazı ile prosedürel ve OO programlama arasındaki farkı açıklamak istiyorum http://www.jot.fm/issues/issue_2008_03/article4/

Bu resimde gördüğünüz gibi, kağıtta gösterildiği gibi, Prosedürel programlama, bir hesaplama birimini bir adla ilişkilendirmek için yalnızca bir boyut sunar. Burada prosedür çağrıları veya isimleri doğrudan prosedür uygulamalarıyla eşleştirilir. Şekilde bir çağrı m1, m1 prosedürünün tek uygulanmasının başlatılmasından başka seçenek bırakmaz.

Nesneye yönelik programlama, prosedürel programlamaya göre ad çözümlemesi için başka bir boyut ekler. Yöntem veya prosedür adına ek olarak, mesaj gönderme, bir yöntemi ararken mesaj alıcısını dikkate alır. Şekil-b'de, m1 yönteminin iki uygulamasını görüyoruz. Uygun yöntemin seçimi sadece m1 mesaj adına değil, aynı zamanda asıl mesajın alıcısına da bağlıdır, burada Ry.

Bu gerçekten kapsülleme ve modülerleştirme sağlar.

görüntü tanımını buraya girin

Şekil-c, nihayet konuya yönelik programlama hakkındadır, nesne yönelimli metot gönderimini başka bir boyuta kadar genişletir.

Umarım bu, OOP'de farklı bir bakış açısıyla düşünmenize yardımcı olmuştur.


0

(+1) Anlamadığınız bir şeyin sorusunu sormak, saçma sapan bile olsa iyi.

Fark Nesne ve Sınıf Odaklı Programlamadır. "Düz C", veri ve fonksiyonlarla çalışır. "C ++", "nesne ve sınıflar" kavramlarını ve bununla ilişkili ikincil kavramları ekler.

Ancak, geliştiricileri "C ++" dan önce "Düz C" yi öğrenmelerini savunuyorum. Veya "Object Pascal" dan önce "Prosedürel Pascal".

Birçok geliştirici, öğrencilere yalnızca bir şey öğretmesi gerektiğini düşünür.

Örneğin, OO almayan eski öğretmenler ve yalnızca "Düz Yapılı C" dersi veriyorlar.

Ya da sadece OO öğreten "hipster" öğretmenleri "Düz C" yi değil, çünkü "ihtiyacın yok". Ya da her ikisi de, öğretim düzenini önemsemeden.

Öğrencilere hem "Yapısal Düz C" hem de "Nesne Yönelimli C (C ++)" öğretilmesi gerektiğini düşünüyorum. Daha sonra "Düz C", önce ve "C ++" ile.

Gerçek dünyada, her iki paradigmayı (ayrıca "işlevsel" gibi diğer paradigmaları) öğrenmeniz gerekir.

Yapısal programları büyük, tekil bir "nesne" olarak düşünmek yardımcı olabilir.

Ayrıca, her iki dilde de ad alanlarına ("modüller") önem vermelisiniz, birçok öğretmen bunu görmezden gelir, ama onun önemi önemlidir.


Ad alanları ve aşırı yüklenmeler, yalnızca programı anlamayı zorlaştırır. Tanımlama süreci içeriğini hassaslaştırır. foo()C ++ 'da gördüğünüzde , global bir işlev, geçerli ad alanındaki bir işlev, kullandığınız ad alanındaki bir işlev using, bir yöntem, devralınan bir yöntem ve işlev çağrısındaysa: bir ad alanında olabilir. argüman tabanlı isim arama ile çözülebilir ve benzer Java ve C # için de geçerlidir. C'de yalnızca geçerli kaynak dosyadaki statik bir işlev veya bir başlıktan bir işlev olabilir.
Calmarius

Her yerde MODULE_Foo () yazmak görsel bir karışıklık olabilir, ama en azından hangi fonksiyon olduğunu tam olarak biliyorsunuz.
Calmarius,

Solüsyon @Calmarius açıkça bir şey isim getirmemektir foo .

0

Tek kelimeyle, proje yönetimi. Demek istediğim, C ++ 'nın kodumun başkaları tarafından nasıl kullanıldığı ile ilgili kuralları zorlamama yardımcı olması. 5.5 milyon hatlık bir proje üzerinde çalışırken, nesneye yönelik programlamayı çok yararlı buluyorum. Diğer bir avantaj, beni (ve diğerlerini) belirli kuralları takip etmesini ve derleme zamanında küçük hatalar almasını sağlayan derleyicidir. Tüm teorik avantajlar da var ama sadece günlük pratik şeylere odaklanmak istedim. Sonuçta hepsi makine kodunda derlenir.


-1

Nesneye Dayalı Programlama Prosedürlü Programlama, kutularla yapılır.

PP'de, proje büyüdükçe inanılmaz derecede genişleyen bir kutuya sahip olursunuz ve bu etkilerin küçücük bir kısmını her unutuşunuzda yan etkilerin ortaya çıkmasına neden olur.

OO'da birçok kutunuz, birçok eyaletiniz var ve proje büyüdükçe, kutular biraz büyüyor ve kutu sayısı çok artıyor.

Daha küçük kutulara bakmak daha kolay, bütün bir resim yanılsaması olması kolay, ancak sınıflara ve arayüzlere bakmak önemli sonuçları olan uygulama detaylarını gizlediği için neredeyse imkansız.

İşlevsel programlamada, birçok işlev kutunuz vardır ve her işlevin, dış içeriğe kesinlikle başka erişimi olmayan bir girişe (parametre) ve bir çıkışa (geri dönüşe) sahip olduğuna karar verirsiniz.

Durum olmadığı ve hiçbir yan etkisi olmadığı için (tasarım gereği), herhangi bir fonksiyonu genel olarak ayrı ayrı analiz edebilir ve% 100 herhangi bir durumda nasıl davranacağını bilebilirsiniz.

Eylemleri temsil eden mantıksal birimlerle boks kodu oluşturduğunuzdan, tipik işlem başına yalnızca bir kutuya sahip olmak da mümkün olur.

Bu, herhangi bir büyük ölçekli projenin kodunu, farklı sınıflardaki kod tabanındaki tüm çoklu analog işlevlerin gizlenmesini teşvik eden OOP'a kıyasla büyük bir faktörle küçültecektir.

Bu aynı zamanda PP'yi çok daha fazla yenecektir çünkü takip edilecek daha fazla XXXXXXXL durumu olmadığından projeyi daha uzun süre büyütebilirsiniz.

Özet olarak, PP muhtemelen basit bir programa yaklaşmanın en basit yoludur ve FP muhtemelen karmaşık bir programa yaklaşmanın en basit yoludur.

Tüm kod tabanlarını birleştirme ve kodun yeniden kullanımını geliştirme hedefini hesaba katarsanız, FP her zaman kullanılmalıdır, çünkü çok büyük ölçekte mantıklı olan tek paradigma ve aynı zamanda% 100 yeniden kullanılabilirliğe sahip tek paradigma (yapabilirsiniz sadece bir işlevi kopyalayıp yapıştırın ve başka bir yerde kullanın;

Üstelik ücretsiz olarak% 100 güvenilir birim testi alıyorsunuz.

Ve "_doom genius awesome string_1 özel statik finalini" yazmak zorunda değilsiniz.

Ve ücretsiz olarak paralellik elde edersiniz.


-3

Basit bir cümle farkı, C ++ 'ın Sınıflar ile C olmasıdır. (Şimdi çok daha fazla olmasına rağmen) Vikipedi'de C ++ ile ilgili harika bir makale okuyarak ikisi arasındaki farkları öğrenmek istemiyorum. .Bu makale size çok yardımcı olacaktır: - C ++ (Wikipedia)

Ayrıca konuyla ilgili googling yardımcı olacaktır. Rastgele insanlardan bunu açıklamasını istemek zor olabilir. IMHO, okunarak birisini sormaktan daha iyi anlıyor


Bunları okudum ama sadece nerede kullanıldıklarını söylediler ama hala sorumu çözemediler.
niko

Google'a çaba göstermeden hiçbir çaba sarf etmeden soruyu sormadım ama yine de farkı anlayamadım, bu yüzden bana yardım etmek için stackoverflow ile tanıştım
niko

1
@ niko, beni burada yanlış anladınız. Demek istediğim, ikisi arasındaki farkı okuyarak anlamaya çalışmandı. Arkadaşlarına sormak iyi değil. Çünkü sizi tatmin etmeyebilecekleri kendi anlayışlarını sunacaklar. Ama, merak etme, burada harika akranlar var, kesinlikle sana yardım edecekler :-)
Pankaj Upadhyay 16:11

2
Oy vermedim ama "C ++ 'ı" C ile Sınıflar "dı. Aslında C çalışıyor kıçımızı kapalı çalışma ++ yapabilirim bizler o olsun dışarı insanların kafasının.
DeadMG

1
@ Pankaj: Bu doğru. O was sınıfları ile C. Artık kesinlikle Sınıflar ile C değil ve buna böyle demek neredeyse 30 yıllık. C ++ o zamandan beri çok uzun bir yol kat etti. C ++ 'ı kodlayan insanlar şimdi asla, hiç böyle konuşmadı. En kötü alışkanlıkları ve yanlış izlenimi teşvik eder.
DeadMG
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.