Untuk menyederhanakan antarmuka, apakah lebih baik tidak memiliki getBalance()
metode ini? Melewati 0
ke charge(float c);
akan memberikan hasil yang sama:
public class Client {
private float bal;
float getBalance() { return bal; }
float charge(float c) {
bal -= c;
return bal;
}
}
Mungkin membuat catatan javadoc
? Atau, serahkan saja pada pengguna kelas untuk mencari tahu bagaimana cara mendapatkan keseimbangan?
interfaces
cqrs
David
sumber
sumber
Jawaban:
Anda tampaknya menyarankan bahwa kompleksitas suatu antarmuka diukur oleh jumlah elemen yang dimilikinya (metode, dalam hal ini). Banyak yang berpendapat bahwa harus ingat bahwa
charge
metode ini dapat digunakan untuk mengembalikan keseimbanganClient
menambah kompleksitas daripada memiliki elemen tambahan darigetBalance
metode. Membuat hal-hal lebih eksplisit jauh lebih sederhana, terutama ke titik di mana ia tidak meninggalkan ambiguitas, terlepas dari jumlah elemen yang lebih tinggi di antarmuka.Selain itu, panggilan
charge(0)
melanggar prinsip tercengang , juga dikenal sebagai metrik WTF per menit (dari Kode Bersih, gambar di bawah), menyulitkan anggota tim yang baru (atau yang saat ini, setelah beberapa saat menjauh dari kode) hingga mereka mengerti bahwa panggilan itu sebenarnya digunakan untuk mendapatkan keseimbangan. Pikirkan bagaimana reaksi pembaca lain:Juga, tanda tangan
charge
metode bertentangan dengan pedoman melakukan satu dan hanya satu hal dan pemisahan perintah-permintaan , karena menyebabkan objek untuk mengubah keadaannya sementara juga mengembalikan nilai baru.Secara keseluruhan, saya percaya bahwa antarmuka paling sederhana dalam kasus ini adalah:
sumber
getBalance()
mengembalikan beberapa nilai dan tidak mengubah apa pun. Di sisi lain,charge(0)
sepertinya itu memodifikasi sesuatu ... mungkin mengirimkan acara PropertyChanged? Dan apa yang dikembalikan, nilai sebelumnya atau nilai baru? Sekarang Anda harus mencarinya di dokumen dan membuang kekuatan otak, yang bisa dihindari dengan menggunakan metode yang lebih jelas.charge(0)
sebagai cara mendapatkan keseimbangan karena kebetulan tidak berpengaruh sekarang membuat Anda terperinci pada detail implementasi ini; Saya dapat dengan mudah membayangkan persyaratan di masa depan di mana melacak jumlah tagihan menjadi relevan, pada titik mana basis kode Anda dikotori dengan biaya yang bukan biaya sebenarnya menjadi titik yang menyakitkan. Anda harus memberikan elemen antarmuka yang berarti hal-hal yang perlu dilakukan klien Anda, bukan yang hanya melakukan hal-hal yang perlu dilakukan klien Anda.charge()
metode, jika metode itu adalah atom dalam sistem bersamaan, mungkin tepat untuk mengembalikan nilai baru atau lama.IMO, mengganti
getBalance()
dengancharge(0)
seluruh aplikasi Anda bukanlah penyederhanaan. Ya itu lebih sedikit baris, tetapi mengaburkan maknacharge()
metode, yang berpotensi menyebabkan sakit kepala di telepon ketika Anda atau orang lain perlu meninjau kembali kode ini.Meskipun mereka mungkin memberikan hasil yang sama, mendapatkan saldo akun tidak sama dengan tagihan nol, jadi mungkin lebih baik memisahkan kekhawatiran Anda. Misalnya, jika Anda perlu memodifikasi
charge()
untuk masuk setiap kali ada transaksi akun, Anda sekarang memiliki masalah dan tetap harus memisahkan fungsionalitasnya.sumber
Penting untuk diingat bahwa kode Anda harus mendokumentasikan diri sendiri. Ketika saya menelepon
charge(x)
, saya berharapx
akan dikenakan biaya. Informasi tentang keseimbangan adalah informasi sekunder. Terlebih lagi, saya mungkin tidak tahu bagaimanacharge()
penerapannya ketika saya menyebutnya dan saya pasti tidak akan tahu bagaimana penerapannya besok. Misalnya, pertimbangkan potensi pembaruan di masa mendatang untukcharge()
:Tiba-tiba menggunakan
charge()
untuk mendapatkan keseimbangan tidak terlihat begitu bagus.sumber
charge
jauh lebih berat.Menggunakan
charge(0);
untuk mendapatkan keseimbangan adalah ide yang buruk: suatu hari, seseorang mungkin menambahkan beberapa kode di sana untuk mencatat biaya yang dibuat tanpa menyadari penggunaan fungsi lainnya, dan kemudian setiap kali seseorang mendapatkan saldo itu akan dicatat sebagai tagihan. (Ada beberapa cara di sekitar ini seperti pernyataan bersyarat yang mengatakan sesuatu seperti:tetapi ini bergantung pada programmer yang tahu untuk mengimplementasikannya, yang tidak akan dia lakukan jika tidak segera jelas bahwa mereka diperlukan.
Singkatnya: jangan bergantung pada pengguna atau penerus programer Anda menyadari bahwa itu
charge(0);
adalah cara yang benar untuk mendapatkan keseimbangan, karena kecuali ada dokumentasi yang dijamin tidak akan terlewatkan, maka sejujurnya itu sepertinya cara paling menakutkan untuk mendapatkan keseimbangan mungkin.sumber
Saya tahu ada banyak jawaban, tetapi alasan lain yang menentang
charge(0)
adalah karena kesalahan ketik yang sederhanacharge(9)
akan menyebabkan saldo pelanggan Anda berkurang setiap kali Anda ingin mendapatkan saldo mereka. Jika Anda memiliki pengujian unit yang baik, Anda mungkin dapat mengurangi risiko itu, tetapi jika Anda gagal untuk rajin pada setiap panggilan kecharge
Anda bisa memiliki kecelakaan ini.sumber
Saya ingin menyebutkan kasus tertentu di mana ia akan masuk akal untuk memiliki lebih sedikit, lebih serbaguna, metode: jika ada banyak polimorfisme, yaitu, banyak implementasi dari ini antarmuka ; terutama jika implementasi tersebut dalam kode yang dikembangkan secara terpisah yang tidak dapat diperbarui dalam sinkronisasi (antarmuka didefinisikan oleh perpustakaan).
Dalam hal itu, menyederhanakan pekerjaan menulis setiap implementasi jauh lebih berharga daripada kejelasan penggunaannya, karena yang pertama menghindari bug pelanggaran kontrak (dua metode menjadi tidak konsisten satu sama lain), sedangkan yang kedua hanya menyakitkan keterbacaan, yang dapat dipulihkan oleh fungsi pembantu atau metode superclass yang mendefinisikan
getBalance
dalam halcharge
.(Ini adalah pola desain, yang saya tidak ingat nama spesifik untuk: mendefinisikan antarmuka penelepon yang kompleks dalam hal yang ramah implementor minimal. Dalam Classic Mac OS antarmuka minimal untuk operasi menggambar disebut "bottleneck" tapi ini sepertinya bukan istilah yang populer.)
Jika ini bukan masalahnya (ada beberapa implementasi atau tepatnya satu) maka memisahkan metode untuk kejelasan, dan untuk memungkinkan penambahan sederhana dari perilaku yang relevan dengan biaya bukan nol
charge()
, masuk akal.sumber
realloc
, kadang-kadang, pada beberapa sistem.