Yalnızca Fortran 77'de kodlanmış birine nesne tabanlı programlamayı nasıl açıklayabilirim?


11

Annem üniversite tezini Fortran'da yaptı ve şimdi (on yıl sonra) sıvı simülasyonları için c ++ öğrenmesi gerekiyor. Tüm prosedürel programlamayı anlayabiliyor, ancak nesneleri ona anlatmaya ne kadar zorlasam da, bu yapışmıyor. (Java ile çok çalışıyorum, bu yüzden nesnelerin nasıl çalıştığını biliyorum) Sanırım bunu çok üst düzey şekillerde açıklıyor olabilirim, bu yüzden onlarla hiç çalışmayan ve büyüyen birisine gerçekten mantıklı gelmiyor tamamen prosedürel programlama çağında.

Onları anlatabileceğim basit bir yolu var mı?


2
Marangoz olmadan kuş evi inşa edebilirsiniz. Belki projeye kendi prosedürünü uygulayarak başlayabilir ve ona OOP tarzında nasıl yeniden düzenleme yapıldığını gösterebilirsiniz. Bazen "OOP alamadım" değil, "Neden tüm bu sorunlara gittiğinizi anlamıyorum"
JeffO

4
Gerçekten nesne yönelimli programlaması mı gerekiyor, yoksa OpenFOAM'ı bir tür prosedürel şekilde kullanmak yeterli mi?
starblue

Bunu nesne yönelimli bir şekilde yapmak istiyor. En azından muhtemelen nesneler ve sınıflar olan apislerle nasıl arayüz kuracağını anlaması gerekiyor. (OpenFOAM ile hiçbir şey yapmadığımı unutmayın, bu biraz tahmin.)
Eric Pauley

1
Önceki posterime tamamen katılıyorum. OOP'un ne olduğu ve bu kütüphaneyi ne kullanması gerektiği konusundaki algınız birbirinden oldukça farklı olabilir. Bu kütüphanenin posta listesine başvuracağım ve bazı üst düzey kullanıcılara lib ile ilgili sorunlara nasıl yaklaştıklarını soracağım. Lütfen OOP'a 'öğretmeye' çalışmayın, sorununu çözmezken sadece yanlış anlaşılmaya yol açacaktır.
AndreasScheinert

Yanıtlar:


18

Kısa cevap: hayır.

Uzun cevap: "Basit bir yol" yoktur, çünkü OOP basit olmaktan uzaktır. Prosedürel programlama tamamen "değişkenler" ve "eğer o zaman git" ile ilgilidir. Diğer her şey sözdizimsel şekerdir, ancak bu dört şey prosedürel programlama ile ilgilidir. Onları aldıktan sonra hiçbir şey sizi durduramaz.

OOP değişkenleri ve kod parçalarını organize etmenin bir yoludur. OOP'yi tanımlamak için kaç desen var? 25? 30? OOP'yi farklı dillerden ve arka planlardan öğrenen öğretmenler bile kendi tanımları üzerinde anlaşamıyorlar, bu yüzden ... bu nasıl basit olabilir?

Buna nasıl geldiğini bilmiyorum, ama annen benimkine benzer bir deneyime sahip olduğundan, sana nasıl geldiğimi söyleyebilirim.

C'de çok büyük bir projede program yapıyordum. 1988 idi. Birçok programcı, diğer işlere karışmaktan kaçınmak ve iyi bir görev ayrımı yapmak zorluğu ile modül ve kütüphaneler organize ediyor.

İlişkili tüm küresel verileri yapılara yerleştirmek ve bu yapıya geri çağrıların gerekli olduğu bazı işlev işaretlerini yerleştirmek için bir "çözüme" geldik. Bu şekilde dediğimiz şeyi io_mask(bir tür metin modu iletişim kutusu) graphic_managervb. Genelleştirdik .

1996 yılında bu yapıların "sınıflar" olarak adlandırıldığını ve bu işlev işaretleyicilerinin yerini üye işlevi ve sanal işlevlerle ya da eski projeyi yenileyen diğer programcılar tarafından başka davranışlara (davranışlar olarak adlandırılır) bağladığını keşfetmek çok kolaydı.

Ben başladığımda ben OOP anlamaya başladı hissetmek ayırım, polimorfizm ve çalışma zamanı tanımlı davranışları: bunun gereğini.

Bugün OOP ile çalışıyorum, ancak hizmet etmek için bir doktrin olarak düşünmüyorum: sadece uzun açıklamalara ve açıklamalara ihtiyaç duymadan birlikte konuşmamıza izin veren bir "ortak deyim" (... kümesi) . Aslında, her şeyden çok bir "kongre". Sonuçta, tüm OOP yaptığı -again- "eğer o zaman git": sadece "çok katmanlı" yapar. Böylece deyimler üzerinde soyutlama ve deyimler.

Boşver onları. Onlara olan ihtiyacı hissetmeyene kadar açıklamaya bile çalışmaz: onları basit şeyler yapmak için karmaşık bir yol olarak hissedecektir. Ve haklı ... yaptığı şey - aslında - basit olana kadar.

Üstte sadece dört şey varsa kimse "masa düzenlemeyi" düşünmeyecektir. Üstteki şeyler birbirine müdahale etmeye başladığında mantıklı. OOP'un gelme zamanı.

C ++ ile çalışmak için OOP'ye ihtiyacınız yoktur. C ++ standart kitaplığının tamamı OOP açısından tasarlanmamıştır (onunla işbirliği yapabilmesine rağmen) ve C ++ Java değildir.

Tüm tecrübelerime göre, en kötü C ++ öğretmenleri ve C ++ programcıları Java'dan gelenlerdir, her şey hakkındaki tüm önyargılarını OOP değildir, C ++ gibi bir dili (sadece) OOP için denatüre ederler.

C ++: Accelerated C ++ ' a yaklaşmak isteyenler için iyi bir kitap önereyim: önceden tanımlanmış bir doktrini takip etmeden sizi C ++ deyimlerine getirecektir.


OpenFOAM ile çalışmak için c ++ bilmesi gerekiyor, bu yüzden yakında dersleri kesinlikle bilmesi gerekiyor. Bence arkasındaki temel fikirleri anlıyor. Bazı nedenlerden dolayı, 'nokta yapısı' üzerinde sıkışıp kalıyor gibi görünüyor. (örn. System.out.println (), c ++ hariç)
Eric Pauley

@Zonedabone, sınıfların, sanal yöntemlerin vb. İşlevsel bir anlambilimini anlamak (ve açıklamak) oldukça kolaydır (bu cevabın da belirttiği gibi). Bu bir roket bilimi değil. Sadece işe yaramaz ve alakasız OOP "soyutlamalardan" uzak durun.
SK-logic

1
OOP (sıralama) basit, C ++ "OOP" değil. Smalltalk alın (nesnenin örnek değişkenleri ve bir sınıfı vardır, sınıfın yöntemleri vardır, ileti gönderirsiniz ve bir yöntemle hizmet verilen nesne, temelde budur). Prototip odaklı OOP bile sınıfları denklemden çıkarabilir. --- Bu yüzden (mümkünse) sadece alt kümeyi (özel, korumalı, sabit, çoklu kalıtım yok, tüm yöntemler sanal, tüm yıkıcılar sanal vb.) Kullanmanızı tavsiye ederim, böylece model daha basittir. Daha sonra başka şeyler ekleyin.
herby

7

Eski bir arkadaşım OO programlamayı bildiği en kısa tanıma sahip olduğumu iddia etti ve bunun bazı insanlar için çalıştığını (diğerleri için değil) buldum:

Nesneye yönelik programlama görüşlü bir veridir. Sandalyeyi hareket ettirmiyorsun, sandalyeden kendini hareket ettirmesini istiyorsun. Listeyi sıralamazsınız, kendisini sıralamasını istersiniz (belki bir ipucu ile). Vb.

Fikir, kişinin programında işlerin nasıl yapıldığını farklı düşünmesini sağlamaktır.


+1 Bu aynı zamanda "Sor, Söyleme" ile de devam eder.
user949300

"Söyle, sorma" demek istiyorsun. :)
Ramon Leon

3

Ona gerçek dünyadaki nesneler gibi nesneleri düşünmesini söyleyin. Örneğin, tüm dünya bir tür işlevsel programlamayla (muhtemelen tanrının dilinde Lisp) yapılan nesne yönelimli programlamanın (C ++ 'da) bir karışımı olabilir.

Örneğin çim biçme makinesi gibi bir nesneyi alın, belirli bir özelliği vardır ve belirli bir şey yapabilir. (nesne ve sınıf)

O zaman ona, sahip olduğunuz çim biçme makinesinin bir uzantısı olan daha iyi bir çim biçme makinesinden bahsedin. Ona daha iyi olduğunu söyleyin ama yine de aynı mekanizmayı (miras) temel alıyor.

O zaman ona kendinden bahset. Ona bazen çim biçme uzmanı olabileceğinizi söyleyin ama aslında bir programcısınız ve bunu yaşamak için yapın. Bu, aynı anda iki farklı varlık gibi davranırsınız. Bu polimorfizm.

Bunu elde ettiğinde, ona bu şeyleri öğrenmek zorunda olduğu dilde nasıl uygulanacağını anlat (C ++).

O zaman söyle, eğer bilgisayar dünyasında bu dünyanın bir simülasyonunu yazmak zorundaysa, bunu nasıl yapacağını öğrenmesi gerekecek.

Gerçek dünyadaki düşüncelerini program koduna nasıl dönüştüreceğini bildiğinde. nesne yönelimli programlama dilinde nasıl programlanacağını öğrenirdi.


@Zonedabone sorun değil, OOP öğrenmek için 1 yıl sürdü (kendi başıma öğrendim), Ama aynı örnekleri kullandım :) ve aniden aydınlandım. LOL
Aniket Inge

5
Hayır hayır Hayır Hayır Hayır! Deneyimlerime göre "gerçek dünyadaki nesneleri düşün", OOP'u zaten anlamayan birine anlatmanın korkunç bir yoludur. OOP tuhaf yanlış anlamalara ve yanlış uygulamalara yol açar ve çoğu zaman sadece karışıklığı derinleştirir.
JSB ձոգչ

Çok Biçimlilik Kuralları Optimizasyon gibidir. Kural A) Yapma., Kural B) (Sadece uzmanlar için!): Henüz yapma.
mattnz

1
JSB ձոգչ ile anlaşın. OOP'u açıklamanın gerçekten yaygın bir yolu, ama bence gerçekten yararsızdır. Programlamadaki nesneler gerçek hayatta nesneler gibi değildir.
Rowan Freeman

Prosedürel ve OO programlama arasındaki fark, esas olarak prosedürel programlamada, bir sırayla yapılacak şeylerin bir listesini ve OO'da durum hakkında düşünmenizdir. İnsanlar katı bir devlet kavrayışına sahip olursa, OO'yu yararlı bir şekilde kullanabilirler. Gerçek dünyayı modellemeye çalışmaktan çok daha fazlası.
Pieter B

1

Montajcı ve COBOL'dan Ruby'ye gittim.

Başlangıçta bana yardımcı olan, aslında örnekler yaratan sınıflar kavramını göz ardı etmekti.

Sadece kod ile başlayın. Bir sınıf var ama sadece sınıf düzeyinde yöntemler var. Yöntemler içinde birçok şey parametreler, değişkenler, şartlar, diziler, dizeler, Boolelar vb. İle ilgilidir. Bu şeyler tanıdık olmalıdır.

Yani bu noktada sınıf, ilgili tüm yöntemlerinizi koyabileceğiniz bir yer olarak amaca hizmet ediyor gibi görünebilir. Ona bir kap veya kütüphane deyin, ona daha aşina olacaktır.

Açıkçası kodun yönetilebilir olması için bölümlere ayrılması gerekir, böylece her alandan birine sahip olursunuz. Örneğin, bir bilgisayardaki bir dizi yardımcı programı yönetmek için, bir hesap makinesinin tüm kodunu tek bir yere koyabileceğiniz bir hesap makinesi sınıfınız olabilir. Eğer senin pc sadece 1 hesap makinesi varsa o zaman sınıf seviyesi yöntemleri yeterlidir.

Bu bir başlangıç.

ok şimdi birden fazla hesap makinesi açmak ve her birinin nasıl göründüğünü ve ekranda nerede olduğunu değiştirmek istediğinizi düşünün. Şimdi 'screen_location' gibi bir hesap makinesi yöntemine sahip olamazsınız, çünkü bunlardan birkaçına sahipsiniz ve her örneğin kendi konumu var ... her örnek ... tamam, bu yüzden örneklere ihtiyacımız var.

Not: Terimlerim c ++ 'dan değil, bu yüzden çevirmeniz gerekebilir.


0

Kavramlarınızı ne kadar bölmek istediğinize bağlı olarak iki adımda ya da belki dört adımda açıklayacağım.

Adım 1: Onu yapılara tanıtın. Fortran veri türlerinden yapılara oldukça küçük bir adım. Adım 1a: Standart bellek ayırma ve işaretçiler altında olduğundan emin olun.

Adım 2: Sadece bu yapılarla ilişkili prosedürleri ekleyin. Adım 2a: daha küçük yapıları "saran" daha büyük yapıların inşasına dayalı kalıtım ekleyin.

Bir Fortran programcısı için, "vay" faktörü derleyicinin izlemesi gereken çok şey olacaktır. Evet. Derleyiciler bunun için ...


Bence nesnelerin arkasındaki süreci anlıyor. Sadece bir nedenden dolayı noktaları anlamıyor. ('.') Gerçekten tuhaf. Her şeyin manuel olarak yapılması gerektiğinde kodlamaya başladığınızda (tahsis ve şeyler), modern dillerin iç işleyişlerinin nasıl çalışacağını bilmeden nasıl çalıştığını biliyorsunuz.
Eric Pauley

0

Tezini on yıl önce yapmışsa, muhtemelen Fortan 90 veya 95'i kullandı, bu durumda türetilen veri türleriyle ilişkili olarak bunun hakkında konuşmak. Fortran 77'yi kullanması yeterince uzun olsaydı, onu Fortran 90'daki türetilmiş veri türleriyle tanıştırın ve daha sonra bunun hakkında konuşun ...

Enkapsülasyonu kavrayana kadar polimorfizm ve kalıtım içine girmezdim, çünkü özel durumlar ve kapsüllemenin uzantıları olarak görülebilirler. Muhtemelen ona serbest fonksiyonlara veya statik sınıflara izin veren bir dilde başlardım.


0

Yapıları anladıktan sonra, bir sonraki kilit noktanın, nesne yönelimli programlamanın, bir şeyin geçirilebileceği yöntem kümesini, aslında buna uygulanabilecek yöntemler kümesiyle sınırlandırmanın bir aracı olduğunu kabul etmek olacağını düşünüyorum. şey.

Nesne yönelimli olmayan programlamada, bir Ağaç ve LinkedList için ayrı veri türleri kullanılıyorsa, her birine bir düğüm eklemek için farklı yöntemler kullanılması gerekir. Sigara nesne yönelimli diller genellikle bir iki yöntem isim çalıştı Squawk olsaydı AddItemherhangi verilen isim sadece bir yönteme başvurabilir beri dolayısıyla gibi yöntem adları oluşturmak için bir lider, AddTreeItem, AddLinkedListItem, RemoveTreeItem, vb Böyle bir yaklaşım çalışır, ancak bunun biraz çirkin. Kavramsal olarak, yöntemler AddTreeItemve RemoveTreeItembirbirine ait gibi görünüyor, ancak isimler bu şekilde sıralanmıyor. Bir gibi isimler yazabilirsiniz TreeAddItem, TreeRemoveItem,LinkedListAddItemancak bu, her yöntem çağrısının başlangıcına çok fazla "fazla gürültü" getirecektir. Tipik bir programdaki yöntem çağrılarının büyük çoğunluğunun üç temel bilgi parçası olacaktır: (1) kaynak kodun hangi bölümü yöntemi içerir; (2) bölümdeki yöntemlerden hangisinin kullanıldığı; (3) hangi veri parçası üzerinde işlem yapılıyor? Çoğu durumda, üzerinde işlem yapılan verilerin türü, yöntemin hangi kod bölümüne ait olduğunu tanımlamak için yeterli olacaktır, bu nedenle yukarıdakinin (1) kısmı yedeklidir. Bir ifadenin başlangıcında materyali başka bir yerde bulunan materyalden görsel olarak tanımlamak daha kolaydır, bu nedenle gibi bir kodlama / adlandırma stili TreeAddItem(myTree, whatever), en az yararlı bilgiyi asal noktaya yerleştirir.

Bunun aksine, nesne yönelimli programlama kullanarak, yöntemler Tree.AddItemvb. Gibi etkili bir şekilde adlandırılır ve şöyle bir deyim myTree.AddItem(whatever)derleyicinin "Hmm ... myTreetüründe olduğunu " söylemesine neden olur Tree, bu nedenle bu kod çağırılmalıdır Tree.AddItem(). belirtmek Tree.çağrılırken AddItemderleyici türünü bilir çünkü myTree. kavramsal olarak, böyle bir açıklama myTree.AddItem(whatever)eşdeğerdir Tree.AddItem(myTree, whatever)aslında, dillerin çoğu fonksiyon özelliği ilk parametreyi ihmal ve bunun yerine var; ve bazı nesne yönelimli diller eşdeğer olarak her iki formları izin verebilir gibi bir sınıfta tanımlanan yöntemler Treeörtük türünde bir parametre almak Treeve benzeri bir ad atamak this, selfya Me.

Nesneye yönelik programlama dilleri çoğu zaman birçok uygulamada çok yararlı olan kalıtım, sanal işlevler vb. Gibi çeşitli ek özellikler içerir, ancak bu özellikler olmasa bile işlevleri üzerinde çalıştıkları şeylere göre gruplama yeteneği çok yararlıdır.


0

Nesne yönelimli programlama - burada ilgili sınıf yönelimli anlamda - bir veri sunumunu, onu manipüle eden kodla birleştirmektir. Aşağıdaki şeylerin anlamlı olması mantıklıdır:

  • Eşleştirme: üzerinde çalıştığı veri gösteriminin yanında bir işlem tanımlama

  • Geç bağlama: çalışma zamanında veri gösterimi ve davranışı bir arada seçme

  • Kapsülleme: verinin inşaat yoluyla geçerli olmasını ve daha sonra geçersiz kılınmamasını sağlamak

Bu kadar. Gibi herhangi bir teknoloji, özünde sadece birçok gelişmenin takip edildiği bir kolaylık, bu. Temelleri anladıktan sonra, geri kalanı zamanında takip eder.


0

BlueJ'i indirmenizi, 20 dakika boyunca oynamayı ve 20 dakika boyunca onunla oynamayı öneririm.

Sınıfları, arayüzleri ve kalıtsallığı görselleştirme şekli o kadar açık ve sezgiseldir ki, bir şeyi - her şeyi uygularken size anında bir anlayış kazandırır.

Hatta bir sınıf ve bir nesne arasındaki farkı doğrudan gösterir

OO tasarım desenleri hakkında derin bir fikir vermeyecek, ancak kavramlara harika bir genel bakış sunacaktır.


0

Katkılarımı, programlama paradigmaları ile bu paradigmaları uygulayan programlama dilleri arasındaki ayrımın bir hatırlatıcısı olarak eklemek istiyorum.

Bence, F ++ kullanıcısına C ++ ile nesne yönelimini açıklamanın en iyi yolu, adım adım ilerlemek olacaktır:

İlk olarak, kullanıcıyı Fortran 77'de nesne benzeri yapıların nasıl geliştirileceğini göstererek tanıdık bir ortamda nesne yönlendirme kavramına tanıtın - örneğin, B. Patton "Nesne yönelimli Fortran 77 (bir uygulayıcı view) "SIGPLAN Fortran Forum 12, 2 (1993), s. 23-24 ve buradaki referanslar.

Ardından, bu yapılar ile C ++ sınıfları ve yöntemleri arasında bir yazışma oluşturun.

Son olarak, C ++ 'nın OO programlamayı kolaylaştırmak için sağlayabileceği ek özellikleri tartışın.


0

Pascal'daki ilk eğitimimden bir nesneye yönelik dile ilk geçiş yaptığımda, '.' sorun benim için en büyük engeldi. Üstesinden gelmek yıllar aldı.

Bir değişkenin başka bir değişkene ait olması, özellikle de bunları işaretçiler olarak düşünmeye alışkın olduğunuzda, gerçekten de sezgisel değildir. Tökezleyen blok benim için:

  • Temelde bir işaretçi olan, işaret eden başka bir işaretçiye sahip olan, ana işaretçiden farklı bir şeye çözümleyen bir şeyin anlamı nedir?

Benim için aha anı, üst düzey işaretçinin temelde sadece bir ad alanı olduğunu fark ettiğim zamandı.

İdeal olarak başlamak için nokta gösterimini kullanmadan işlevlerini adlandırmasını gerektiren bir grup kod yazmasını öneririm. Sonra onu nokta gösterimini kullanarak yeniden yazmayı deneyin.

Bu egzersizi yapmak onu ilk "Bu ne büyücülük?" engel.


-2

Daha önce açıklamamda bana yardımcı olan önemli bir içgörü, bir sınıfın birden çok örneğine sahip olabilmenizdir. Bunu "çizimler" veya "kalıplar" ve "kopyalar" olarak açıklamaya çalışın ve herhangi bir yere götürüp götürmediğine bakın.


Downvotes gerçekten anlamıyorum. Bu açıklama yolu bana birkaç kez yardımcı oldu. Gümüş bir mermi olduğunu söylememek, ama insanlar buna takılıyor gibi görünüyor.
Alexander Torstling
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.