Apa yang Anda sebut kelas tanpa metode?

10

Apa yang Anda sebut kelas tanpa metode?

Sebagai contoh,

class A
{
  public string something;
  public int a;
}

Di atas adalah kelas tanpa metode apa pun. Apakah jenis kelas ini memiliki nama khusus?

pengguna52343
sumber
1
Kelas tanpa metode?
ChaosPandion
11
Istilah teknisnya adalah catatan atau struct .
Kilian Foth
4
"Tas properti"
Martin York
Kilian: Saya lebih suka "struct yang dimuliakan" untuk konotasi yang ditambahkan.
Jason

Jawaban:

23

Sebagian besar waktu: Pola anti.

Mengapa? Karena memfasilitasi pemrograman prosedural dengan kelas "Operator" dan struktur data. Anda memisahkan data dan perilaku yang bukan OOP yang baik.

Sering kali: A DTO (Objek Transfer Data)

Baca hanya struktur data yang dimaksudkan untuk bertukar data, yang berasal dari objek bisnis / domain.

Terkadang: Hanya struktur data.

Yah kadang-kadang, Anda hanya perlu memiliki struktur untuk menyimpan data yang sederhana dan sederhana dan tidak memiliki operasi di atasnya. Tapi kemudian saya tidak akan menggunakan bidang publik tetapi accessor (getter dan setter).

Elang
sumber
4
Saya mencegah semua orang untuk melakukan kelas dengan hanya getter / setter publik di java, sudah mati otak dan beberapa kontainer bahkan tidak akan menjalankan kode setter / getter (melihat Glassfish ...), jadi apakah itu default atau Anda memiliki bug. Saya tidak percaya bahwa enkapsulasi OOP benar, ternyata, sebagian besar waktu, di sebagian besar aplikasi, DTO tidak hanya dibutuhkan, tetapi mereka adalah kelas yang paling sering digunakan. Jadi mereka bukan antipattern, saya akan menggunakan kata "blok bangunan dasar".
Aadaam
8
Mereka mungkin anti-pola jika Anda berada di lingkungan OO yang ketat. Untuk semua bagian dunia pemrograman lainnya, memiliki struktur data yang merupakan kumpulan bidang heterogen sederhana adalah manfaat yang jelas atas alternatifnya, dan bahkan didorong dalam salah satu andalan OO yang terkenal .
Telastyn
@ Amadaam: Anda tidak benar. DTO bukan antiputern. Kadang-kadang benda-benda itu baik-baik saja jika mereka DTO! Dan ketika Glassfish tidak melihat getter dan setter, itu hanya berarti bahwa glassfish tidak ditulis dengan baik (meskipun sulit di java tanpa builtin accessors). Kode ini bukan braindead, ini berguna boilerplate.
Falcon
4
Cepat, @adaam. Seseorang menyetel bidang ke nilai yang tidak valid, menimbulkan malapetaka saat dibaca nanti. Lempar pengecualian sehingga Anda dapat mendeteksi pelakunya. Pertama kali Anda harus melakukan sesuatu seperti itu untuk bidang publik yang digunakan di 1.000 tempat, Anda akan menginginkan setter. Bidang publik memiliki tempatnya, tetapi paradigma pengambil / penyetel populer karena alasan yang baik.
Karl Bielefeldt
@KarlBielefeldt: dalam satu versi glassfish, saya memiliki satu pengecualian dalam kode setter sebagai ujian (tanpa syarat), yang tidak pernah dieksekusi. Properti memiliki variabel pribadi dan dua pengambil-dan-setter publik. Wadah itu mengelak dari setter. Jika sesuatu benar-benar memiliki nilai yang tidak valid, secara pribadi saya lebih suka mengetikkan kelas daripada nilai primitif, tapi mungkin itu hanya saya.
Aadaam
9

Saya akan menyebutnya structatau recordkarena digunakan untuk penyimpanan data dan ini sangat umum untuk bahasa seperti yang CAnda lihat di sana: struct (bahasa pemrograman C) . Jadi secara pribadi saya lebih suka menggunakan structkelas daripada yang lebih cocok dan mudah dibaca:

struct A
{
  public string something;
  public int a;
}

Biasanya mereka digunakan sebagai DTO (Data Transfer Object) sebagaimana dikatakan yang lain.

Omar
sumber
4
Masalahnya dengan struct adalah, bahwa "struct" adalah kata kunci dalam banyak bahasa. C # misalnya memperlakukan struct sebagai tipe nilai yang memiliki semantik berbeda. Ini juga berlaku untuk "catatan" dalam beberapa bahasa (PL / SQL).
Falcon
5

Ini dikenal sebagai Plain Old __ Objects (PO_Os) di mana yang kosong adalah Java atau C atau CIL, atau bahasa apa pun yang Anda gunakan.

Jika mereka digunakan sebagai blok data sederhana untuk komunikasi, maka mereka dapat dikenal sebagai Data Transfer Objects (DTOs).

Jika mereka mewakili beberapa data yang disediakan secara eksternal, mereka dapat dikenal sebagai Entitas .

Telastyn
sumber
6
Anda sedang memikirkan POD - ide yang sangat berbeda. POJO secara eksplisit menyertakan "logika bisnis", tetapi mengecualikan dependensi pada kerangka kerja tertentu.
Tom Hawtin - tackline
POD diizinkan memiliki metode, setidaknya dalam C ++. Mereka hanya harus memiliki konstruktor sepele, destruktor, copy konstruktor dan konstruktor penugasan, hanya anggota data publik, tidak ada kelas dasar dan tidak ada fungsi virtual. Pada dasarnya, mereka hanya harus kompatibel dengan C struct.
Dirk Holsopple
2

Saya akan menyebut kelas semacam itu sebagai pemegang data yang bisa berubah, dan kadang-kadang menggunakan bentuk umum:

class DataHolder<T>
{
   public T dat;
}

Perhatikan bahwa membungkus datsuatu properti akan menurunkan kinerja dan tidak menawarkan keuntungan, karena tidak ada yang dapat dilakukan oleh seorang pengakses properti (selain membaca / menulis bidang) yang tidak akan merusak beberapa implementasi. Lebih lanjut, mungkin diperlukan untuk menggunakan Interlockedmetode dengan dat(atau, jika itu adalah struct, dengan bidang-bidangnya), tetapi itu tidak akan mungkin jika datdibungkus dalam sebuah properti.

Perhatikan bahwa sementara pemegang data yang bisa berubah mungkin berguna untuk tipe (bisa berubah atau tidak) yang perlu menyimpan data, mereka tidak dapat dengan aman digunakan untuk pertukaran data dengan cara yang sama seperti tipe yang tidak bisa diubah. Misalnya, pernyataan seperti:

myData = myCollection.GetData(myKey);

akan memiliki makna yang jelas jika GetDatamengembalikan tipe kelas yang tidak dapat diubah atau sebuah struct ("dapat diubah" atau tidak) yang tidak mengandung referensi ke data yang dapat diubah. Namun, jika mengembalikan objek kelas yang dapat diubah, tidak akan jelas apakah perubahan apa pun pada objek itu akan secara konsisten diabaikan oleh koleksi yang mendasarinya, secara konsisten menghasilkan pembaruan yang bersih untuknya, atau menyebabkan beberapa perilaku yang menjengkelkan atau tidak terduga yang tidak memenuhi deskripsi.

Jika seseorang ingin memiliki koleksi pengembalian data dalam objek yang bisa berubah, paradigma yang benar sering kali akan seperti:

var myData = new WhateverType();
myCollection.GetData(myKey, myData);
myData.ModifySomehow();
myCollection.StoreData(myKey, myData);

Menggunakan pendekatan itu, ada implikasi yang jelas yang GetDataakan menyebabkan myDatadiisi dengan data dari koleksi, tetapi myCollectiontidak akan diharapkan untuk menyimpan referensi setelah fungsi selesai, juga tidak akan menggunakannya untuk tujuan lain. StoreDatajuga akan menyalin informasi myDatake struktur data internalnya sendiri tanpa menyimpan referensi. Perhatikan bahwa salah satu keuntungan dari pendekatan ini adalah bahwa jika kode klien akan membaca banyak item data dalam satu loop, itu dapat dengan aman membuat satu instance dari myDataluar loop, dan kemudian menggunakan kembali instance yang sama setiap saat. Demikian juga, myCollectionmungkin dapat menggunakan kembali objek instance yang terkait dengan kunci (menyalin data dari instance yang diteruskan) tanpa harus membuat instance baru.

supercat
sumber
0

Bergantung pada konteksnya, saya menyebutnya Entitas. Pada aplikasi bisnis saya yang membosankan, mereka biasanya memetakan 1: 1 ke DER saya.

Machado
sumber
0

Saya akan menyebutnya a Schema.

Ini mencakup banyak kegunaan seperti mewakili tabel database, atau catatan deserialised, atau DTO, dll

userSteve
sumber