Di mana, dalam sistem berorientasi objek, Anda, jika sama sekali, memilih struct (C-style) di atas kelas?


9

C dan kemungkinan besar banyak bahasa lain menyediakan structkata kunci untuk membuat struktur (atau sesuatu dengan cara serupa). Ini (setidaknya dalam C), dari sudut pandang yang disederhanakan seperti kelas, tetapi tanpa polimorfisme, pewarisan, metode, dan sebagainya.

Pikirkan bahasa berorientasi objek (atau multi-paradigma) dengan struct gaya-C. Di mana Anda memilih mereka daripada kelas? Sekarang, saya tidak percaya mereka akan digunakan dengan OOP karena kelas tampaknya menggantikan tujuan mereka, tetapi saya bertanya-tanya apakah ada situasi di mana mereka dapat lebih disukai daripada kelas dalam program berorientasi objek dan dalam situasi seperti apa. Apakah ada situasi seperti itu?


Bahasa apa yang Anda gunakan? Apa yang Anda terbitkan? Sebagian besar bahasa OO modern, kecuali Java, mendukung properti dengan satu atau lain cara.
kevin cline

Jawaban:


16

Ada perbedaan yang saya lihat di beberapa buku antara benda pembawa negara dan benda penyedia fungsi. Istilah yang tepat berbeda dari sumber ke sumber. Tetapi secara umum, yang pertama dibedakan dengan memiliki banyak bidang dan sejumlah besar pengambil-setter berpasangan (dan mungkin konstruktor).

Ini sangat umum di Jawa, untuk kelas yang secara eksplisit ditandai sebagai "serializable".

Saya berpendapat bahwa kelas semacam ini paling masuk akal sebagai struct, jika Anda merasa tidak perlu menyembunyikan anggota secara langsung (misalnya, dalam hal tipe bertumpuk).


1
Robert C Martin menyebut mereka "objek transfer data" dalam Kode Bersih .
user16764

5

Di C, tidak ada kelas, jadi structadalah cara untuk menggabungkan data. Dalam C ++, structsama dengan classkecuali bahwa pewarisan dan akses anggota publicsecara default bukan private. C # juga memiliki semacam struct, tetapi saya tidak cukup tahu C # untuk mengomentarinya. Common Lisp memiliki defstructbentuk, yang berfungsi seperti halnya Cs struct, mengingat perbedaan bahasa, dan berbeda dari kelas Common Lisp Object System.

Namun, ada perbedaan konseptual antara bundel data terkait dan kelas nyata, dan dalam C ++ structsering digunakan untuk bundel data, sementara classdigunakan untuk objek yang seharusnya memiliki perilaku mereka sendiri. Sebagai pedoman, saya akan mengatakan bahwa classmewakili sesuatu yang dapat Anda katakan sesuatu yang bermanfaat, seperti kelas invarian, sementara a structakan lebih longgar digabungkan dengan nilai data yang tidak terlalu tergantung pada yang lain.


6
Perbedaan antara a structdan a classlebih signifikan dalam C # - yang paling penting adalah a structadalah tipe nilai dan a classadalah tipe referensi. Microsoft merekomendasikan untuk tidak menggunakan structjika isinya akan lebih besar dari 16 byte atau lebih.
Carson63000

0

Pada tingkat yang sangat mendasar, apa perbedaan antara struct dan kelas data murni (yang tidak memiliki fungsi selain dari aksesor properti)?

Hanya jejak memori.


0

Jawaban yang diterima bagus. Saya hanya ingin menambahkan ....

Terkadang lebih baik menempatkan metode di dalam kelas. Lain kali lebih baik memiliki fungsi eksternal di mana struct / kelas dilewatkan sebagai parameter (bahkan jika Anda melakukan gaya OOP).

contoh kapan harus meletakkan metode di dalam kelas: Rectangle.CaclulateArea ()

contoh kapan harus meletakkan fungsi di luar kelas: Canvas.Draw (Rectangle rect)

Anda bisa meletakkan Draw () di dalam Rectangle dan itu akan berhasil. Tetapi menggambar adalah operasi yang bergantung pada tingkat. Anda tidak akan menggambar di sisi server, tetapi di sisi klien. Draw () tidak masuk akal bahkan ada di server. Namun "CalculateArea ()" tidak tergantung pada tier dan merupakan atribut sebenarnya dari persegi panjang, jadi lebih baik untuk memasukkannya sebagai metode anggota.


0

Bagi saya, perbedaan besar adalah apakah ada kelas-invarian atau tidak.

Atau dengan kata lain: apakah saya bebas mengubah bidang apa pun ke nilai apa pun kapan saja? Jika demikian, itu adalah struct; Jika tidak, ini kelas.

Contoh biasa dari struct adalah titik 2D, dengan hanya anggota X dan Y, yang dapat memiliki nilai apa pun dan benar-benar independen satu sama lain. Akses publik dapat diterima.

Contoh kelas adalah kombinasi pointer ke array karakter dan bidang panjang: panjangnya tergantung pada nilai pointer, dan dengan demikian seharusnya tidak menjadi sebuah struct. Ladang harus pribadi, dan akses harus melalui setter dan getter untuk memastikan kelas invarian.


0

1) Jaringan struct: struktur yang ditransmisikan melalui kabel.

Secara umum dan formal, setiap kelas yang Anda perlukan adalah POD, sepele, tata letak standar, atau konsep terkait. Untuk diskusi yang sangat baik dari konsep-konsep ini, dengan contoh, lihat jawaban ini (ini untuk C ++ 11).

2) Functors (predikat khususnya), yang akan Anda lewati untuk fungsi seperti std::remove_if. Jika tidak, kelas mirip dengan / diwarisi dari std::binary_functionatau sejenisnya.

3) Konsep pemrograman Meta, yang mungkin hanya berisi publik constexpr, dan / atau typedefs.

Sunting: Catatan: Jawaban ini berlaku untuk kelas C ++ vs struct.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.