Apakah reusability kira-kira identik dengan desain yang bagus?


10

Dapat digunakan kembali adalah fitur desain perangkat lunak yang baik .

Apakah penggunaan kembali gloss yang dapat diterima ("notasi singkat tentang arti") untuk desain perangkat lunak yang baik? Mengapa?


Saya berpendapat bahwa fleksibilitas lebih penting. Memiliki arsitektur dasar yang mencoba mengakomodasi kenyataan bahwa sesuatu mungkin akan berubah atau ditambahkan nanti adalah kunci pendapat saya. Reusablity hampir datang secara gratis pada saat itu.
Pemdas

Penggunaan fleksibilitas Anda terdengar persis seperti usabilitas ulang.
Matthew Rodatus

"Dapat digunakan kembali adalah kemungkinan segmen kode sumber yang dapat digunakan lagi untuk menambahkan fungsionalitas baru dengan sedikit atau tanpa modifikasi" - en.wikipedia.org/wiki/Reusability
Matthew Rodatus

Saya terkesan bahwa sebagian besar jawaban di bawah mengatakan tidak . Ini sekarang akan menjadi kasus hanya beberapa tahun yang lalu (yah ... 5-10 tahun), ketika reusability adalah hal yang paling disukai.
Martin Wickman

@MartinWickman Reusability bagus, tetapi tidak gratis.
Caleb

Jawaban:


13

Tidak.

Penggunaan kembali adalah indikator desain yang baik. Ini menunjukkan bahwa kopling sistem cukup longgar dan kohesi unit tertentu cukup tinggi untuk memfasilitasi penggunaan kembali tanpa mengalami masalah ketergantungan atau harus menulis ulang sebagian besar kode.

Dapat digunakan kembali sebagian besar adalah ilusi. Sangat tidak mungkin untuk mengukur "reusability" dari suatu unit tanpa mengetahui sebelumnya di mana atau bagaimana itu akan digunakan. Banyak pengembang akan mencoba mendesain komponen yang "dapat digunakan kembali" dan seringkali mengetahui kemudian bahwa aspek-aspek spesifik yang mereka coba jadikan "fleksibel" adalah yang sebenarnya tidak perlu.

Saya akan menggunakan "gloss" berbeda: Testability.

Sekarang saya bukan penganjur TDD, saya juga tidak merasa perlu untuk menguji sesuatu dan segalanya. Tetapi tes menulis untuk suatu komponen akan memberi Anda ide yang sangat baik tentang sifat kopling / kohesi, dan sangat cepat. Jika itu tergantung pada abstraksi, maka itu adalah kopling longgar; Anda akan merasa mudah untuk mengejek dependensi dan itu menunjukkan desain yang bagus. Jika ia memiliki tujuan yang jelas (lihat juga Prinsip Tanggung Jawab Tunggal ) maka perilakunya akan relatif intuitif, Anda akan mudah menemukan apa yang harus diuji, yang sekali lagi, menyarankan desain yang baik.

Tentu saja, itu tidak menjamin desain yang baik; implementasi aktual atau bahkan seluruh arsitektur mungkin sepenuhnya tidak pantas untuk tujuan yang dinyatakan. Tapi setidaknya itu memberitahu Anda bahwa Anda tidak bekerja dengan kode spageti atau Obyek Tuhan.

Tolong, jangan mencoba membuat tebakan liar tentang "reusability" komponen, terutama untuk tidak digunakan sebagai bukti "desain yang baik". Itu adalah sesuatu yang Anda hanya dapat membangun di belakang, setelah itu benar-benar digunakan kembali, dan pada saat itu desain mungkin telah berubah secara signifikan.


Jawaban yang bagus. Anda menjawab pertanyaan yang seharusnya saya tanyakan: "Apa gloss yang baik untuk desain perangkat lunak yang baik?"
Matthew Rodatus

+1: Khusus untuk "Dapat digunakan kembali sebagian besar adalah ilusi".
Kramii

Ini hanya indikator desain yang bagus jika usabilitas adalah tujuan. Ini sering merupakan tujuan, jika implisit, tetapi menghabiskan waktu dan uang untuk membuat komponen dapat digunakan kembali ketika mereka tidak perlu menjadi sia-sia.
Caleb

5

Tidak.

Dapat digunakan kembali adalah fitur yang baik untuk dimiliki, karena dapat mempercepat pengembangan di masa depan. (Meskipun dalam praktiknya sangat sedikit organisasi yang melihat perkembangan di masa depan dipercepat hampir sebanyak yang mereka harapkan.) Namun, setiap perangkat lunak yang signifikan memiliki bagian-bagian yang spesifik untuk aplikasi itu. Dan lebih jauh lagi ketika orang tanpa pengalaman domain mencoba untuk menulis perangkat lunak yang dapat digunakan kembali, mereka biasanya mengaburkan bagian itu dan mengurangi kinerja tanpa benar-benar berhasil membuatnya dapat digunakan kembali.

Oleh karena itu desain yang baik adalah modular, dan hanya dapat digunakan kembali di mana Anda dapat melihat bahwa karya tersebut dapat digunakan kembali, dan di mana Anda memiliki keahlian untuk benar-benar mencapai usabilitas. Di tempat lain, Anda harus berusaha membersihkan barang-barang tetapi jangan khawatir tentang usabilitas ulang. (Kecuali di belakang kepala Anda di mana Anda membuat catatan sehingga pada beberapa sistem di masa depan Anda akan memiliki ide bagaimana membuat itu dapat digunakan kembali.)


Bagaimana dengan pengujian otomatis? Bukankah tes unit merupakan bentuk penggunaan kembali?
Matthew Rodatus

@ Matthew-Rodatus: Tes unit adalah bagian dari pengiriman perangkat lunak Anda. Reuse biasanya mengacu pada menggunakan kembali kode dalam beberapa lain bagian dari perangkat lunak.
btilly

Poin yang bagus. Saya kira saya menggunakan "usabilitas" dalam arti ontologis, yang membingungkan. Namun, amati bagaimana fitur reusability juga merupakan fitur dari kode yang dapat diuji: en.wikipedia.org/wiki/Reusability
Matthew Rodatus

1
@ matthew-rodatus: Reusability tidak, "Memiliki daftar fitur cucian ini." Jika Anda mencoba untuk menggunakan kembali dengan cara itu, Anda akan gagal. Percayalah pada saya.
btilly

Poin yang bagus. Saya mengerti sekarang bahwa saya tidak mengajukan pertanyaan yang ingin saya tanyakan, tetapi ini masih merupakan dialog yang menarik.
Matthew Rodatus

4

Saya percaya (dan ini adalah kepercayaan pribadi saya) bahwa hubungan antara penggunaan kembali dan desain yang baik tidak bersifat refleksif, jadi jawaban dasarnya dan sederhana adalah tidak . Jika Anda tertarik pada beberapa panduan desain yang baik, periksa ini artikel wikipedia.

Desain perangkat lunak yang baik harus dapat digunakan kembali, setidaknya di beberapa bagian inti, saya pikir sangat sedikit orang yang benar-benar menggunakan kembali kode sumber, karena fakta bahwa sangat rumit untuk merancang inti sistem untuk dapat digunakan kembali pada banyak konteks yang berbeda (Dan saya mengatakan ini karena pengalaman)

Pertimbangkan kelas dengan sejumlah besar tanggung jawab (alias gumpalan) yang melakukan semua tugas yang Anda butuhkan dengan baik tetapi tanpa pertimbangan desain sama sekali, mungkin Anda pernah melihat kasusnya. Kebanyakan orang dengan kelas seperti itu akan menggunakannya berulang kali dan saya pikir kita harus setuju bahwa itu adalah penggunaan ulang, penggunaan kembali tanpa desain.

Saya harap saya tidak terlalu banyak mengacaukan penjelasan saya


Itu sebabnya saya mengatakan "gloss" (maksud saya, praktis, reusability menangkap sebagian besar tapi tidak semua yang kita maksud dengan desain yang baik).
Matthew Rodatus

Maksud saya adalah bahwa Anda perlu dapat digunakan kembali untuk memiliki desain yang baik , tetapi memiliki banyak kode "yang dapat digunakan kembali" tidak berarti bahwa Anda memiliki desain yang baik jadi saya masih akan mengatakan tidak, bahkan sebagai gloss
David Conde

Itu masuk akal. Saya tidak yakin saya setuju, tetapi +1 untuk jawaban yang dipikirkan dengan matang.
Matius Rodatus

2

Saya pikir indikator yang lebih baik dari desain yang baik adalah kepatuhan terhadap ide-ide mendasar seperti prinsip tanggung jawab tunggal dan menjaga kohesi setiap komponen. Dengan menggunakan abstraksi dengan antarmuka yang bersih dan ringkas dan menjaga kepatuhan dengan Kepala Substitusi Liskov, kami mendorong penggunaan kembali tanpa mencoba memprediksi apa yang akan dan tidak akan digunakan kembali.

Berpegang teguh pada prinsip-prinsip desain dasar ini membuat kode lebih mudah untuk diuji dan lebih mudah untuk digunakan kembali.

Desain yang baik == desain yang baik, dapat digunakan kembali adalah produk sampingan.


1

Dapat digunakan kembali sering kali merupakan tujuan desain implisit. Jika Anda dapat membuat komponen, atau seluruh desain, sedemikian rupa sehingga dapat digunakan kembali nanti, tampak jelas bahwa Anda harus melakukan itu. Apa yang tidak selalu jelas adalah bahwa dibutuhkan banyak waktu dan usaha (dan uang) untuk membuat sesuatu dapat digunakan kembali, dan oleh karena itu manfaat penggunaan kembali harus ditimbang dengan biayanya.

Desain yang dapat digunakan kembali yang harganya dua kali lebih banyak dan / atau membutuhkan waktu dua kali lebih lama untuk membangun daripada apa yang dibutuhkan pelanggan bukanlah desain yang baik dari perspektif pelanggan, terutama jika pelanggan tidak membutuhkan usabilitas ulang.

Ada sejumlah atribut serupa yang sering dianggap sebagai tujuan desain implisit karena tampaknya jelas bagus:

  • meminimalkan biaya

  • meminimalkan waktu pengembangan

  • meminimalkan kompleksitas

  • memaksimalkan keandalan

Semua hal ini secara objektif baik, tetapi mungkin tidak selalu penting bagi klien tertentu pada waktu tertentu, jadi penting untuk sepenuhnya memahami apa yang dibutuhkan pelanggan Anda (bahkan jika pelanggan itu hanya bos Anda). Ada sejumlah aforisme yang dimaksudkan untuk mengingatkan kita akan fakta ini (mis. "Selesai lebih baik daripada sempurna" dan "Bagus, murah, cepat: pilih dua"), tetapi masih mudah terjebak dalam perangkap mencoba membuat perangkat lunak yang hebat dalam segala hal padahal sebenarnya hebat dalam segala hal tidak selalu dibutuhkan.

Untuk sampai ke pertanyaan judul, maka: Tidak , dapat digunakan kembali tidak identik dengan desain yang baik. Dapat digunakan kembali dapat menjadi komponen yang berguna dari desain yang baik tertentu, tetapi hanya jika diperlukan.


0

Belum tentu. Jika Anda membuat sesuatu yang dapat digunakan kembali yang jelas tidak akan digunakan kembali maka itu desain yang buruk.

Misalnya, jika Anda menulis file yang penuh dengan data yang unik untuk perusahaan Anda dan data itu akan diimpor sekali ke tempat lain, mengapa repot-repot membuatnya dapat digunakan kembali?

Yang mengatakan, jika kerangka kerja Anda belum memilikinya, kode untuk menulis ke file mungkin perlu digunakan kembali. Itu akan menjadi desain yang bagus.


Bagaimana Anda tahu pasti jika sesuatu tidak akan pernah digunakan kembali?
Matthew Rodatus

1
@Matthew - Itu akan menjadi definisi saya tentang desainer yang baik: Seseorang yang biasanya menjawab pertanyaan itu dengan benar
pdr

0

Saya akan mengatakan tidak, sebagian besar karena hanya menjelaskan sebagian kecil kode. Saya telah menemukan bahwa di mana kegunaan yang paling penting adalah di bagian paling inti dan di tepi luar wilayah utilitas, tidak begitu banyak di antaranya. Saya akan memberikan beberapa contoh hal-hal yang menurut saya dapat digunakan kembali adalah metrik desain kualitas yang berguna.

Barang inti

  • Templat formulir web yang memungkinkan halaman ditambahkan dengan mudah dan konsisten (atau untuk segala jenis UI)
  • Desain pembantu pola seperti kelas dasar ViewModel yang akan dimasukkan dalam semua aplikasi MVVM saya

Barang Utilitas

  • Kelas email yang mengirim pesan SMTP (gunakan sepanjang waktu)
  • Kelas kalkulator jarak GIS (digunakan dalam banyak aplikasi kami)

Untuk hal-hal CRUD yang mengambil 70-80% dari sebagian besar aplikasi, saya hanya tidak berpikir usabilitas adalah metrik yang berharga sama sekali.

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.