Nesneye yönelik programlama nasıl yapılır? [kapalı]


13

Her zaman prosedür dillerinde programladım ve şu anda nesne yönelime geçiyorum. Karşılaştığım temel sorun, nesne yönelimini etkili bir şekilde uygulamak için bir yol göremiyorum. Demek istediğimi anlatacağım. PHP ve C'yi öğrendiğimde pratik yapmak oldukça kolaydı: sadece bir şey seçmek ve o şey için bir algoritma düşünmek önemliydi.

Örneğin PHP'de, os oturmak ve düşünmek önemliydi: "iyi, sadece pratik yapmak için, insanların ürün ekleyebileceği bir yönetim alanı ile bir uygulama oluşturmama izin verin". Bu oldukça kolaydı, bazı kullanıcıları kaydetmek, kullanıcılara giriş yapmak ve ürünleri eklemek için bir algoritma düşünmekti. Bunları PHP özellikleriyle birleştirmek pratik yapmak için iyi bir yoldu.

Şimdi, nesne yönelimlerinde birçok ek şeyimiz var. Bu sadece bir algoritma hakkında düşünmek değil, gereksinimleri daha derinlemesine analiz etmek, kullanım senaryoları yazmak, sınıf diyagramlarını, özelliklerini ve yöntemlerini bulmak, bağımlılık enjeksiyonunu ayarlamak ve birçok şey.

Ana nokta, nesne yönelimi öğrenirken, iyi bir tasarımın çok önemli olduğu, prosedür dillerinde ise belirsiz bir fikrin yeterli olduğu yönündedir. Ben değilim değil prosedürel dilde yazabiliriz söyleyerek iyi nesne yönde bile pratik için iyi bir tasarıma olmadan gitmek mümkün değil gibi görünüyor iken, pratik uğruna bunun mümkün olduğunu sadece, tasarım olmadan yazılım.

Bu bir sorun gibi görünüyor, çünkü her pratik yapacağımda tonlarca gereksinim, vaka kullanımı vb. Her uygulamada bir uygulama için tek bir fikrim var.

Bu nedenle, nesne yönelimi uygulamak için iyi bir yol nedir?


1
Üniversitemin ilk yıllarında OOP'a büyük bir giriş Bruce Eckel'in "Java'da Düşünme" adlı kitabıydı. Hem yeni başlayanları programlamak hem de prosedürel gelişim geçmişlerinden gelen insanlar için tavsiye edilen okuma idi - belki size yardımcı olacaktır.
Ivaylo Slavov

3
PHP nesne yönelimlidir; sadece kullanmıyorsun. php.net/manual/en/language.oop5.php
Robert Harvey

Aynı uygulamayı bir OOP yaklaşımı kullanarak tekrar uygulayabilirsiniz. Sonuçta, bu sadece bir araçtır. Bir GOF kitabına sahip olmak ve mevcut prosedür kodunuzu nesne yönelimli olarak yeniden düşünmeye çalışmak için aşağıdan tavsiye de iyi bir uygulama olabilir.
JensG

Başlangıçta küçük oyunlar (grafiksiz), kart oyunları veya benzeri şeyler yapın, bu oyunlarda sınıfları yeniden kullanmaya çalışın. stackoverflow.com/questions/1301606/…
grizwako

Yanıtlar:


20

Şimdi, nesne yönelimlerinde birçok ek şeyimiz var.

Hayır yapmazsın ...

Bu sadece bir algoritma hakkında düşünmek değil, gereksinimleri daha derinlemesine analiz etmek, kullanım senaryoları yazmak, sınıf diyagramlarını, özelliklerini ve yöntemlerini bulmak, bağımlılık enjeksiyonunu ayarlamak ve birçok şey.

Nesneye yönelik programlama yapmak için bunların hiçbirine gerek yoktur.

Bu oldukça kolaydı, bazı kullanıcıları kaydetmek, kullanıcılara giriş yapmak ve ürünleri eklemek için bir algoritma düşünmekti.

Tüm nesne yönelimli programlama, bu adımları yapmak için algoritmaları düşünmek yerine, bu adımları yapmak için hangi nesnelerin gerekli olduğunu - hangi işlevselliği istediğiniz, bunu yapmak için hangi durumun gerekli olduğunu ve ne tür bir arayüzü ortaya çıkarmak istediğinizi düşünürsünüz. kullanıcıya. Tıpkı prosedürel programlamada yapmanız gerektiği gibi.

Tek fark, ihtiyacınız olan işlevlere ve nasıl çalıştıklarına odaklanmak yerine, işlevsellik ve durumun sorumluluklar arasında nasıl gruplandığına ve bu sorumlulukların nasıl etkileşime girdiğine odaklanmanızdır.

Uygulama nasıl yapılır? Prosedürel programlama uyguladığınız gibi: bir problem seçin ve problemi sınıf demetleri kullanarak çözün. Bunun nasıl emildiğini anlayın, öğrenilen derslerle tekrarlayın.


3
+1 "Bunun nasıl emildiğini anlayın" Bu şekilde kodlarım: Utanç ve kendinden nefret dolu ... her zaman önceki projelerden öğrenmek için savaşıyoruz.
WernerCD

1
Yaklaşımı seviyorum. Her şeyi aynı anda aşırı karmaşıklaştırmak ve öğrenmeye çalışmak yerine, daha küçük adımlarla başlayın ve kazandığınız tüm bilgileri tekrarlayın.
superM

6

İyi soru. Tabii ki, söylediğiniz şey OOP'u uygulamanın aslında tüm bu şeyleri (ihtiyaç analizi, kullanım örnekleri, tasarım kalıpları, vb.)

Tavsiyem, uygulama oturumlarınıza iki şeyi aklınızda tutarak başlamak olacaktır: test odaklı geliştirme ve tek sorumluluk ilkesi .

Sonra PHP / C ile yaptığınız gibi başlayın: bir fikir bul, bunun için neye ihtiyacınız olduğunu düşün ve bunları birbiri ardına uygula. Bununla birlikte, testlerden başlamanız gerektiğini (aksi takdirde test edilebilirlik hemen acı çektiği için uygun arayüzleri tanımlamaya zorlar) ve TDD'nin kırmızı-yeşil-refactor döngüsünü ima ettiğini unutmayın. Başka bir deyişle, küçük bir işlevsellik var ve işe yaradığında, baştan başaramazsanız (ki yapmayacaksınız) uygun bir OO tasarımı elde etmek için refactorunuz.

Bu yeniden düzenleme adımını yaparken kendinize daima SRP'yi hatırlatın. Nesnenize ikinci bir sorumluluk eklediyseniz, yeni bir şey yaratmanın zamanı geldi.

Böyle geliştiğinizde, nihai çözümünüzün başladığınızdan çok farklı olacağını bilmeniz gerekir. Öğrenme eğriniz de oldukça dik olacaktır. Örneğin, bir Fabrika modelinin ne olduğunu öğrenmeyeceksiniz, bunun yerine sınıfınızın örneklerini farklı şekillerde oluşturan bir şeye olan ihtiyacı anlayacaksınız. Dolayısıyla, nesne yönelimli tasarım modellerini hiç duymadıysanız, paralel olanları biraz okumak iyi olur.


1
Yani temelde "TDD ve GOF öğren" diyorsunuz
Robert Harvey

3

OOP'da yeni başlıyorsanız, herhangi bir gerçek dünya sistemine bakarak ve nesnelerin ne olduğunu ve aralarındaki ilişkinin ne olduğunu ve hangi yöntemleri / arayüzleri destekleyebileceklerini düşünerek kendinizi eğlendirebilir ve "pratik yapabilirsiniz". onları sınıf hiyerarşisinde ve somutlaştırılmış nesnelerin bir koleksiyonu olarak nasıl temsil edeceğiniz ve nesne sahipliği ilişkilerinin ne olacağı vb. (not: Yukarıda "algoritmalar" kelimesinden hiç bahsetmiyorum). Bir şey kodlamayı düşünmeden önce birçok diyagram çizin (biraz UML veya benzeri bir şey öğrenin).

Bu , muhtemelen herhangi bir OOP tasarımındaki en önemli sınıflandırma olan IS-A ve HAS-A ilişkilerini daha iyi anlamanıza yardımcı olacaktır (ve buna rağmen, birçok tecrübeli OOP dil programcısının mücadele ettiği bir şey gibi görünüyor. ). IS-A / HAS-A'ya hakim olursanız, IS-UYGULANAN ŞARTLAR (OF-IS-KIND-OF-A: ^ olarak da tanımlandığım) vardır.

Cidden, süpermarkete bir sonraki gezi, sadece birinin size bir OOP simülasyonu yazma işi verdiğini hayal edin ...


Biyologların radyo etiketli kaplanları takip etmesine yardımcı olacak bir yazılım yazıyorsanız, bir kaplanın bir hayvan ve bir çizgili olması gerçeğe göre önemli değildir ve yazılıma yansıtılmaz. Ama eğer bir kaplanı soyut olarak ve is-a ve has-a açısından düşünürseniz, elde ettiğiniz budur.
Michael Shaw

1
Ama bu yüzden bu tür bir egzersizi öneriyorum, çünkü kaplanların ve şeritlerin iyi bir çözümle alakasız olduğu açıkça görülmelidir, oysa izlenen bir koordinatın GPS, ataletsel nagivasyon veya radyo üçgenlemesi olup olmadığı gibi şeyler izleyici OOP tasarımının yakalaması gereken bir şey olabilir. "Gerçek dünya sistemine bak" dediğimde, tamamen fiziksel niteliklerin ötesine bakmak demek istiyorum. Örneğin, süpermarket simülasyonunun sadece belirgin "alışveriş arabaları" ve "alışveriş yapan kullanıcılar" değil, "sıralar" gibi daha soyut kavramları da içermesi gerekir.
timday

1

C zamanlarımdan (geçmişte çok uzaklarda) hatırladığım şey, işlevleri ve prosedürleri sorumluluklarına göre farklı dosyalara ayırırdık. Bunun mükemmel ya da başka bir şey olduğunu iddia etmiyorum, ama aslında nesne yönelimli dillerde programlamaya başladığımda iyi bir başlangıç ​​noktasıydı. Belki de dosyaları nesnelere dönüştürerek başlayabilirsiniz.

OOP kadarıyla, gerçekten uygulama ve iyileştirme çabası ile ilgilidir. Nadiren herkes onu hemen yerden alır. Böylece, iterasyonlar projenin yaşam döngüsü boyunca gerçekleşir.


0

Peter Coad'ın 1990'larda yaptığı gibi bir terminoloji, nesne odaklı analiz ve nesne odaklı tasarım ekleyelim .

Bunlar birlikte kod yazma ve test etme noktasında programlayıcıyı (doğru şekilde) destekleyebilen bir yazılım mühendisliği disiplini OOAD oluşturur. Nesneye yönelik programlama daha sonra uygun düzeyde ayrıntı düzeyine, proje düzeyinde belirtilen fonksiyonel hedefleri ve tasarım gereksinimlerini karşılamak için programlama dili özelliklerinin ustaca kullanımına sahip olabilir.

Bazen bu tek kişilik bir projedir ve daha sonra tüm şapkaları giymelisiniz (ama aynı anda değil). Kendi kişisel projelerim için test odaklı geliştirmenin büyük bir hayranıyım (Frank'in tavsiyesine bakın), ancak yalnızca nesneye yönelik yazılım geliştirme ile ilgili değildir.

İyi bir sorumluluk bölümüne sahip bir ekip projesinde başarılı bir uygulama için bir anahtardır. Nesneye yönelik tasarım modellerinin ustaca kullanılması, kullanılabilir bir çerçeveyi paylaşmak için analiz, veri beslemeleri ve iş mantığı için gereken görünür arayüzleri sınırlandırarak ekip anlayışına yardımcı olur.


0

"iyi, sadece pratik yapmak için, insanların ürün ekleyebileceği bir yönetim alanı ile bir uygulama oluşturmama izin verin". Bu oldukça kolaydı, bazı kullanıcıları kaydetmek, kullanıcılara giriş yapmak ve ürünleri eklemek için bir algoritma düşünmekti.

Neden aynı şeyi sadece bu kez kullanıcı nesneleri ve ürün nesneleriyle yapmıyorsunuz? Ayrıca hem yordamsal hem de OO'yu destekleyen bir dil kullanıyorsanız, bir nesne nesnesi gibi yordamsal standart kitaplığa dayalı nesneleri uygulamaya çalışabilirsiniz.

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.