Nesneye yönelik bir sistemde, eğer sınıflar üzerinde (C-tarzı) yapıları nerede seçmelisiniz?


9

C ve büyük olasılıkla diğer birçok dil, structyapılar (veya benzer bir şekilde) oluşturmak için bir anahtar kelime sağlar. Bunlar (en azından C'de), sınıflar gibi basitleştirilmiş bir bakış açısından, ancak polimorfizm, kalıtım, yöntemler vb.

C stili yapılarla nesne yönelimli (veya çoklu paradigma) bir dil düşünün. Onları sınıflar arasında nerede seçerdiniz? Şimdi, sınıfların amaçlarının yerini aldıkları için OOP ile kullanılacaklarına inanmıyorum, ancak başka türlü nesne yönelimli programlarda ve ne tür durumlarda sınıflara göre tercih edilebilecekleri olup olmadığını merak ediyorum. Böyle durumlar var mı?


Hangi dili kullanıyorsun Ne yayınlıyorsun? Java hariç çoğu modern OO dili özellikleri bir şekilde destekler.
kevin cline

Yanıtlar:


16

Bazı kitaplarda devlet taşıyan nesneler ile işlevsellik sağlayan nesneler arasında gördüğüm bir ayrım var. Kesin terimler kaynaktan kaynağa değişir. Ancak genel olarak konuşursak, ilk grup bir grup alana ve bir grup basit alıcı-setter çiftine (ve belki de bir kurucuya) sahip olarak ayırt edilir.

Bunlar özellikle "serileştirilebilir" olarak işaretlenmiş sınıflar için Java'da yaygındır.

Üyeleri doğrudan gizlemeye gerek olmadığını düşünüyorsanız (örneğin, iç içe yerleştirilmiş tiplerde) bu tür sınıfların yapı olarak en mantıklı olduğunu iddia ediyorum.


1
Robert C Martin, onlara Temiz Kod'da "veri aktarım nesneleri" diyor .
Kullanıcı16764

5

C'de sınıflar yoktur, bu nedenle structverileri bir araya getirmenin yolu da vardır. C ++ 'da, miras ve üye erişiminin varsayılan structolarak olması classdışında , aynıdır . C # da bir tür vardır , ama üzerinde yorum yapmak için yeterli C # bilmiyorum. Common Lisp, dil farkını göz önünde bulundurarak, olabildiğince Cs gibi çalışan bir forma sahiptir ve Common Lisp Nesne Sistemi sınıfından farklıdır.publicprivatestructdefstructstruct

Bununla birlikte, ilgili veri paketi ile gerçek bir sınıf arasında kavramsal bir fark vardır ve C ++ ' structda genellikle bir veri paketi classiçin kullanılırken, kendi davranışlarına sahip olması gereken nesneler için kullanılır. Bir kılavuz olarak, classa'nın bir sınıf değişmezi gibi yararlı bir şey söyleyebileceğiniz bir şeyi temsil ettiğini söyleyebilirim struct.


6
A structve a arasındaki fark classC # 'da daha önemlidir - en önemli şey a'nın structbir değer türü ve classa'nın bir referans türüdür. Microsoft struct, içeriğin 16 bayttan büyük olması durumunda bir kullanılmamasını önerir .
Carson63000

0

Çok temel bir düzeyde bir yapı ve saf veri sınıfı (özellik erişimcileri dışında işlevselliği olmayan) arasındaki fark nedir?

Bellek ayak izinden başka bir şey yok.


0

Kabul edilen cevap iyidir. Sadece eklemek istiyorum ....

Bazen bir sınıfın içine bir yöntem koymak daha iyidir. Diğer zamanlarda, yapı / sınıfın parametre olarak iletildiği bir harici işleve sahip olmak daha iyidir (OOP stili yapsanız bile).

sınıfın içine bir yöntem ne zaman konulacağına örnek: Rectangle.CaclulateArea ()

fonksiyonun ne zaman sınıfın dışına konulacağına örnek: Canvas.Draw (Dikdörtgen rekt)

Draw () öğesini Dikdörtgenin içine koyabilirsiniz ve işe yarayacaktır. Ancak çizim katmana bağlı bir işlemdir. Sunucu tarafında değil, istemci tarafında çizim yaparsınız. Draw (), sunucuda bile var olması mantıklı olmaz. Ancak "CalculateArea ()" katmandan bağımsızdır ve dikdörtgenin gerçek bir özelliğidir, bu nedenle onu bir üye yöntemi olarak dahil etmek daha iyidir.


0

Benim için en büyük fark, sınıf değişmezinin olup olmadığıdır.

Ya da başka bir deyişle: herhangi bir alanı herhangi bir zamanda herhangi bir değerle değiştirmekte serbest miyim? Eğer öyleyse, bu bir yapı; Değilse, bu bir sınıf.

Bir yapının olağan örneği, herhangi bir değere sahip olabilen ve birbirinden tamamen bağımsız olan sadece X ve Y üyesi olan bir 2D noktadır. Kamu erişimi kabul edilebilir.

Sınıf örneği, bir işaretçinin bir karakter dizisine ve bir uzunluk alanına birleşimidir: uzunluk, işaretçinin değerine bağlıdır ve bu nedenle bir yapı olmamalıdır. Alanlar özel olmalı ve sınıf değişmezini sağlamak için erişim ayarlayıcılardan ve alıcılardan geçmelidir.


0

1) Ağlar struct: tel üzerinden iletilen yapılar.

Daha genel ve resmi olarak, POD, önemsiz, standart düzen veya ilgili bir kavram olması gereken herhangi bir sınıf. Bu kavramların örneklerle mükemmel bir tartışması için bu cevaba bakınız (C ++ 11 içindir).

2) Functors (özellikle tahmin eder), gibi işlevlere geçeceğiniz std::remove_if. Aksi taktirde, benzer std::binary_functionveya benzeri miras alınan sınıflar .

3) Yalnızca halka açık constexprve / veya içerebilir meta-programlama kavramları typedef.

Düzenleme: Not: Bu cevap yapılar vs C ++ sınıfları için geçerlidir.

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.