Projem Nesne Oryantasyonu olmadan hayatta kalabilir mi?


9

Bazı sınıfsal sayısal problemleri çözecek küçük bir MATLAB paketi yazıyorum. Algoritmanın 3 aşaması vardır ve kullanıcının her aşama için 5 seçeneği vardır. Tüm sorunu işlev ve 3 anahtar durumu (her algoritma aşaması için bir tane) kullanarak uyguladım . İyi çalışıyor ama daha fazla şey yapmayı (5'ten fazla seçenek ve bir aşama daha) yapmayı ve ayrıca bir Python portu yapmayı düşünüyorum (bazı insanlar ilgileniyor).20

Bir OOP çerçevesine (hiç de iyi değilim) dönüştürmem gerekip gerekmediğini veya sahip olduğum prosedür çerçevesine bağlı kalmam gerekip gerekmediğini (ki ben iyiyim) merak ediyordum. Prosedürel kodumda hiçbir fonksiyonun iki şey yapmadığından ve minimum çakışma olduğundan emin oldum (2 kod segmenti neredeyse aynı şeyi yapmaz).

Alanlarına daha uygun olduğunu düşünüyorsanız lütfen bunu SO'ya taşıyın.

Yanıtlar:


6

Yardım ettiği nesne yönünden yararlanmak için OOP çerçevesine dönüştürmeye gerek yoktur. İşlev sayısının, bu işlevler içinde ve arasında kod çoğaltmasından veya bu işlevlerin uzunluğundan daha az bir gösterge olduğunu unutmayın. (100 satırdan fazla kod içeren bir işlev, "iyileştirme potansiyeli" için tipik bir gösterge olacaktır.)

Nesne yönlendirmesinin yardımcı olacağı parçaları tespit edemiyorsanız, OOP çerçevesine dönüştürmek en iyi ilk adım olmaz. Bunun yerine, nesne yönelimine aşina olan birine neyin basitleştirilebileceğini veya geliştirilebileceğini sorun ve bunun neden basitleştirme veya iyileştirme olduğunu anlamaya çalışın.

Deal.II veya PETSc gibi bir çerçeve kullanmak istiyorsanız, sundukları işlevsellik sizin için yararlıysa, kendi kodunuzu daha iyi veya daha sürdürülebilir hale getireceğini düşündüğünüz için kullanmayın. Ancak zaten MATLAB çerçevesi içindesiniz, bunun yerine bir C ++ OOP çerçevesine geçmek istemeniz olası değildir. (MATLAB, muhtemelen bildiğiniz gibi tam OOP desteği sunar.)

Python portu için, sadece bir başlangıç ​​için mevcut bilginize dayanarak yapın ve daha iyi hale getirmek için yeterince öğrendikten sonra ikinci bir başlangıç ​​yapın.


Burada bir çerçeveye dönüştürmenin aşırı olduğunu kabul ediyorum. API'larının ve mimarisinin iyi tasarım örnekleri olduğunu ve rehber olarak kullanılmaya değer olduğunu düşünüyorum.
Geoff Oxberry

3

Bu soru Yığın Taşması için uygun olabilir. Bence burada da iyi bir uyum var çünkü hesaplama biliminde yaygın bir konu.

Algoritma oluşturma açısından, C kodunu okuyabilirseniz, bunu iyi yapan bir kütüphaneye iyi bir örnek PETSc'dir. Nesneye yönelik programlama stili, verilerin kapsüllenmesine yardımcı olabilir, ancak basit bir ilk adım olarak, bir sahne için her seçeneği ortak bir arayüze sahip bir işlev haline getirmek isteyebilirsiniz. Ardından, algoritmanız için, her aşama için bir işlevi girdi olarak iletin ve ana algoritmanın her aşama için işlevi çağırmasını sağlayın.


İlgimi çekti. PETSc'yi OOP'yi veya prosedürel kodlamayı öğrenmek için iyi bir kütüphane olarak mı öneriyorsunuz? OOP'u iyi yapan okunabilir bir kütüphane biliyor musunuz?
tahkikat

Bence PETSc büyük bir yazılım örneği ve genellikle çok iyi belgelenmiş. Hesaplamalı bilimde, PETSc, Trilinos, deal.II ve FEniCS'in iyi belgelenmiş olmak için iyi bir iş yaptığını düşünüyorum ve hepsi OOP tarzında yazılıyor. Onlardan OOP öğrenmeniz gerektiğini söylemekten çekinmeyin; muhtemelen önce bir ders kitabından öğrenip daha sonra gerçek dünya koduna bakmanız daha iyi olur.
Geoff Oxberry

2

Her şey nesneler tarafından iyi modellenmemiştir. düşünün , tipik olarak bir OO sistemi s'yi nesneler ve bir yöntem olarak ele alacaktır , ancak bu, ikili yorumlama işlevi olarak doğal yorumumuza karşılık gelmez ; birincisi , yöntemin tanımlandığı nesne olarak , ikincisi ise bu yöntemin argümanı olan doğal olmayan bir asimetri ortaya çıkarır (bu, Python gibi ve Plugan'daki klud'lara yol açar ).1+11+1.plus(1)1+1plus(1,1)1plus__plus____rplus__

Bu yüzden kare pimi yuvarlak deliğe zorlamanız gerektiğini hissetmeyin, eğer algoritma düz prosedürel şekilde iyi görünüyorsa, o zaman böyle tutun. OO sistemine dahil edilmesi gerekiyorsa, OO olmayan kodunuza her zaman bir OO arayüzü koyabilirsiniz. C ++ kodlayıcıları bunu her gün yapar (ve bunun için bile ödeme alır).

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.