Algoritmalar bilgisayarın ne yapması gerektiğini tanımlar. Yapı, algoritmanın [kaynak kodunda] nasıl düzenlendiğini açıklar. OOP, belirli "nesne yönelimli" yapılardan yararlanan bir programlama stilidir.
Algoritma kitapları genellikle yapıya değil algoritmaya odaklandıkları için OOP'dan kaçınırlar. Büyük ölçüde yapıya dayanan kod parçaları, bir algoritma kitabına koymak için zayıf örnekler olma eğilimindedir. Benzer şekilde, OOP kitapları genellikle algoritmayı engeller, çünkü hikayeyi karıştırırlar. OOP'nin satış noktası akışkanlığıdır ve bir algoritmaya sabitlemek daha katı görünmesini sağlar. Her şeyden çok kitabın odağıyla ilgili.
Gerçek hayat kodunda, her ikisini yan yana kullanacaksınız. Bilgisayar problemlerini algoritma olmadan tanımlayamazsınız ve yapı olmadan iyi algoritmalar yazmanın zor olduğunu görürsünüz (OOP veya başka türlü).
Nerede bulanıklaştıklarına bir örnek olarak Dinamik Programlamayı ele alalım. Bir algoritma kitabında, bir dizide homojen bir veri kümesinin nasıl alınacağını ve bir çözüme ulaşmak için Dinamik Programlamanın nasıl kullanılacağını açıklarsınız. Bir OOP kitabında Ziyaretçi gibi bir yapıya rastlayabilirsiniz, bu da bir dizi heterojen nesne üzerinde rasgele algoritmalar yapmanın bir yoludur. DP kitap örneği, nesneler üzerinde genel olarak aşağıdan yukarıya doğru çalışan çok basit bir Ziyaretçi olarak düşünülebilir. Ziyaretçi kalıbı bir DP sorununun iskeleti olarak düşünülebilir, ancak et ve patatesleri kaçırır. Gerçekte, sık sık ikinize de ihtiyacınız olduğunu göreceksiniz: Veri kümenizdeki heterojenlikle başa çıkmak için Ziyaretçi kalıbını kullanırsınız (DP bu konuda kötüdür) ve çalışma zamanını en aza indirmek için algoritmanızı düzenlemek için Ziyaretçi yapısı içindeki DP'yi kullanırsınız (Ziyaretçi kokan
Ayrıca tasarım modellerinin üstünde çalışan algoritmalar görüyoruz. Küçük bir alanda sözcük örnekleri daha zordur, ancak bir kez yapınız varsa, o yapıyı manipüle etmeye başlarsınız ve bunu yapmak için algoritmalar kullanırsınız.
Sadece OOP tarafından sunulabilecek ve çözülebilecek bazı sorunlar var mı?
Bu cevaplamak düşündüğünüzden daha zor bir soru. İlk siparişe göre, herhangi bir sorunu çözmek için OOP'a ihtiyacınız olan hiçbir hesaplama nedeni yoktur. Basit kanıt, her OOP programının kesin olarak OOP olmayan bir dil olan derlemeye indirilmesidir.
Bununla birlikte, daha büyük şemada, cevap evet doğru utangaç olmaya başlar. Yalnızca hesaplama yöntemleri ile nadiren sınırlanırsınız. Çoğu zaman denklemi etkileyen iş ihtiyaçları ve geliştirici becerileri gibi şeyler vardır. Bugün birçok uygulama OOP olmadan yazılamadı, OOP görev için bir şekilde temel olduğu için değil, OOP tarafından sağlanan yapı projeyi yolda ve bütçede tutmak için gerekliydi.
Bu, gelecekte komik yeni bir yapı için OOP'den asla vazgeçmeyeceğimizi söylemez. Sadece şaşırtıcı derecede büyük bir programlama görevi için bugün araç kutumuzdaki en etkili araçlardan biri olduğunu söylüyor. Gelecekteki sorunlar, gelişime farklı yapılar kullanarak yaklaşmamıza neden olabilir. Birincisi, sinir ağlarının "Nesneye Yönelik" olabileceği veya olmayabileceği çok farklı bir geliştirme yaklaşımı gerektirmesini bekliyorum.
Yakın gelecekte OOP'nin algoritma tasarımcılarının düşündüğü gibi yok olduğunu görmüyorum. Bugüne kadar, olağan örüntü, birisinin OOP'den yararlanmayan bir algoritma tasarlamasıdır. OOP topluluğu, algoritmanın OOP yapısına gerçekten uymadığını ve gerçekten gerekmediğini fark eder, bu nedenle tüm algoritmayı bir OOP yapısına sararlar ve kullanmaya başlarlar. Düşünün boost::shared_ptr
. İçeride kalan referans sayma algoritmaları shared_ptr
OOP dostu değildir. Bununla birlikte, desen shared_ptr
, algoritmaların yeteneklerini OOP yapılandırılmış bir formatta ortaya çıkaran bir OOP sarmalayıcısı oluşturulana kadar popüler hale gelmedi . Şimdi, o kadar popüler ki C ++, C ++ 11 için en son özellik haline getirdi.
Bu neden bu kadar başarılı? Algoritmalar problemleri çözmede harikadır, ancak bunları nasıl kullanacaklarını anlamak için genellikle önemli bir ilk araştırma yatırımı gerektirirler. Nesneye Dayalı geliştirme, bu tür algoritmaların paketlenmesinde ve daha az başlangıç yatırımı gerektiren bir arayüzün sağlanmasında çok etkilidir.