Cara terbaik untuk memecah kode luar biasa menjadi potongan yang bisa dikelola?


13

Saya terus kewalahan oleh proyek-proyek besar, begitu mereka mencapai tingkat kompleksitas tertentu. Begitu saya mencapai titik tertentu dalam sebuah proyek, kemajuan saya melambat dan saya mendapati diri saya terus-menerus menelusuri kembali langkah-langkah saya dan memilah segala macam kebingungan.

Saya menjadi sangat ahli dalam refactoring karena kelemahan saya ini. Dan saya selalu mencoba menguraikan objek saya menjadi lebih kecil, lebih mudah dikelola. Kelemahan ini juga mungkin menyebabkan saya terlalu memperhatikan mendesain sesuatu dengan baik.

Saya tahu jika saya dapat memecah masalah saya menjadi yang lebih kecil, saya akan dapat menyelesaikannya dengan lancar. Salah satu strategi yang muncul dalam pikiran adalah pengembangan yang digerakkan oleh tes. Apa lagi yang bisa saya lakukan?


2
"Saya selalu mencoba menguraikan objek saya menjadi yang lebih kecil, lebih mudah dikelola" dan "Saya tahu jika saya dapat memecah masalah saya menjadi lebih kecil, saya akan dapat menyelesaikannya dengan lancar" buat pertanyaan Anda sedikit retoris.
Morgan Herlocker

2
Baca Refactoring (Fowler) dan Pola Desain (GoF) . Pertanyaan ini benar-benar bertanya "Bagaimana cara menyusun kode?" dan jika Anda menanyakan hal itu, Anda harus menempuh perjalanan panjang ; jangan bergantung pada utas T&J tunggal untuk memberi Anda jalan tengah.
Aaronaught

Jawaban:


13

berhenti memikirkan kodenya

mulailah berpikir tentang lapisan, fitur, modul, layanan, dan abstraksi tingkat tinggi lainnya

Anda menjadi kewalahan karena Anda berpikir pada level yang terlalu rendah


9

Membuat kompleks menjadi mudah itu mudah ; tunggu pikir itu sebaliknya.

Semua orang berjuang dengan ini, tidak ada solusi langsung yang memiliki efektivitas ekstrim.

Karena Anda tidak mencantumkan ini dalam pertanyaan Anda, saran saya adalah:

Fokus pada kohesi fungsional melalui:

Prinsip tanggung jawab tunggal menyatakan bahwa setiap objek harus memiliki tanggung jawab tunggal, dan tanggung jawab itu harus sepenuhnya dienkapsulasi oleh kelas. Semua layanannya harus selaras dengan tanggung jawab itu.

Jika Anda Google di antara hasil di halaman pertama Anda akan menemukan dua sumber daya hebat:

  • " Single Responsibility Principle " oleh Robert C. Martin (Feb / 2002): Prinsip ini membahas perlunya menempatkan hal-hal yang berubah karena alasan berbeda di kelas yang berbeda.
  • " Curly's Law: Do One Thing " oleh Jeff Atwood (Mar / 2007): Prinsip Tanggung Jawab Tunggal mengatakan bahwa kelas harus memiliki satu, dan hanya satu, alasan untuk berubah.

Apa kohesi dalam ilmu komputer?

Kohesi adalah ukuran seberapa kuat terkait atau fokus tanggung jawab satu modul. Seperti yang diterapkan pada pemrograman berorientasi objek, jika metode yang melayani kelas yang diberikan cenderung serupa dalam banyak aspek, maka kelas dikatakan memiliki kohesi yang tinggi. Dalam sistem yang sangat kohesif, keterbacaan kode dan kemungkinan penggunaan kembali meningkat, sementara kompleksitas tetap dapat dikelola.

Kohesi menurun jika : - Fungsionalitas yang tertanam dalam suatu kelas, diakses melalui metodenya, memiliki sedikit kesamaan. - Metode melakukan banyak kegiatan yang bervariasi, sering menggunakan set data kasar atau tidak terkait.

Kerugian dari kohesi rendah (atau "kohesi lemah") adalah: - Meningkatnya kesulitan dalam memahami modul. - Meningkatnya kesulitan dalam memelihara sistem, karena perubahan logis dalam domain memengaruhi banyak modul, dan karena perubahan dalam satu modul memerlukan perubahan pada modul terkait. - Meningkatnya kesulitan dalam menggunakan kembali modul karena sebagian besar aplikasi tidak memerlukan rangkaian operasi acak yang disediakan oleh modul.

Jika Anda memiliki pertanyaan, beri tahu saya.


1

Membusuk fitur menjadi barang sekecil mungkin. Misalnya, satu bidang pada formulir. Pilih yang paling berisiko atau prioritas tinggi dan maju seperti perbaikan bug sederhana, bukan proyek besar. Memang benar bahwa Anda akan berakhir dengan beberapa refactoring nanti, tetapi setidaknya Anda akan bergerak maju.


1

Dari pengalaman saya, Anda telah menjawab pertanyaan Anda sendiri dengan komentar tentang TDD. Bagi saya, saya sering merasakan hal yang sama dengan Anda, kesuksesan cepat awal dengan cepat berubah menjadi macet pada detail kecil begitu sistem mencapai ukuran tertentu. Saya menemukan dengan TDD itu membantu karena Anda dapat menangani setiap bagian dari sistem sebagai potongan kecil, mengetahui bahwa sisa sistem akan atau harus terus bekerja ketika Anda meninggalkannya. Saya pikir juga, dengan TDD membantu memastikan sistem Anda jelas dibagi menjadi potongan-potongan kecil yang dapat diuji secara independen.


0

Beberapa orang pandai merancang program modular, mudah dimengerti, tetapi sebagian besar programmer tidak memiliki fasilitas ini, pada tingkat yang lebih rendah atau lebih besar. Saya tahu tidak ada buku, prosedur atau praktik yang dapat mengubah salah satu dari jenis programer yang pertama menjadi yang kedua, kecuali mungkin untuk banyak pengalaman. Tetapi saya bahkan tidak yakin tentang itu.

Intinya adalah bahwa sebagian besar programmer akan berjuang untuk naik di atas yang biasa-biasa saja, beberapa akan berhasil menjadi OK (yang mana saya akan menempatkan diri dan mungkin 50% dari programmer profesional di (katakanlah) industri IB), dan sangat minoritas kecil akan sangat baik. Saya harus mengatakan saya belum pernah dalam karir panjang saya bertemu dengan salah satu yang luar biasa ini :-)


2
Saya melihat dari mana Anda berasal dan sebagian dari saya setuju dengan Anda, tetapi saya merasa bahwa itu adalah kekalahan. Ya tidak ada pil ajaib yang akan mengubah programmer yang buruk menjadi yang baik, tetapi melalui pengalaman, pembelajaran yang ditargetkan dan evaluasi yang jujur ​​atas pekerjaan yang dilakukan, perbaikan terjadi. Seberapa cepat dan di mana dataran tinggi itu tergantung pada individu, tetapi saya pikir banyak tentang motivasi.

1
+1 @Mouth of a Cow: Setuju, dan begitu juga Peter Norvig , Direktur Penelitian Google, yang merupakan programmer "sangat baik": Teach Yourself Programming in Ten Years
blunder

1
@blunders - artikel yang bagus. Itu adalah rahasia kecil kotor yang tidak ingin diberitahukan oleh petugas pemasaran (kecuali Sega tentu saja). Berlatih, berlatih, berlatih. Ini seharusnya bekerja untuk Jepang juga alljapaneseallthetime.com/blog

Saya memiliki seorang rekan kerja yang menyimpulkan bahwa beberapa pengembang "buta desain" dan tidak dapat merancang sistem yang besar dan dapat dikelola dengan rapi. Jika Anda buta desain, tidak ada yang akan membantu Anda. Buku Pola Desain GOF mungkin membantu programmer yang belum pernah melihat desain yang bagus, tetapi telah menulis banyak kode.
Tim Williscroft

0

Saya pikir banyak orang mencoba solusi over-engineer. Mereka mengambil pendekatan "Adam & Hawa" ketika yang sedikit lebih praktis akan menyederhanakan banyak hal.

Kelas khusus tidak jahat, mereka adalah konsekuensi alami dari desain perangkat lunak yang sehat.

Banyak programmer, menurut saya, gagal memahami hal ini dan tidak ada buku yang saya ketahui yang membuat ini menjadi jelas.

Hal lain yang tentu saja membantu adalah TDD, yang memungkinkan Anda memahami "bagaimana" Anda akan menggunakan kelas dalam praktik dan dalam banyak kasus dapat menghemat hari, karena itu menunjukkan masalah / keterbatasan akhirnya di awal hari.

Terakhir, satu hal SANGAT penting yang akan saya cari jika saya adalah Anda adalah pola desain. Pola desain adalah cara orang lebih pintar daripada Anda atau saya memecahkan masalah pemrograman. Gagasan di balik pola, coba tebak ?, apakah itu tidak akan digunakan sebagai buku masak, resep yang baru saja Anda banting di sana, tetapi pikirkan dengan cermat dan pahami domain aplikasi Anda terlebih dahulu dan terutama.

Penggunaan pola yang bijak akan sangat mengurangi jumlah detail yang harus Anda kelola.

Perpustakaan pola desain yang bagus yang dirancang sesuai kebutuhan Anda, akan terbukti sangat berharga. Mari kita lihat contoh yang sangat sederhana hanya untuk meletakkan segala sesuatu dalam konteks:

bayangkan Anda memiliki formulir di mana, ketika tombol ditekan, formulir lain harus memperbarui sendiri. Ini adalah pola "pengamat" yang khas. Anda memiliki subjek dan beberapa pengamat, yang mendaftarkan diri mereka dengan subjek. Mengapa Anda perlu mengimplementasikan antarmuka? Anda bisa menambahkan metode, atau lebih baik lagi, menggunakan antarmuka untuk pengamat dan daftar umum untuk subjek. Sekarang Anda mendapatkan yang terbaik dari kedua dunia: kemandirian bagi pengamat dan tidak ada hal-hal yang luar biasa pada subjek.

Semoga ini masuk akal bagi Anda!

Andrea


Ngomong-ngomong, hanya untuk memperjelas: Saya tidak mengadvokasi kelas liar yang tumbuh seperti gremlin, melainkan hanya berita menarik yang lebih praktis :)
Andrea Raimondi

0

Masalah kecepatan dev dan keterbacaan mungkin muncul ketika kita mengabaikan perlunya abstraksi. Dalam beberapa basis kode besar yang telah saya kerjakan, satu-satunya musuh yang paling umum adalah jumlah sekian kelas khusus yang memiliki fungsi yang sangat mirip yang menyebabkan kode menggembung. Jika kita mundur selangkah dan memahami persyaratan secara keseluruhan bukan sebagai bagian dari aplikasi, maka banyak abstraksi akan muncul di pikiran kita.

Beberapa langkah sederhana yang telah membantu saya

  • Gunakan penganalisis kesamaan (seperti Simian) untuk menemukan blok kode duplikat di seluruh basis kode. Banyak kode duplikat berarti lebih sedikit abstraksi.
  • Memantau ukuran kelas dan metode, kelas besar dan metode berarti beberapa layanan atau pengendali menjadi dewa.
  • Buat tes unit / integrasi wajib, memberi Anda kepercayaan diri untuk refactor dan juga bertindak sebagai spesifikasi.
  • Retrospektif setiap dua minggu dengan bisnis untuk memahami jika istilah teknis / bisnis / domain yang mereka gunakan tercermin dalam nama kelas. Ini membantu dalam memahami dan mendapatkan nama untuk koleksi kelas satu alih-alih mewakili set dan daftar sederhana. Beberapa abstraksi yang tidak pernah kita pikirkan juga akan muncul ketika kita duduk bersama para pelaku bisnis.

itu tentang hal yang saya anjurkan juga. Apa yang saya pikirkan adalah harus ada keseimbangan antara abstraksi dan spesialisasi: terlalu banyak spesialisasi sama buruknya dengan terlalu banyak abstraksi.
Andrea Raimondi
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.