Teknik pemrograman yang digunakan secara berlebihan atau disalahgunakan [ditutup]

38

Apakah ada teknik dalam pemrograman yang Anda temukan terlalu sering digunakan (IE menggunakan cara yang lebih berlebihan dari yang seharusnya) atau disalahgunakan, atau menggunakan sedikit untuk semuanya, sementara tidak menjadi solusi yang benar-benar baik untuk banyak masalah yang orang coba lakukan selesaikan dengan itu.

Itu bisa berupa ekspresi reguler, semacam pola desain atau mungkin suatu algoritma, atau sesuatu yang sama sekali berbeda. Mungkin Anda pikir orang menyalahgunakan beberapa pewarisan, dll.

Anto
sumber
33
Saya setuju bahwa IE digunakan secara lebih berlebihan dari yang seharusnya, tetapi itu terutama oleh non-programmer. . .
Eric Wilson
7
@FarmBoy - Saya pikir maksudnya IE: "Yaitu" singkatan dari "yaitu," yang ditulis sepenuhnya dalam bahasa Latin adalah 'id est'.
Raphael
Memperbaikinya sekarang :)
Anto
4
Teknik apa pun bisa (dan sering disalahgunakan), itu hanya harus disajikan sebagai peluru perak berikutnya dan Anda akan menemukan seseorang yang memperlakukan setiap masalah sebagai paku (untuk mencampur metafora).
ChrisF
8
@ Rapheal - Saya bercanda, tentu saja. Terima kasih atas pendidikannya.
Eric Wilson

Jawaban:

73

Komentar dalam Kode

Saya hanya berharap para Profesor Universitas akan mengerti bahwa mereka tidak perlu mengajar siswa mereka untuk menulis 10 baris komentar dengan mengatakan kode berikut adalah untuk loop, iterasi dari 1 ke jumlah x. Saya bisa melihatnya di kode!

Ajari mereka untuk menulis kode pendokumentasian diri terlebih dahulu kemudian mengomentari dengan tepat tentang apa yang tidak bisa didokumentasikan dengan baik sendiri. Dunia perangkat lunak akan menjadi tempat yang lebih baik.

Dan McGrath
sumber
26
Kode yang mendokumentasikan sendiri tidak. Juga para profesor melakukan ini untuk mengajar siswa untuk mengonseptualisasikan masalah dan cara mendekatinya. Selain itu saya belum pernah melihat orang mengeluh tentang terlalu banyak dokumentasi. Peringatan menjadi dokumentasi sudah benar.
Woot4Moo
24
@ Woot4Moo: jika Anda membaca Clean Code, Fowler dengan jelas menyatakan bahwa dokumentasi yang kedaluwarsa lebih buruk daripada tidak ada dokumentasi, dan bahwa semua komentar memiliki kecenderungan menjadi basi dan bermigrasi dari kode yang mereka dokumentasikan. Seluruh buku itu adalah semua tentang bagaimana menulis kode yang mendokumentasikan diri.
Scott Whitlock
12
Mengajar mereka untuk mengganti komentar dengan kode akan menjadi awal yang baik ...
Shog9
15
+1. Saya benar-benar melihat yang berikut dalam kode dunia nyata: "loopVar ++; // increment loopVar". AAAAAAAAAAAAARRRRRGH!
Bobby Tables
7
@ Bill: Menurut saya, Anda tidak perlu mendokumentasikan logika generik dan struktur kontrol, meskipun relatif kompleks. Pada dasarnya, apa pun yang dapat dikerjakan oleh pengembang yang baik yang mengerti bahasa harus dengan menganalisis kode tidak perlu dikomentari. misalnya. Serangkaian bersarang untuk loop dengan beberapa istirahat di dalamnya, dll. Tapi apa yang HARUS dikomentari adalah alasan khusus aplikasi mengapa kode membuat keputusan itu: misalnya. "Jika seorang programmer baru mulai di perusahaan besok dan melihat kodenya, akankah itu masuk akal tanpa komentar komentar?"
Bobby Tables
57

Pola desain tunggal.

Tentu, ini adalah pola yang berguna tetapi setiap kali seorang programmer baru belajar tentang pola ini ia mulai mencoba menerapkannya pada setiap kelas yang ia ciptakan.

Raphael
sumber
Saya menggunakan alasan yang dirancang dengan buruk ini untuk kerangka kerja setiap hari. codeigniter.com/user_guide/libraries/email.html Mereka pikir OOP adalah fungsi awalan $this->. PHP adalah bahasa yang busuk sehingga saya tidak bisa mengharapkan kerangka kerja menjadi sangat baik.
Keyo
7
Saya pikir setiap programmer yang mengimplementasikan singleton dan tidak bertobat akan terbakar di neraka yang berapi-api untuk dosa-dosa yang telah dia lakukan.
2
Saya menerapkan singleton sekali dalam karir profesional saya (dalam konteks multitasking) dan saya harus bertobat untuk dosa saya dengan menulis ulang.
Spoike
3
Lajang bisa berguna untuk beberapa hal, tetapi hampir selalu digunakan ketika seharusnya tidak. Itu tidak berarti lajang tidak boleh digunakan - hanya karena sesuatu dilecehkan tidak berarti itu tidak dapat digunakan dengan benar.
konfigurator
2
@Apapel: Itulah mengapa saya tidak percaya mempelajari pola desain adalah hal yang baik.
konfigurator
53

Hal paling jahat untuk melindungi pemrograman bodoh. letakkan semuanya dalam tangkapan mencoba dan tidak melakukan apa-apa dengan tangkapan

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

Saya ngeri ketika saya melihat try catch yang tidak melakukan apa-apa dan dirancang untuk menangani logika bodoh. Secara umum hasil tangkapan try over, namun dalam beberapa kasus sangat berguna.

Nickz
sumber
4
Lucunya - Saya baru saja mengedit file yang melakukan itu ratusan kali, dan dengan alasan yang bagus. Ini adalah file tes unit, menguji berbagai metode melemparkan pengecualian ketika diharapkan. Blok percobaan berisi panggilan dan laporan "lemparan yang diharapkan tidak terjadi". Pengecualian diharapkan dan benar, sehingga tidak ada tindakan korektif. Jelas unit test adalah kasus khusus, tetapi saya memiliki kasus serupa dalam kode nyata. Bendera merah, ya, tapi bukan aturan mutlak.
Steve314
5
@Menyelesaikan kasus yang Anda gambarkan adalah kondisi tepi yang langka. Satu lagi yang bisa saya pikirkan adalah kode logging - jika logging itu sendiri gagal, tidak ada gunanya mencoba mencatat pengecualian, atau mengganggu aplikasi.
dbkk
1
@ dbkk - menyetujui kondisi tepi, dan saya akan menambahkan bahwa ketika Anda benar-benar perlu menangkap pengecualian tetapi tidak perlu tindakan korektif, menambahkan komentar di blok tangkap untuk menjelaskan yang penting jika hanya untuk menenangkan pemelihara. Tidak begitu jarang dalam unit test, jadi saya akan menjatuhkan komentar dalam hal itu.
Steve314
5
pada error resume berikutnya
jk.
2
@ jk01 - pengecualian bukan merupakan kesalahan. Apakah ada kondisi yang salah atau tidak tergantung pada konteks. Misalnya, "file tidak ditemukan" bukan kesalahan jika Anda tidak membutuhkan file. Mungkin itu hanya file pengaturan opsional yang mungkin atau mungkin tidak ada, dan Anda bisa membiarkan default Anda di tempat jika file tidak ada di sana (jadi tidak ada tindakan korektif yang diperlukan setelah penangkapan).
Steve314
47

Ketergantungan pada StackOverflow untuk menyelesaikan masalah Anda alih-alih mencari jalan keluar yang sulit.

Pemrogram baru yang menemukan banyak pengetahuan di SO (terlalu sering) memposting sebelum berpikir dan mencoba hal-hal.

Di hari saya kami harus kode dari buku, tidak ada internet, tidak ada SO. Sekarang turunlah dari halaman saya.

Byron Whitlock
sumber
28
Saya harus mengakui, saya tersentak pada keberanian beberapa pertanyaan pada SO. Entah karena mereka diminta berkali-kali setiap hari dan mereka jelas tidak mencari sama sekali; atau lebih buruk lagi, mereka memperlakukan komunitas sebagai layanan outsourcing gratis.
Orbling
2
@dbkk: stackoverflow.com/questions/4665778/… -> komentar pertama "apakah Anda pernah mencoba ini?"
Matthieu M.
5
Saya mulai belajar dari buku-buku tetapi begitu saya memiliki dasar, saya belajar hampir semua hal lain dari diskusi forum online. Bukan dengan bertanya, tetapi terutama (dan pada awalnya, secara eksklusif) dengan membaca. Metode ini telah mengajarkan saya beberapa bahasa pemrograman secara mendalam (dengan banyak celah dan celah), dan saya pikir itu bukan metode yang buruk sama sekali.
Konrad Rudolph
1
@Konrad Rudolph: Metode itu bagus dan bijaksana, membaca pertanyaan, mencari dengan baik. Penanya paling baik dilakukan ketika penanya memiliki kerangka kerja untuk memahami jawabannya. Terlalu sering orang mengajukan pertanyaan yang belum mereka pahami.
Orbling
3
masalahnya adalah bahwa SO mendorong ini dengan memberikan banyak perwakilan untuk bertanya / menjawab pertanyaan yang sangat mudah yang dapat dijawab dengan pencarian google sederhana. pertanyaan yang sangat sulit dijawab orang hanya karena mereka benar-benar menginginkannya.
IAdapter
36

OOP jelas. Ini sangat berharga, tetapi ketika disalahgunakan dapat mengaburkan kode yang jelas jika tidak cukup mudah (beberapa contoh pemrograman S4 dalam R datang ke pikiran), dan dapat memberikan overhead yang luar biasa yang tidak perlu dan dapat menghabiskan banyak waktu untuk kinerja.

Hal lain adalah bahwa (dalam Perl misalnya) OOP sering turun untuk menulis hal yang sama result = $object ->function(pars)sebaliknya : bukannya result = function(object, pars)ini kadang-kadang masuk akal, tetapi ketika dicampur dengan pemrograman prosedural itu dapat membuat membaca kode cukup membingungkan. Dan terlepas dari itu, Anda hanya memperkenalkan lebih banyak overhead di mana itu tidak meningkatkan desain. Berasal dari apa yang dikatakan tentang pola singleton juga: Harus digunakan, tetapi tidak pada segalanya.

Saya memang menggunakan OOP sendiri, tetapi dalam bidang saya (komputasi ilmiah) kinerja adalah masalah besar, dan OOP sering disalahgunakan di sana karena semua siswa mendapatkan Java saat ini. Ini bagus untuk menangani masalah yang lebih besar, untuk membuat konsep dan sebagainya. Tetapi jika Anda bekerja dengan misalnya sekuens DNA dalam BioPerl, menggunakan objek setiap kali dan bekerja secara konsisten dengan getter dan setter dapat meningkatkan waktu perhitungan sepuluh kali lipat. Ketika kode Anda berjalan beberapa hari, bukan beberapa jam, perbedaan itu sangat penting.

Joris Meys
sumber
6
@Craige: Saya menggunakan OOP sendiri, tetapi dalam bidang saya (komputasi ilmiah) kinerja adalah masalah besar, dan OOP sering disalahgunakan di sana karena semua siswa mendapatkan Jawa saat ini. Ini bagus untuk menangani masalah yang lebih besar, untuk membuat konsep dan sebagainya. Tetapi jika Anda bekerja dengan misalnya sekuens DNA dalam BioPerl, menggunakan objek setiap kali dan bekerja secara konsisten dengan getter dan setter dapat meningkatkan waktu perhitungan sepuluh kali lipat. Ketika kode Anda berjalan beberapa hari, bukan beberapa jam, perbedaan itu sangat penting.
Joris Meys
1
@Craige: Metode chaining (seperti Foo.DoX().DoY().DoZ()) itu bagus, tapi, tapi itu jelas bukan satu-satunya cara untuk melakukan sesuatu. Komposisi fungsi (suka doZ . doY . doX $ fooadalah alternatif yang benar-benar valid.
Anon.
1
@ Joris: sesuatu yang telah saya pikirkan sejak lama (saya sendiri seorang bioinformatika): jika kinerja sangat penting, mengapa menggunakan Perl di tempat pertama alih-alih C ++? Jika Anda khawatir tentang menghilangkan faktor 10 dari runtime (kekhawatiran yang valid!) Kemudian beralih ke C ++ memberi Anda kepuasan instan. Tentu saja, bahasanya menyebalkan ... tapi kemudian, begitu juga Perl ... dan ada perpustakaan bioinformatika yang bagus untuk C ++.
Konrad Rudolph
1
@ Konrad: Tergantung. BioPerl memiliki paket paling banyak untuk bioinformatika dari semua bahasa (saya rasa Python sedang mengejar). Plus, banyak pekerjaan telah dilakukan dalam Perl dan mengadaptasi skrip lebih mudah daripada menulis ulang semuanya dalam C ++. Terakhir, itu tidak berfungsi untuk menulis aplikasi yang lengkap ketika skrip akan melakukannya. Tebak itu sebabnya Perl masih sekitar itu. Dan jujur, saya tidak keberatan, saya suka bahasanya. Ini masih yang terbaik yang saya tahu untuk pekerjaan string dan file. Perhitungannya jelas dilakukan dalam bahasa lain dan ditautkan kembali (yang berjalan cukup mudah).
Joris Meys
1
@ Konrad: itu tergantung pada bagaimana seseorang melakukannya. Dimungkinkan untuk melakukan semuanya di Perl, tetapi Perl dapat dengan mudah dihubungkan ke alat lain, terutama di Linux. Saya sering menggunakan Perl sebagai skrip bash tingkat lanjut dengan manipulasi string yang kuat dan konstruksi dataset yang mudah untuk dimasukkan ke aplikasi lain.
Joris Meys
27

Setelah menghabiskan beberapa tahun di ASP.NET Webforms, saya harus mengatakan dengan tegas:

UI Smart

Walaupun sepenuhnya mungkin untuk membuat aplikasi berlapis dan dapat diuji dalam formulir web, Visual Studio membuatnya terlalu mudah bagi pengembang untuk mengklik satu kali cara mereka untuk mengikat dengan ketat ke sumber data mereka, dengan logika aplikasi berserakan di sekitar semua kode UI.

Steve Sanderson menjelaskan anti-pola ini jauh lebih baik daripada yang saya bisa dalam bukunya Pro ASP.NET MVC:

Untuk membangun aplikasi Smart UI, pengembang pertama membangun UI, biasanya dengan menyeret serangkaian widget UI ke kanvas, dan kemudian mengisi kode pengendali event untuk setiap klik tombol yang mungkin atau acara UI lainnya. Semua logika aplikasi berada di event handler ini: logika untuk menerima dan memvalidasi input pengguna, untuk melakukan akses dan penyimpanan data, dan untuk memberikan umpan balik dengan memperbarui UI. Seluruh aplikasi terdiri dari penangan acara ini. Pada dasarnya, ini adalah apa yang cenderung keluar secara default ketika Anda menempatkan seorang pemula di depan Visual Studio. Dalam desain ini, tidak ada pemisahan kekhawatiran sama sekali. Semuanya menyatu bersama, diatur hanya dalam hal berbagai peristiwa UI yang mungkin terjadi. Ketika logika atau aturan bisnis perlu diterapkan di lebih dari satu penangan, kode biasanya disalin dan ditempelkan, atau segmen tertentu yang dipilih secara acak difaktorkan ke dalam kelas utilitas statis. Karena banyak alasan yang jelas, pola desain semacam ini sering disebut anti-pola.

richeym
sumber
1
GUI adalah setidaknya semacam kode spesifikasi yang harus dipatuhi. Saya tidak berpikir programmer yang ia gambarkan akan lebih baik jika disajikan dengan file teks kosong sebagai gantinya.
4
@ qpr, saya tidak tahu tentang itu. Jika mereka memiliki file teks kosong, mereka mungkin tidak dapat melakukan apa-apa (yang mungkin hanya bonus).
Ken Henderson
Salah satu dari banyak manfaat menggunakan WPF adalah bahwa mengimplementasikan MVVM menghancurkan anti-pola ini menjadi berkeping-keping.
Robert Rossney
2
Seribu kali ini. Saya bahkan melihat pengembang .NET yang berpengalaman mengandalkan "pola" ini karena lebih mudah daripada memahami atau peduli tentang Pemisahan Masalah. Bahkan jika mereka tidak menggunakan wizard drag-and-drop, "pola" yang paling umum dalam pengembangan .NET WebForms adalah melakukan segala sesuatu dalam acara di belakang kode dan menyalin / menempelkan kode yang diperlukan.
Wayne Molina
23

Saya melihat ini sesekali dan biasanya hasil dari tidak sepenuhnya memahami ekspresi boolean.

if (someCondition == true)
Corey
sumber
16
Itu memang memiliki keuntungan membuat kode lebih eksplisit
Pemdas
7
Saya pikir melihat pertanyaan ini dalam urutan: programmers.stackexchange.com/questions/12807/…
gablin
5
Saya tidak melakukan itu tetapi, serius, lupakan saja. Ada banyak hal yang lebih buruk di luar sana. :)
MetalMikester
4
Jika Anda memberi nama variabel dengan benar, misalnya booldimulai dengan isatau has, Anda tidak perlu membuat kode lebih eksplisit = true.
Tidak ada yang
3
@DisgruntledGoat karena tidak boleh digunakan sama sekali
Corey
19

Menjalankan kembali fungsionalitas inti (atau yang disediakan lain), baik karena ketidaktahuan tentang keberadaannya atau karena kebutuhan yang dirasakan untuk penyesuaian.

l0b0
sumber
2
Belajar adalah pengecualian. Ketika mempelajari sesuatu, sering kali bermanfaat untuk "menemukan kembali roda."
Maks.
Yang pasti - saya harus menentukan bahwa itu hanya relevan ketika membuat perangkat lunak produksi.
l0b0
1
Ini sangat buruk ketika menerapkan sesuatu yang berkaitan dengan keamanan. Perangkat lunak keamanan yang baik mencegah serangan yang kebanyakan orang tidak pernah pikirkan.
David Thornley
Saya melihat ini terlalu umum. Kita butuh X, mari kita tulis sendiri! Tapi bagaimana dengan paket open-source Y? Tidak, kami membutuhkan perangkat lunak khusus untuk rahasia dagang super rahasia kami yang sama dengan orang lain di industri kami, kami tidak dapat menggunakan perangkat lunak sampah umum!
Wayne Molina
18

Warisan.

Jangan memaksakan itu-di mana itu tidak masuk akal.

Kit
sumber
6
Masalahnya adalah bahwa “is-a” secara intuitif tampak sangat masuk akal (khususnya karena setiap hubungan implementasi / kontrak secara bahasa sehari-hari dapat dinyatakan sebagai “is-a”). Dibutuhkan pemahaman yang kuat tentang OOP untuk menyadari bahwa ini sebenarnya sebuah kesalahan, dan bahwa implementasi warisan dan antarmuka pada dasarnya berbeda.
Konrad Rudolph
@Konrad - setuju sepenuhnya. Saya mencoba mendorong orang untuk memulai dengan komposisi , beralih ke antarmuka dan mempertimbangkan warisan yang terakhir. (Sebagai aturan praktis, tentu saja). Tapi mungkin itu latar belakang VB saya yang berbicara ... ;-)
Mike Woodhouse
1
Ini sebagian besar merupakan pertanyaan desain bahasa. Alasan mengapa Anda harus "lebih memilih komposisi daripada (implementasi) warisan" dalam bahasa seperti Java atau C #, adalah karena warisan implementasi menyebalkan dalam bahasa-bahasa tersebut. Beberapa orang mengkritik Konstruksi Perangkat Lunak Berorientasi Obyek Bertrand Meyer karena terlalu banyak menggunakan warisan, tetapi ketika Anda benar-benar melihat Eiffel (bahasa yang digunakan dalam buku ini), Anda menyadari bahwa itu dirancang untuk pewarisan implementasi , dan oleh karena itu, boleh saja menggunakan warisan komposisi. Dalam bahwa kasus, setidaknya.
Jörg W Mittag
14

Menyesuaikan perangkat lunak yang tidak tersedia.

Meskipun saya bisa mengakui ini bisa berguna, saya bertanya-tanya berapa banyak uang yang dihabiskan untuk menyelesaikan hal-hal kecil untuk keuntungan yang dipertanyakan. Di sinilah perusahaan dapat menghabiskan ratusan ribu jika tidak jutaan dolar untuk lisensi untuk beberapa perangkat lunak yang kemudian disesuaikan karena sangat dapat dikonfigurasi, diedit, dan fleksibel sehingga benar-benar tidak melakukan banyak hal secara default. Pada akhirnya itu adalah aplikasi khusus karena semua kode baru ditambahkan apa yang awalnya dibeli.

JB King
sumber
Bukankah ini lebih mungkin terjadi dengan aplikasi khusus?
JeffO
13

Menggunakan komplier sebagai debugger.

Mengabaikan peringatan penyusun atau mematikannya sama sekali.

Variabel global.

Pemda
sumber
18
Apa yang salah dengan "menggunakan kompiler sebagai debugger"? Memiliki kompiler yang dapat menunjukkan kesalahan dalam kode Anda sebelum menjadi masalah saat runtime adalah keuntungan yang luar biasa.
Mason Wheeler
3
Saya mengandalkan kompilator menangkap kesalahan sintaksis saya dan kesalahan pencocokan jenis yang salah. Untuk kesalahan perilaku, saya mengandalkan uji kasus.
gablin
5
Masalahnya adalah ketika Anda mulai bergantung pada kompiler untuk memastikan kebenaran program. Apakah ini kompilasi? Tidak, biarkan saya merubuhkan bagian kecil ini dan melihat apakah itu memperbaikinya. Apakah itu dikompilasi? Tidak, izinkan saya menambahkan * di sana-sini dan lihat apakah kompilasi. ... dll. Jelas, ini berguna untuk memperbaiki kesalahan ketik
Pemdas
2
Anda mengatakan bahwa seolah-olah pembuat kode itu membolak-balik dalam gelap mencoba melakukan sesuatu - apa saja - untuk mendapatkan kode untuk dikompilasi. Itu bukan cara kerjanya IME; kompiler memberi Anda pesan kesalahan yang berguna dan mengarahkan Anda ke lokasi kesalahan, dan biasanya jika ada sesuatu yang tidak dikompilasi, itu adalah kode baru yang Anda tulis sendiri, sehingga Anda memiliki ide bagus apa yang salah dan bagaimana cara memperbaikinya setelah diarahkan di luar. (Meskipun jika Anda melempar acak * di sekitar, Anda mungkin bekerja di C ++, di mana kesalahan kompiler diketahui sangat tidak membantu, jadi apa yang saya katakan mungkin tidak berlaku.)
Mason Wheeler
3
Mengandalkan kompiler bekerja dengan sangat baik, mengingat sistem tipe yang cukup kuat dan basis kode yang diketik dengan baik. Seringkali, sistem tipe dapat memodelkan batasan-batasan penting yang seharusnya Anda harus menulis tes untuk (misalnya dalam sistem mengetik yang lemah). Jadi digunakan dengan bijak, kompiler (dan terutama pemeriksa tipenya) adalah aset yang bagus untuk pengujian dan debugging, dan tidak ada yang salah dengan mengandalkannya. Secara khusus, salah mengatakan bahwa kompiler hanya dapat menampilkan kesalahan sintaksis.
Konrad Rudolph
11

Semua Pola Desain.

Mereka seperti garam atau gula. Beberapa dari mereka membuat makanan Anda enak, banyak dari mereka, membuat makanan Anda menyebalkan.

Jangan salah sangka. Pola Desain adalah teknik yang luar biasa. Saya sering menggunakannya. Tetapi kadang-kadang, saya menemukan programmer, (beberapa dari mereka mantan bos saya), yang memiliki "Anda harus menggunakan pola desain", bahkan jika tidak cocok dengan masalahnya !!!

Salah satu contoh adalah "Pola Pengunjung" yang lebih diarahkan untuk "Koleksi Lineal / Sekuensial". Saya harus bekerja dengan struktur data pohon, sekali. Untuk "mengunjungi" setiap item, saya membuat kode metode pola non desain, dan mantan bos bersikeras untuk menggunakan atau mengadaptasi "Pola Pengunjung". Lalu, saya telusuri internet, untuk pendapat kedua. Nah, programmer lain mengalami situasi yang sama, dan solusi yang sama. Dan menyebutnya "Pola Pengunjung Pohon / Hierarkis"., Sebagai Pola Desain BARU

Saya harap ini ditambahkan sebagai pola baru pada pola yang sudah ada, dalam versi baru buku "Pola Desain".

umlcat
sumber
3
Saya tidak pernah menggunakan pola desain, meskipun terkadang muncul secara alami dalam kode saya.
konfigurator
Bagaimana pepatahnya? Anda mulai menggunakan pola tanpa mengetahui Anda menggunakannya, kemudian Anda belajar tentang mereka dan menggunakannya di mana-mana, lalu mereka menjadi kebiasaan sehingga Anda mulai menggunakannya tanpa tahu Anda menggunakannya?
Wayne Molina
2
@configurator Ketika saya membaca tentang pola desain; Saya juga menemukan bahwa saya dan pengembang lain di mana sudah menggunakan beberapa dari mereka ;-)
umlcat
9

Menggunakan pengecualian sebagai kontrol aliran. Agak mirip dengan jawaban ini , tetapi berbeda.

Menelan pengecualian adalah bentuk yang buruk karena memperkenalkan kode yang misterius dan sulit ditemukan. Sebaliknya, menggunakan pengecualian sebagai kontrol aliran adalah buruk karena membuat kode jauh lebih tidak efisien daripada yang seharusnya, dan secara konsep ceroboh.

Penanganan pengecualian hanya boleh digunakan untuk menangani skenario yang benar-benar luar biasa (duh), tidak terduga, bukan hal-hal seperti pengguna mengetikkan karakter alfabet di mana angka diharapkan. Pelecehan pengecualian semacam ini sangat umum di antara programmer buruk di dunia Java.

Bobby Tables
sumber
Pengecualian untuk kode yang tidak efisien tergantung pada bahasa Anda - membuat bingkai tumpukan dll. Dalam Squeak, tumpukan Anda sepenuhnya diverifikasi, jadi tidak ada perbedaan antara menggunakan pengecualian atau tidak. (Dengan kata lain, pengecualian adalah bagian dari perpustakaan, bukan bahasa.) Namun, ini membingungkan bekerja dengan aliran kontrol yang dikontrol pengecualian: lshift.net/blog/2011/01/04/try-again-with-exceptions menunjukkan loop-using-exception yang baru-baru ini saya temukan.
Frank Shearar
Mengenai paragraf terakhir, sekali lagi, itu tergantung pada bahasa Anda. Pengecualian ("kondisi") dalam Common Lisp adalah superset ketat dari sebagian besar gagasan pengecualian bahasa. Lihat contoh di sini: gigamonkeys.com/book/... Seperti halnya semua, Anda bisa melangkah terlalu jauh!
Frank Shearar
Keterbacaan dan pemeliharaan melebihi kinerja. Kasus-kasus di mana saya akan menggunakan pengecualian untuk sukses (apa yang saya anggap Anda maksud dengan "flow control") sangat jarang, tetapi mereka dapat memberikan kode yang lebih bersih dalam misalnya pencarian rekursif yang kompleks. Secara umum, saya setuju. Sebagai contoh, saya memiliki wadah dengan metode iterator yang mengembalikan false untuk keluar dari jangkauan (umum di akhir iterasi), tetapi melemparkan pengecualian jika iteratornya "null" (tanda kemungkinan semacam inkonsistensi internal)
Steve314
7

Aku akan pergi dengan tidak fleksibel melalui penyembunyian data yang berlebihan.

Kita semua tahu bahwa abstraksi dan menyembunyikan implementasinya bagus, tetapi lebih banyak tidak selalu lebih baik. Berlebihan, Anda bisa mendapatkan hasil yang tidak fleksibel yang tidak bisa mengatasi perubahan persyaratan. Untuk menangani perubahan, Anda tidak hanya harus memodifikasi kelas yang perlu menangani perubahan itu, tetapi Anda juga harus membuat cara agar informasi yang tidak pernah dibutuhkan sebelumnya dapat diakses meskipun ada lapisan data yang disembunyikan.

Masalahnya adalah, karena dengan semua masalah menemukan-keseimbangan-tepat-untuk-setiap-konteks, dibutuhkan pengalaman.

Steve314
sumber
6

Status dan loop yang bisa berubah. Anda hampir tidak pernah membutuhkannya, dan Anda hampir selalu mendapatkan kode yang lebih baik tanpa mereka.

Misalnya, ini diambil langsung dari utas StackOverflow:

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

Mereka berdua melakukan hal yang sama. Tetapi saya tidak tahu apa yang mereka lakukan. Untungnya, pertanyaannya benar-benar menjelaskan apa yang mereka lakukan, jadi saya dapat menulis ulang mereka sebagai berikut:

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

Tidak ada loop, dan tidak ada keadaan bisa berubah. Baiklah, oke, tidak ada loop eksplisit dan tidak ada loop counter.

Kode telah menjadi jauh lebih pendek, lebih sederhana, lebih seperti deskripsi tentang apa yang seharusnya dilakukan kode (terutama dalam kasus Ruby itu secara langsung mengatakan "kelompok hal-hal berdasarkan jenis"), dan jauh lebih rentan kesalahan. Tidak ada bahaya menjalankan akhir array, kesalahan fencepost atau kesalahan off-by-one dengan indeks loop dan kondisi terminasi, karena tidak ada indeks loop dan kondisi terminasi.

Jörg W Mittag
sumber
Saya percaya bahwa pada baris kedua dari ECMAScript "tetap" Anda harus membaca (acc[thing.type] || (acc[thing.type] = [])), sebagai lawan dari `= [hal] , unless you want to add hal` ke daftar dua kali ... Atau apakah saya kehilangan sesuatu?
Austin Hyde
@ Austin Hyde: Anda benar.
Jörg W Mittag
1
Contoh ecmascript itu tidak bisa dipahami oleh banyak programmer. Itu mengandalkan terlalu banyak trik sintaksis. Pengulangan memiliki keunggulan kejelasan untuk pengembang junior.
Joeri Sebrechts
6

Mengejek. Ini memperkenalkan terlalu banyak persyaratan buatan untuk decoupling yang berlebihan ke dalam kode Anda, mengarah ke kode ravioli yang direkayasa berlebihan dan memaksa desain gaya OO ke tenggorokan Anda ketika desain yang lebih prosedural atau fungsional mungkin merupakan solusi yang lebih sederhana untuk masalah Anda.

dsimcha
sumber
Setuju dalam teori; mengolok-olok berguna tetapi Anda tidak harus memilikinya.
Wayne Molina
Invasi yang mengejek tergantung pada bahasa yang Anda gunakan. Dalam C #, itu bisa sangat invasif dan menambahkan rakit antarmuka yang tidak dibutuhkan.
Frank Hileman
3

Pemrogram Delphi di seluruh dunia telah mencari tahu selama dua tahun terakhir betapa buruknya menggunakan array karakter untuk menyimpan byte karena konversi Unicode skala besar

Dan, "segera" kita akan belajar betapa buruknya menyimpan bilangan bulat dalam daftar ketika kita ingin melakukan perubahan ke 64-bit.

Peter Turner
sumber
2
Saya pikir sebagian besar masalah Unicode tidak akan pernah muncul jika Borland telah menyatakan tipe DataString yang pada dasarnya sama dengan AnsiString tetapi khusus untuk digunakan dengan gumpalan, dan kemudian memastikan orang tahu tentang hal itu.
Mason Wheeler
2

Properti. Saya tahu ini kontroversial, tetapi saya merasa properti sangat banyak digunakan di .net.

Apa perbedaan antara dua garis ini?

public string Property { get; set; }

public string Field;

Bagi pengembang, perbedaannya adalah: sama sekali tidak ada. Bentuk yang dikompilasi sedikit berbeda, jadi jika Anda menulis perpustakaan, dan perpustakaan itu akan ditingkatkan dalam program, dan Anda tidak dapat mengkompilasi ulang program itu sendiri (misalnya jika Anda sedang menulis antarmuka untuk plugin yang harus bekerja lintas versi perangkat lunak Anda), maka Anda tidak boleh menggunakan bidang publik karena Anda tidak dapat menggantinya dengan properti. Dalam kasus lain, sama sekali tidak ada perbedaan antara menggunakan bidang atau properti otomatis tanpa pengubah.

konfigurator
sumber
1
Sepakat; jika Anda tahu 100% Anda tidak perlu melakukan apa pun dengan mendapatkan / menetapkan "properti" maka tidak ada alasan apa pun untuk memiliki properti. Namun, jika ada kesempatan Anda perlu melakukan sesuatu (mencatat bahwa nilai diubah, misalnya) maka Anda harus menggunakan properti. Secara pribadi saya tidak melihat perbedaan yang cukup besar untuk tidak menggunakan properti, hanya dalam kasus Anda lakukan perlu memodifikasi nanti (saya tahu, saya tahu YAGNItapi saya merasa menyimpang dalam hal ini tidak biaya apa-apa)
Wayne Molina
2
@Wayne: Bagaimana cara mengubah ;ke { get { ... } set { ... } }pekerjaan lebih banyak daripada mengubah { get; set; }ke { get { ... } set { ... } }?
konfigurator
Sekarang saya memikirkannya, itu poin yang adil.
Wayne Molina