OOP uzmanları için soru. - sayfa 3

 
Artyom Trishkin :

Yaratık.

Flora/Fauna

alt türler

görüş

Aile

vb.

Yani istiyor musun?

Bu, "Creature" temel nesnesinden basit bir miras.

Ancak daha derine inebilirsiniz - tek hücreli / çok hücreli var ve bunların hepsi yaşayanlar için. Ama cansız olanlar da var. Her şey, temel nesnenin özelliklerini bulmanız gereken ve zaten onlardan devraldığınız görevlere bağlıdır.

Eğer gerçekten kafanızı çarparsanız, atomlara ulaşabilir ve temel bir ana nesne arayışı içinde onları bileşenlere ayırabilir ve başlatabilirsiniz (dikkatle - fisyon reaksiyonu zincirleme reaksiyona dönüşebilir ve dünyanın yarısını yok edersiniz :))

Doğru. İlk bakışta, OOP kavramı bir hiyerarşi oluşturmak için idealdir. Ancak, OOP aracılığıyla oluşturulan hiyerarşi ile nasıl çalışılır? Bu, sınıflara ve içeriklerine erişim hakları nedeniyle bağlantılar arasındaki geçişlerle bir sözdizimi ve karmaşıklık denizidir. Burada sınıflara bölünmenin bir sonucu olarak genel gider başlar. OOP bir yandan bir hiyerarşi oluşturmayı mümkün kılarken, diğer yandan onunla çalışmayı son derece zorlaştırıyor.
 
Реter Konow :
Doğru. İlk bakışta, OOP kavramı bir hiyerarşi oluşturmak için idealdir. Ancak, OOP aracılığıyla oluşturulan hiyerarşi ile nasıl çalışılır? Bu, sınıflara ve içeriklerine erişim hakları nedeniyle bağlantılar arasındaki geçişlerle bir sözdizimi ve karmaşıklık denizidir. Burada sınıflara bölünmenin bir sonucu olarak genel gider başlar. OOP bir yandan bir hiyerarşi oluşturmayı mümkün kılarken, diğer yandan onunla çalışmayı son derece zorlaştırıyor.

Hayır. Just OOP, herhangi bir konumdaki hiyerarşinin herhangi bir üyesine çok basit erişim sağlar.

İlk olarak, gerekli minimum özelliklere sahip temel nesnenizi bulun.

Diğer nesneler ondan miras alır. Tekerleği yeniden icat etmekten kaçınmak için, temel nesneniz standart kitaplığın CObject sınıfından miras almalıdır. Bu, listelerin icadıyla dikkatiniz dağılmadan kendi nesne hiyerarşinizi oluşturmanıza olanak tanır.

CObject --> CBaseObject --> ihtiyacınız olan hiyerarşi.

CBaseObject içinde, bu nesneyi döndüren bir sanal yönteminiz olmalıdır. Daha sonra varislerin her biri sırasıyla bu yönteme sahip olacak ve tam olarak alt nesneyi döndürecektir. CObject temel sınıfının zaten böyle bir yöntemi vardır - Type() . Buna göre, CBaseObject'iniz aynı sanal metoda sahipse ve nesnenin tipini döndürüyorsa, o zaman bu tip ile hangi nesneye eriştiğinizi anlayabilirsiniz.

Tüm nesnelerinizin temel temeli gibidir. Ve hepsi kendi listelerinde saklanmalıdır - her liste yalnızca bir tür nesne içerir - balık, hayvanlar, insanlar, tanrılar, vb.

Yani, her alt tür için bir listeye ihtiyacınız olacak. Ve hiyerarşide takip eden listelerin yerleştirileceği bir liste olmalıdır. Bu listelerin her birinde, yine hiyerarşide bir sonraki listeler olmalıdır. Vb.

Yani, gerekli listeleri yerleştireceğiniz bir temel liste nesnesine de ihtiyacınız var. Ve bu temel listede bir Type() yöntemi olmalı ve içinde saklanan herhangi bir nesneyi indeksine göre döndürmenize izin veren bir yöntem olmalı. Ardından, bu yapılırsa, gerekli nesneyi döndüren herhangi bir listede otomatik olarak bir yönteminiz olacaktır.

Genel olarak, önce temel nesnenizi, ardından liste nesnesini düşünürsünüz. Liste nesneleri de icat etmenize gerek yok - zaten varlar .

Ve sonra - bir teknoloji meselesi. Ve sadece aradığınız nesnenin türünü bilmeniz gerekecek. Hiyerarşisinde birçok tür olacaktır ve bunların her biri sizin tarafınızdan bilinmektedir ve talep edip alabilirsiniz.

 

Bana göründüğü gibi - bu durumda OOP'nin bununla hiçbir ilgisi yok.

Peter'da - bir anahtarla doğru olanı arayan dizideki tüm nesnelerin bir listesi var. Ve sınıfları kullanmanız, dizileri kullanmanız, yalnızca bir grup beyan edilmiş nesne kullanmanız arasında hiçbir fark yoktur.

OOP, örneğin her biri bir GetColor () yöntemine sahip olan nesnelerin bir listesine sahip olmanıza olanak tanır - ve kullanıcı, aynı şekilde, istenen rengi aramak için tüm nesneler üzerinde yinelenir. Ancak, OOP olmadan - rengi gerektiği yerden almak için kullanıcının bilmesi gereken bir dizi özdeş yapıya sahipsek, o zaman OOP ile - kullanıcının rengin tam olarak nasıl ve nerede olduğunu bilmesi gerekmez. saklanır - nesnenin GetColor () yöntemi, rengin nereden alınacağını bilir.

Yani, OOP için - kullanıcının nesnenin renginin nasıl ve nerede saklandığını bilmesine gerek yoktur. Bu nedenle, birdenbire, rengin Braille ile kodlandığı, noktalı bir "körler için nesne" eklememiz gerekirse, bu nesneyi zorlanmadan listemize ekleyeceğiz ve sadece GetColor () yöntemini değiştireceğiz, hangi noktalardan olacak " Braille'de" renk kodunu alın ve normal şekilde döndürün. Listemizin kullanıcısı için - hiçbir şey değişmeyecek.

Sadece bir dizimiz varsa, oraya "braille noktaları" koyamayız. Bizde böyle bir alan yok.

 

OOP'nin faydaları, CObject'den miras aldığımızda, ardından bir dizi CArrayObj nesnesi oluşturduğumuzda ve daha sonra yalnızca bir karşılaştırma işlevi yazdıktan sonra, hemen hızlı bir şekilde sıralama ve ikili arama yeteneği elde ettiğimizde açıkça görülebilir.

Kabaca söylemek gerekirse, yukarıdaki örneğim için color ile - OOP için - GetColor() ile rengi alarak bir karşılaştırma fonksiyonu yazıyoruz ve nesnelerimizin yarısının gerçek bir renge sahip olduğunu bile bilmeden nesnelerimizi renge göre sıralayabiliriz, ve yarım - "körler alfabesi noktaları". Ve eğer yeni bir renk kodlamasına sahip bir nesne eklemek istersek - yine, renk gösterimini standart olana getirecek olan GetColor () işlevini yazmamız yeterlidir - ve bundan sonra zaten yazılmış olan sıralama ve arama algoritmaları kabul edecektir. bu yeni nesne sorunsuz.

Yani, aslında OOP, henüz yazılmamış nesneleri sıralamak ve aramak için bir algoritmaya sahip olmamızı sağladı, hatta daha rengin tam olarak nasıl temsil edileceğine ve nasıl saklanacağına karar vermeden önce.

 
Georgiy Merts :
OOP'nin faydaları gerçekten de CObject'den miras aldığımızda, ardından bir dizi CArrayObj nesnesi oluşturduğumuzda ve ardından yalnızca bir karşılaştırma işlevi yazdıktan sonra, hemen hızlı bir şekilde sıralama ve ikili arama yapma yeteneğini elde ettiğimizde açıkça görülebilir.
Ona önerilen veri depolama kavramını anladığında Peter'a bundan bahsetmek istedim.
 
Реter Konow :
Bu, sınıflara ve içeriklerine erişim hakları nedeniyle bağlantılar arasındaki geçişlerle bir sözdizimi ve karmaşıklık denizidir. Burada sınıflara bölünmenin bir sonucu olarak genel gider başlar. OOP bir yandan bir hiyerarşi oluşturmayı mümkün kılarken, diğer yandan onunla çalışmayı son derece zorlaştırıyor.

erişim değiştiricileri, derleme zamanında hataları algılamanıza izin verir

genel olarak, tüm bunlar sınıflarla çalışmayı zorlaştırmaz, kullanmayın, her şeyi herkese açık olarak yazın: , o zaman anlamak daha kolay olacaktır

Not: OOP, sonra kapsülleme, sonra kalıtım hakkında birçok güzel ifade ... hepsi iyi, ancak OOP'nin diğer programlama stillerine göre en önemli avantajı, tüm verilerin (sınıf alanları) depolanması ve bu verilerle çalışma işlevleridir. (sınıf yöntemleri) tek bir yerde (sınıf) - kitaba göre bu kapsüllemedir. Ayrıca , OOP kullanımı görevlere bağlıdır, eğer görev sınıfları ölçeklendirmenize izin veriyorsa, o zaman bir hiyerarşi gerekli olacaktır ve temel sınıflar ve onların mirasçıları olacaktır - bunu kullanıp kullanmamak size bağlıdır

 
Georgiy Merts :
Artyom Trishkin :

OOP kavramında "Nesne"nin "Çekirdeğimden" daha geniş bir bağlamda sunulduğunu itiraf etmeliyim. Ancak bu şaşırtıcı değil, çünkü şimdiye kadar sadece grafiklerle uğraştım ve OOP çok çeşitli sorunları çözmek için kullanılıyor. Nesnelerden oluşan "menüm" oldukça yetersiz ve "etiket", "eleman", "pencere" dışında muhtemelen çok az şey var ... Ancak grafik arayüzler için daha fazlasına gerek yok.

Ancak, şimdi "Nesne" kavramını genişletme ve bir hiyerarşi oluşturma sorunu ortaya çıktı. Basit bir iki boyutlu çekirdek, tüm bilgi tabanı nesnelerini kabul edemez ve bu nedenle, farklı nesneler için farklı çekirdekler oluşturmanız veya OOP konseptinin yolunu izlemeniz gerekir.

Özünde, bu tamamen teknik bir konudur. Neyin daha verimli, neyin daha hızlı, neyin daha okunabilir, vb.

Aslında, tüm nesneler, aralarında diğer dizilere, diğer nesnelere vb. işaretçilerin bulunacağı bir özellikler listesi olarak bir dizide tutulabilir. Veya açıkça OOP kullanın . Nesne yönelimi her iki yaklaşımda da değişmez bir şekilde mevcuttur, yalnızca uygulama yöntemleri farklıdır. Aynı bellek, aynı işaretçiler, aynı nesneler, aynı sınıflandırma. Sadece kod farklı...

 
Artyom Trishkin :
Ona önerilen veri depolama kavramını anladığında Peter'a bundan bahsetmek istedim.
Bu veri depolama ve çalışma kavramını anlamaya çalışacağım.
 
Реter Konow :
Bu veri depolama ve çalışma kavramını anlamaya çalışacağım.
İyi. Kişisel bir görüşme yapabilirsiniz. Veya Skype, hangisini tercih ederseniz. Sadece ayrıntılar - bu konunun konusuyla ilgili değil - burada, anladığım kadarıyla - sadece genel sorular.
 
Artyom Trishkin :
İyi. Kişisel bir görüşme yapabilirsiniz. Veya Skype, hangisini tercih ederseniz. Sadece ayrıntılar - bu konunun konusuyla ilgili değil - burada, anladığım kadarıyla - sadece genel sorular.
Tamam, bunu düşüneceğim. Olursa özelden yazarım.