Ulasan Kod: Sumber Umum Pelanggaran Melampau dan Bagaimana Menghindari Hujah tentang Menetapkan Mereka

Pisau ditarik. Bilah-bilah dikuatkan untuk konflik. Perbalahan antara pembangun. Hasrat coders tidak meradang bukan pada perisian buggy tetapi lebih kod ringkas atau kod kasar. Barisan ini adalah tanda-tanda hack. Mana-mana pemrogram yang tidak bersetuju adalah seorang amatur. Hanya seorang ahli baru yang akan menghasilkan kaedah dan blok yang sangat jelas melanggar rasa yang baik. Namun, pilihan berbeza, bukan undang-undang alam, adalah sumber konflik ini dan vitriol. Kebencian antara pemaju adalah, dalam kes ini, hasil dari kecenderungan yang berlainan ke arah kejelasan perdagangan untuk tujuan yang berbeza. Matlamat-matlamat ini, dan kecenderungan untuk mereka, adalah berbeza bagi setiap pemaju, yang membawa kepada konflik yang berterusan di beberapa kawasan tertentu. Satu tempat sedemikian adalah kode wordy atau lapis. Untuk meminimumkan pertempuran, sesebuah pasukan boleh menggunakan ulasan kod untuk menyerlahkan segmen yang paling menyusahkan, dan kumpulan itu boleh membantah bahagian-bahagian itu dan bukannya membantah setiap baris dan blok asas kod.

Pembentukan atau teknik kod tertentu mungkin menghasilkan pelanggaran yang melampau dan memimpin hujah tentang membetulkan pelanggaran tersebut. Memperbaiki penyalahgunaan ini membawa kepada hujah-hujah yang sengit. Perbalahan ini dapat diselesaikan, atau sekurang-kurangnya deescalated, untuk ciri dan teknik linguistik tertentu yang disenaraikan di bawah.

Pengendali Bersyarat vs Jika Pernyataan

Unsur-unsur linguistik, pengendali bersyarat dan pernyataan-jika, membawa kepada argumen, dengan kem-kem lain yang berpendapat bahawa masing-masing adalah teknik superior untuk operasi tertentu. Tindakan ini boleh dilaksanakan dalam pelbagai cara, setiap teknik membawa kelebihan dan kekurangan.

Sekiranya Penyataan: Penyataan jika boleh menyumbang kepada kod yang sangat rumit, apabila ketumpatan syaratnya tinggi. Ketumpatan tinggi membuat blok atau kaedah kelihatan bengkak. Walau bagaimanapun, kod yang ditulis dengan kenyataan jika-juga sangat debuggable, kerana pemaju boleh melangkau setiap baris.

jika (label1IsRequired) {
 label1.Color = "red";
} else {
 label1.Color = "black";
}
jika (label2IsRequired) {
 label2.Color = "red";
} else {
 label2.Color = "black";
}
jika (label3IsRequired) {
 label3.Color = "red";
} else {
 label3.Color = "black";
}

Pengendali Bersyarat: Pengendali bersyarat boleh membawa kepada beberapa garisan tersembunyi, ketika digunakan sebagai pengganti beberapa pernyataan jika. Pengendali bersyarat tertanam membuat kod, apabila diambil dengan melampau, sangat sukar untuk membaca, menguji, atau debug. Mana-mana blok atau kaedah berat pada pengendali bersyarat juga sangat padat, mengurangkan jumlah kod yang pemaju mesti mengimbas.

healthIndicatorColor = (health == "Good")? "Hijau": (kesihatan == "Adil")? "Kuning": (kesihatan == "miskin")? "Merah": (kesihatan == "life_support")? "Oren": "ungu";

Resolusi Keupayaan: Pengendali bersyarat adalah berfaedah, apabila mereka menggantikan nilai ketumpatan tinggi yang ditetapkan berdasarkan syarat yang dilaksanakan melalui kenyataan jika. Operator bersyarat merosakkan, apabila mereka menggantikan walaupun beberapa keputusan yang tertanam dalam satu sama lain. Imperatif yang sesuai dengan satu baris adalah sasaran utama untuk pengendali bersyarat, sementara syarat-syarat yang memerlukan beberapa baris adalah domain pernyataan jika. Mana-mana penggunaan pernyataan jika bersyarat atau pengendali bersyarat perlu diperbetulkan untuk menggunakan penggunaan yang sesuai bagi salah satu daripada mereka yang membina. (Nota: Modifikasi mungkin memerlukan refactoring yang ketara.)

jika (kesihatan == "Baik") {
 healthIndicatorColor = "green";
} lain jika (kesihatan == "Adil") {
 healthIndicatorColor = "yellow";
} lain jika (kesihatan == "miskin") {
 healthIndicatorColor = "red";
} lain jika (kesihatan == "life_support") {
 healthIndicatorColor = "orange";
} else {
 healthIndicatorColor = "ungu";
}
label1.Color = (label1IsRequired)? "merah hitam";
label2.Color = (label2IsRequired)? "merah hitam";
label3.Color = (label3IsRequired)? "merah hitam";

Penyata Pelbagai Pelbagai vs. Penyata Pulangan

Dua gaya tertentu yang membawa kepada hujah adalah berbilang pulangan dan pulangan tunggal. Ketidaksesuaian timbul sama ada kaedah sepatutnya mempunyai satu penyata pulangan atau sama ada pernyataan pulangan berganda boleh diterima. Setiap pendekatan mempunyai positif dan negatif.

Penyataan Pelbagai Pulangan: Penyataan berbilang pulangan boleh menyumbang kepada kod yang sukar difahami, diikuti dan diuji. Walau bagaimanapun, kaedah dengan pulangan berganda boleh menjadi lebih pendek daripada fungsi dengan pulangan tunggal.

SomeDataType someMethod (param1, param2, param3) {
 SomeDataType retVal;
 jika (param1 == null) {
 retVal = null
 }
 jika (retVal == null) {
 pulangan retVal;
 }
 
 jika (param2! = null) {
 retVal = param2;
 }
 jika (retVal.Equals (param2)) {
 pulangan retVal;
 }
 
 retVal = param3;
 pulangan retVal;
}

Satu Kenyataan Pulangan: Kenyataan pulangan tunggal boleh membawa kepada kaedah yang panjang. Namun, prosedur ini mempunyai satu titik keluar, memudahkan ujian dan debugging.

SomeDataType someMethod () {
 SomeDataType retVal;
 / ratusan atau ribuan kod baris
 pulangan retVal;
}

Resolusi Potensi: Pulangan berganda membuat kod sukar untuk difahami, diikuti dan diuji, apabila ia digunakan secara tidak konsisten. Penyataan pulangan tunggal membawa kepada kaedah yang panjang, apabila diteruskan dengan kod panjang. Rentang yang ditarik keluar dapat dipendekkan, atau sekurang-kurangnya dibuat boleh dibaca, dengan menggunakan beberapa pernyataan pulangan dan bukannya satu. Pulangan tunggal boleh diterima dengan sempurna, apabila mereka mengikuti kod pendek kod. Sebarang penyalahgunaan pernyataan pulangan atau pulangan berganda sepatutnya ditetapkan untuk memohon kes penggunaan yang diterima bagi salah satu daripada gaya tersebut. (Nota: Pembetulan mungkin memerlukan refactoring yang penting.)

SomeDataType someMethod (param1, param2, param3) {
 jika (param1 == null || param3 == null) {
 pulangan null;
 }
 
 SomeDataType retVal = null;
 jika (param2! = null {
 retVal = param2;
 } lain jika (param1! = null) {
 retVal = param1;
 } ele if (param3! = null) {
 retVal = param3;
 }
 pulangan retVal;
}
SomeDataType someMethod (param1, param2) {
 SomeDataType retVal = null;
 untuk (int i = 0; i  jika (param1 [i] .equals (param2)) {
 retVal = param1 [i];
 pecah;
 }
 }
 pulangan retVal;
} Cuti dan Teruskan Penggunaan di Gelung

Istirahat dan terus membina adalah subjek perdebatan sengit. Di satu sisi hujah, pemaju berhujah bahawa memecah dan meneruskan dapat memudahkan aliran kawalan. Pengaturcara lain berpendapat bahawa ciri-ciri ini merumitkan logik program. Cuti dan terus boleh digunakan untuk mempermudah atau merumitkan kod. Garis-garis ini boleh dilihat.

Pecah dan Teruskan Penggunaan: Unsur-unsur boleh menyederhanakan kod, tetapi mereka juga tidak dapat merumitkannya.

SomeDataType someMethod (param1, param2) {
 SomeDataType retVal = null;
 untuk (int i = 0; i  jika (param1 [i] == null) {
 terus;
 }
 jika (param1 [i] .equals (param2)) {
 retVal = param1 [i];
 pecah;
 }
 }
 pulangan retVal;
}
SomeDataType someMethod (data, param1) {
 SomeDataType retVal = null;
 lakukan sesuatu:
 untuk (int i = 0; i  jika (i> = data.length) {
 pecah;
 }
 jika (data [i] .equals (param1)) {
 retVal = data [i];
 } else {
 terus;
 }
 }
jika (retVal == null) {
 data - refreshData ();
 goto dosomething;
 }
pulangan retVal;
}

Resolusi Keupayaan: Kebanyakan pemaju berhujah bahawa kod harus menggunakan mekanisme mudah untuk aliran kawalan. Mekanisme tertentu yang mudah adalah sumber perdebatan. Hujah ini menjadi kurang panas, apabila setiap instrumen digunakan dalam cara yang diterima secara meluas. Pendekatan yang diterima ada untuk berehat dan meneruskan. Tetapkan kepada konvensyen-konvensyen untuk mengelakkan ketidaksepakatan dan memudahkan aliran kawalan. Mana-mana cara kawalan yang melanggar peraturan tersebut harus diperbetulkan tanpa perdebatan.

SomeDataType someMethod (data, param1) {
 SomeDataType retVal = null;
 untuk (int i = 0; i  jika (data [i] == null) {
 terus; // skip rehat gelung
 }
 jika (data [i] .equals (param2)) {
 retVal = data [i];
 pecah; // jangan gelung lagi b / c saya sudah selesai
 }
 }
 pulangan retVal;
}

Pengecualian Defensif

Pengecualian adalah satu cara untuk menunjukkan masalah atau menangkis isu masa depan. Sakit kepala apa yang perlu ditunjukkan atau diletakkan di bawah oleh bahagian-bahagian kod yang merupakan topik perdebatan sengit. Pada satu penghujung ketidaksepakatan, para coders berhujah bahawa pengecualian defensif yang meluas menghalang kesilapan dan menjadikannya mudah di lokasi. Walau bagaimanapun, senarai cucian pertahanan itu boleh membuat kod bengkak dan sukar difahami, seperti yang dikatakan beberapa pengaturcara. Pemaju di kedua-dua belah perdebatan mempunyai titik. Pengecualian defensif mempunyai manfaat dan kerugian.

Manfaat dan Penolakan Pengecualian Defensif: Perlindungan daripada kesalahan dan masalah lain boleh dijaga, dengan kelemahan minimum, menggunakan pengecualian defensif. Kekurangan itu menjadi lebih besar, apabila teknik itu secara sembarangan.

void someMethod (param1, param2) {
 jika (param1 == null || param2 == null) {
 membuang ArgumentNullException baru ("Satu atau lebih parameter hilang");
 }
 / / lakukan kaedah kaedah
}
void someMethod (param1, param2) {
 / puluhan baris cek pertahanan ... ..
 // lakukan kaedah lain
}

Resolusi Keupayaan: Kekurangan pengecualian defensif adalah terkecil, apabila ia digunakan dalam penggunaan yang diterima. Mana-mana penggunaan teknik yang menyimpang dari konvensyen-konvensyen tersebut perlu diperbetulkan, melainkan jika alasan yang menarik diberikan.

public void someMethod (param1, param2) {
 // periksa setiap parameter dalam kaedah awam
 jika (param1 == null || param2 == null) {
 membuang ArgumentNullException baru ("Satu atau lebih parameter hilang");
 }
 
 // menangkis masalah yang menyebabkan data tidak sah
 jika (! isValid (param1) ||! isValid (param2)) {
 buang InvalidParameterException baru ("Parameter satu atau lebih tidak sah");
 }
 
 // buat sesuatu dengan parameter
}

Wrap-up

Kod pembinaan dan teknik ini digunakan oleh kedua pemaju yang baik dan buruk. Pengaturcara adalah orang. Manusia mempunyai kecenderungan. Kecenderungan ini menunjukkan diri mereka dalam kod. Kadang-kadang, impuls pemaju membawanya untuk menulis kod yang coders lain betul-betul mengkritik. Pemaju yang dibuang tidak semestinya seorang pemrogram yang buruk. Pengkod yang mengkritiknya tidak semestinya pemaju yang baik. Kedua-dua orang mungkin telah tersesat, pada satu ketika, dengan keutamaan mereka. Keinginan ini tidak boleh menyebabkan pembangunan merosot ke dalam penghinaan yang tidak pernah berakhir yang dilemparkan di antara satu sama lain. Sebaliknya, pengaturcara harus mengkaji semula kod masing-masing, menghadkan pertempuran mereka ke bahagian yang paling teruk, dan bersetuju untuk menyelesaikan hujah-hujah tertentu melalui peraturan yang dinyatakan di atas.