Misalkan saya memiliki segmen kode untuk terhubung ke internet dan menunjukkan hasil koneksi seperti itu:
HttpRequest* httpRequest=new HttpRequest();
httpRequest->setUrl("(some domain .com)");
httpRequest->setRequestType(HttpRequest::Type::POST);
httpRequest->setRequestData("(something like name=?&age=30&...)");
httpRequest->setResponseCallback([=](HttpClient* client, HttpResponse* response){
string responseString=response->getResponseDataString();
if(response->getErrorCode()!=200){
if(response->getErrorCode()==404){
Alert* alert=new Alert();
alert->setFontSize(30);
alert->setFontColor(255,255,255);
alert->setPosition(Screen.MIDDLE);
alert->show("Connection Error","Not Found");
}else if((some other different cases)){
(some other alert)
}else
Alert* alert=new Alert();
alert->setFontSize(30);
alert->setPosition(Screen.MIDDLE);
alert->setFontColor(255,255,255);
alert->show("Connection Error","unknown error");
}
}else{
(other handle methods depend on different URL)
}
}
kode panjang, dan umumnya digunakan, tetapi kode di atas tidak memerlukan hal-hal tambahan seperti fungsi kustom dan kelas (HttpRequest dan Alert keduanya disediakan oleh kerangka kerja secara default), dan meskipun segmen kode panjang, itu adalah lugas dan tidak kompleks (panjang hanya karena ada bundel pengaturan seperti url, ukuran font ...), dan segmen kode memiliki sedikit variasi di antara kelas (misalnya: url, data permintaan, kasus kode penanganan kasus, pegangan normal kasing ...)
Pertanyaan saya adalah, apakah dapat menyalin dan menempelkan kode yang panjang tapi langsung daripada membungkusnya dalam suatu fungsi untuk mengurangi ketergantungan kode?
Alert
objek?) Sekarang bayangkan Anda harus menemukan setiap instance kode ini untuk memperbaiki bug. Sekarang bayangkan bukan Anda yang harus melakukannya, tetapi pembunuh kapak gila yang tahu Anda adalah orang yang membuat semua salinan ini di tempat pertama.Jawaban:
Anda perlu mempertimbangkan biaya perubahan. Bagaimana jika Anda ingin mengubah cara koneksi dibuat? Seberapa mudahkah itu? Jika Anda memiliki banyak kode duplikat, maka menemukan semua tempat yang perlu diubah bisa memakan waktu dan rawan kesalahan.
Anda juga perlu mempertimbangkan kejelasan. Kemungkinan besar, harus melihat 30 baris kode tidak akan semudah dipahami sebagai panggilan tunggal ke fungsi "connectToInternet". Berapa banyak waktu yang hilang ketika mencoba memahami kode ketika fungsi baru perlu ditambahkan?
Ada beberapa kasus langka dimana duplikasi tidak menjadi masalah. Misalnya, jika Anda melakukan percobaan dan kode akan dibuang pada akhir hari. Tetapi secara umum, biaya duplikasi melebihi penghematan waktu yang kecil karena tidak harus menarik kode ke fungsi yang terpisah .
Lihat juga https://softwareengineering.stackexchange.com/a/103235/63172
sumber
HttpRequest
semuanya sama " adalah mudah untuk membuat kesalahan.Tidak.
Bahkan, bahkan kode "sederhana" Anda harus dipecah menjadi beberapa bagian yang lebih kecil. Setidaknya dua.
Satu untuk membuat koneksi dan menangani respon 200 normal. Misalnya, bagaimana jika Anda mengubah dari POST ke PUT dalam beberapa kasus? Bagaimana jika Anda membuat zillions koneksi ini dan memerlukan multi-threading atau koneksi-pooling? Memiliki kode di satu tempat, dengan argumen untuk metode ini, akan membuat ini lebih mudah
Demikian pula yang lain untuk menangani kesalahan. Misalnya, jika Anda mengubah warna atau ukuran font peringatan. Atau Anda mengalami masalah dengan koneksi terputus-putus dan ingin mencatat kesalahan.
sumber
Tidak.
Bagi saya, argumen yang menentukan adalah argumen ini:
Jika Anda menggunakan sepotong kode di lebih dari satu tempat maka, ketika itu berubah, Anda harus mengubahnya di lebih dari satu tempat atau Anda mulai mendapatkan ketidakkonsistenan - "hal-hal aneh" mulai terjadi (yaitu Anda memperkenalkan Bug).
Dan seharusnya semuanya menjadi lebih mudah direvisi menjadi suatu fungsi.
Dan apa yang suka diubah pengguna ? Font, ukuran font, warna, dll., Dll.
Sekarang; di berapa banyak tempat Anda harus mengubah potongan kode yang sama untuk mendapatkan mereka semua warna / font / ukuran yang sama lagi? (Jawaban yang disarankan: hanya satu ).
Variasi => parameter fungsi.
sumber
Ini tidak benar-benar ada hubungannya dengan salin dan tempel. Jika Anda mengambil kode dari tempat lain, di kedua Anda mengambil kode itu Anda kode dan Anda bertanggung jawab, jadi apakah itu disalin atau ditulis benar-benar sendiri tidak membuat perbedaan.
Di peringatan Anda, Anda membuat beberapa keputusan desain. Kemungkinan keputusan desain serupa harus dibuat untuk semua peringatan. Jadi kemungkinan Anda harus memiliki metode di suatu tempat "ShowAlertInAStyleSuitableForMyApplication" atau mungkin sedikit lebih pendek, dan itu harus dipanggil.
Anda akan memiliki banyak permintaan http dengan penanganan kesalahan serupa. Anda seharusnya tidak menduplikasi penanganan kesalahan lagi dan lagi dan lagi tetapi mengekstrak penanganan kesalahan umum. Terutama jika penanganan kesalahan Anda menjadi sedikit lebih rumit (bagaimana dengan kesalahan batas waktu, 401, dan sebagainya).
sumber
Duplikasi OK dalam beberapa keadaan. Tapi tidak untuk yang ini. Metode itu terlalu rumit. Ada batas yang lebih rendah, ketika duplikasi lebih mudah daripada "memfaktorkan" metode.
Sebagai contoh:
bodoh, lakukan a + b.
Tetapi ketika Anda hanya mendapatkan sedikit, sedikit lebih kompleks, maka Anda biasanya melewati batas.
harus menjadi
Dalam kasus Anda, saya melihat empat "metode". Mungkin di kelas yang berbeda. Satu untuk membuat permintaan, satu untuk mendapatkan respons, satu untuk menampilkan kesalahan, dan semacam panggilan balik untuk dipanggil setelah respons kembali untuk memproses respons. Saya pribadi mungkin akan menambahkan semacam "pembungkus" di atas itu juga untuk membuat panggilan lebih mudah.
Pada akhirnya, untuk membuat permintaan web saya ingin panggilan terlihat seperti:
Baris itu adalah apa yang saya miliki di seluruh kode saya. Kemudian ketika saya perlu melakukan perubahan pada "bagaimana saya mendapatkan barang" saya dapat dengan cepat melakukannya, dengan usaha yang jauh lebih sedikit.
Ini juga membuat kode KERING dan membantu dengan SRP .
sumber
Dalam suatu proyek dengan berbagai ukuran / kompleksitas, saya ingin dapat menemukan kode ketika saya membutuhkannya untuk tujuan berikut:
Bukankah menyenangkan, untuk bergabung dengan proyek yang sedang berjalan atau terus mengerjakan proyek selama beberapa tahun dan ketika permintaan baru untuk "terhubung ke internet dan menunjukkan hasil koneksi" ada di beberapa lokasi yang mudah ditemukan karena memiliki desain yang bagus daripada mengandalkan melakukan pencarian di seluruh kode untuk httprequest? Mungkin lebih mudah ditemukan dengan Google.
Jangan khawatir, saya orang baru dan saya akan memperbaiki blok kode ini karena saya sangat kesal karena bergabung dengan tim yang tidak mengerti ini dengan basis kode yang buruk atau saya sekarang berada di bawah banyak tekanan seperti yang lainnya. Anda dan hanya akan menyalin dan menempelnya. Setidaknya itu akan menjaga bos dari punggungku. Kemudian ketika proyek benar-benar diidentifikasi sebagai bencana, saya akan menjadi yang pertama merekomendasikan kami menulis ulang dengan menyalin dan menempel versi dalam kerangka terbaru dan terhebat yang tidak ada di antara kita yang mengerti.
sumber
Kelas dan / atau fungsi lebih baik, setidaknya menurut saya. Untuk sekali, itu membuat file lebih kecil yang merupakan keuntungan yang sangat berat jika Anda berurusan dengan aplikasi web atau aplikasi untuk perangkat dengan sedikit penyimpanan (IoT, ponsel lama, dll.)
Dan jelas poin terbaiknya adalah bahwa jika Anda memiliki sesuatu untuk diubah karena protokol baru, dll. Anda hanya mengubah konten fungsi dan tidak terhitung berapa kali Anda meletakkan fungsi ini di suatu tempat yang bahkan mungkin dalam file yang berbeda membuat mereka lebih sulit untuk temukan dan ubah.
Saya menulis seluruh penerjemah SQL sehingga saya bisa beralih lebih baik dari MySQL ke MySQLi di PHP, karena saya hanya perlu mengubah juru bahasa saya dan semuanya berfungsi, meskipun itu sedikit contoh yang ekstrem.
sumber
Untuk memutuskan apakah suatu kode harus digandakan atau dipindahkan ke suatu fungsi yang disebut dua kali, cobalah untuk menentukan mana yang lebih mungkin:
Penting untuk mengubah kedua penggunaan kode dengan cara yang sama.
Penting untuk mengubah setidaknya satu penggunaan kode sehingga mereka berbeda.
Dalam kasus pertama, kemungkinan akan lebih baik untuk memiliki satu fungsi menangani kedua penggunaan; dalam kasus terakhir, kemungkinan akan lebih baik untuk memiliki kode terpisah untuk dua penggunaan.
Dalam memutuskan apakah sepotong kode yang akan digunakan sekali harus ditulis in-line atau ditarik ke fungsi lain, cari tahu bagaimana seseorang akan sepenuhnya menggambarkan perilaku yang diperlukan fungsi. Jika deskripsi lengkap dan akurat tentang perilaku yang diperlukan fungsi akan lebih panjang atau lebih lama dari kode itu sendiri, memindahkan kode ke fungsi yang terpisah dapat membuat hal-hal lebih sulit untuk dipahami daripada lebih mudah. Mungkin masih layak dilakukan jika ada kemungkinan besar bahwa penelepon kedua akan perlu menggunakan fungsi yang sama, dan setiap perubahan di masa depan pada fungsi tersebut akan perlu memengaruhi kedua penelepon, tetapi jika tidak ada pertimbangan seperti itu, keterbacaan akan mendukung pemisahan. ke tingkat di mana kode dan deskripsi perilaku yang diperlukan akan sama-sama panjang.
sumber