Saya telah melihat beberapa jawaban dan mencari di Google, tetapi saya tidak dapat menemukan sesuatu yang membantu (yaitu, itu tidak akan memiliki efek samping yang canggung).
Masalah saya, secara abstrak, adalah bahwa saya memiliki objek dan perlu melakukan urutan operasi yang panjang di atasnya; Saya menganggapnya sebagai semacam jalur perakitan, seperti membangun mobil.
Saya percaya benda-benda ini akan disebut Object Methods .
Jadi, dalam contoh ini di beberapa titik saya akan memiliki CarWithoutUpholstery di mana saya kemudian perlu menjalankan installBackSeat, installFrontSeat, installWoodenInserts (operasi tidak saling mengganggu, dan bahkan mungkin dilakukan secara paralel). Operasi ini dilakukan oleh CarWithoutUpholstery.worker () dan menghasilkan objek baru yang akan menjadi CarWithUpholstery, di mana saya akan menjalankan mungkin cleanInsides (), verifikasi No NolUpholsteryDefects (), dan sebagainya.
Operasi dalam satu fase sudah independen, yaitu, saya sudah bergulat dengan mereka yang dapat dieksekusi dalam urutan apa pun (kursi depan dan belakang dapat dipasang dalam urutan apa pun).
Logika saya saat ini menggunakan Refleksi untuk kesederhanaan implementasi.
Yaitu, begitu saya memiliki CarWithoutUpholstery, objek memeriksa dirinya sendiri untuk metode yang disebut performSomething (). Pada saat itu ia menjalankan semua metode ini:
myObject.perform001SomeOperation();
myObject.perform002SomeOtherOperation();
...
saat memeriksa kesalahan dan hal-hal lainnya. Sementara urutan operasi adalah penting, saya telah diberi urutan leksikografis dalam kasus saya pernah menemukan beberapa rangka penting setelah semua. Ini bertentangan dengan YAGNI , tetapi biayanya sangat kecil - semacam sederhana () - dan itu bisa menghemat penggantian nama metode besar-besaran (atau memperkenalkan beberapa metode lain untuk melakukan tes, misalnya berbagai metode) di telepon.
Contoh berbeda
Mari kita katakan bahwa alih-alih membangun mobil saya harus menyusun laporan Polisi Rahasia pada seseorang, dan menyerahkannya kepada Tuan Jahat saya . Objek terakhir saya adalah ReadyReport. Untuk membangunnya saya mulai dengan mengumpulkan informasi dasar (nama, nama keluarga, pasangan ...). Ini adalah Fase A. Saya, tergantung apakah ada pasangan atau tidak, saya mungkin harus melanjutkan ke fase B1 atau B2, dan mengumpulkan data seksualitas pada satu atau dua orang. Ini dibuat dari beberapa pertanyaan yang berbeda untuk Minion Jahat yang berbeda mengendalikan kehidupan malam, kamera jalanan, kwitansi penjualan toko seks dan apa yang tidak. Dan seterusnya dan seterusnya.
Jika korban tidak memiliki keluarga, saya bahkan tidak akan memasuki fase GetInformationAboutFamily, tetapi jika saya lakukan, maka tidak relevan apakah saya pertama-tama menargetkan ayah atau ibu atau saudara kandung (jika ada). Tapi saya tidak bisa melakukan itu jika saya belum melakukan FamilyStatusCheck, yang karena itu termasuk dalam fase sebelumnya.
Semuanya bekerja dengan luar biasa ...
- jika saya perlu beberapa operasi tambahan saya hanya perlu menambahkan metode pribadi,
- jika operasi ini umum untuk beberapa fase saya bisa mewarisi dari superclass,
- operasi sederhana dan mandiri. Tidak ada nilai dari satu operasi yang pernah diperlukan oleh yang lain (operasi yang tidak dilakukan dalam fase yang berbeda),
- objek di telepon tidak perlu melakukan banyak tes karena mereka bahkan tidak bisa eksis jika objek pencipta mereka tidak memverifikasi kondisi tersebut di tempat pertama. Yaitu, ketika menempatkan sisipan di dasbor, membersihkan dasbor dan memverifikasi dasbor, saya tidak perlu memverifikasi bahwa sebenarnya ada dasbor .
- memungkinkan untuk pengujian mudah. Saya dapat dengan mudah mengejek objek parsial dan menjalankan metode apa pun di atasnya, dan semua operasi adalah kotak hitam deterministik.
...tapi...
Masalahnya muncul ketika saya menambahkan satu operasi terakhir di salah satu objek metode saya, yang menyebabkan modul keseluruhan melebihi indeks kompleksitas wajib ("kurang dari metode pribadi N").
Saya sudah membawa masalah ini ke atas dan menyarankan bahwa dalam kasus ini, kekayaan metode pribadi bukanlah tanda bencana. Kompleksitas adalah di sana, tapi itu ada karena operasi adalah kompleks, dan benar-benar itu tidak semua yang rumit - itu hanya panjang .
Dengan menggunakan contoh Evil Overlord, masalah saya adalah bahwa Evil Overlord (alias Dia Yang Tidak Akan Ditolak ) meminta semua informasi diet, Pelayan diet saya memberi tahu saya bahwa saya perlu menanyakan restoran, dapur, pedagang kaki lima, pedagang kaki lima tanpa izin, rumah kaca pemilik dll., dan Tuan Jahat (sub) - yang dikenal sebagai Dia yang Juga Tidak Akan Ditolak - mengeluh bahwa saya melakukan terlalu banyak permintaan dalam fase GetDietaryInformation.
Catatan : Saya sadar bahwa dari beberapa sudut pandang ini sama sekali bukan masalah (mengabaikan kemungkinan masalah kinerja, dll.). Semua yang terjadi adalah bahwa metrik tertentu tidak bahagia, dan ada pembenaran untuk itu.
Apa yang saya pikir bisa saya lakukan
Terlepas dari yang pertama, semua opsi ini bisa dilakukan dan, saya pikir, dapat dipertahankan.
- Saya telah memverifikasi bahwa saya bisa licik dan menyatakan setengah metode saya
protected
. Tapi saya akan mengeksploitasi kelemahan dalam prosedur pengujian, dan selain membenarkan diri sendiri ketika tertangkap, saya tidak suka ini. Juga, ini adalah ukuran sementara. Bagaimana jika jumlah operasi yang diperlukan berlipat ganda? Tidak mungkin, tetapi bagaimana? - Saya dapat membagi fase ini secara sewenang-wenang menjadi AnnealedObjectAlpha, AnnealedObjectBravo dan AnnealedObjectCharlie, dan memiliki sepertiga operasi yang dilakukan pada setiap tahap. Saya mendapat kesan bahwa ini sebenarnya menambah kompleksitas (N-1 lebih banyak kelas), tanpa manfaat kecuali untuk lulus tes. Tentu saja saya dapat berpendapat bahwa CarWithFrontSeatsInstalled dan CarWithAllSeatsInstalled adalah tahapan yang secara logis berturut-turut . Risiko metode Bravo nantinya dibutuhkan oleh Alpha kecil, dan bahkan lebih kecil jika saya memainkannya dengan baik. Tetapi tetap saja.
- Saya dapat mengelompokkan operasi yang berbeda, serupa dari jarak jauh, dalam satu operasi.
performAllSeatsInstallation()
. Ini hanya tindakan sementara dan itu meningkatkan kompleksitas operasi tunggal. Jika saya perlu melakukan operasi A dan B dalam urutan yang berbeda, dan saya telah mengemasnya di dalam E = (A + C) dan F (B + D), saya harus melepaskan ikatan E dan F dan mengocok kode sekitar . - Saya dapat menggunakan array fungsi lambda dan menghindari pemeriksaan secara rapi, tapi saya merasa kikuk. Namun ini adalah alternatif terbaik sejauh ini. Itu akan menghilangkan refleksi. Dua masalah yang saya miliki adalah bahwa saya mungkin akan diminta untuk menulis ulang semua objek metode, tidak hanya hipotesis
CarWithEngineInstalled
, dan sementara itu akan menjadi keamanan pekerjaan yang sangat baik, itu benar-benar tidak menarik banyak; dan bahwa pemeriksa cakupan kode memiliki masalah dengan lambdas (yang dapat dipecahkan, tetapi masih ).
Begitu...
- Menurut Anda, mana pilihan terbaik saya?
- Apakah ada cara yang lebih baik yang belum saya pertimbangkan? ( mungkin lebih baik aku berterus terang dan bertanya langsung apa itu? )
- Apakah desain ini cacat tanpa harapan, dan saya lebih baik mengakui kekalahan dan parit - arsitektur ini sama sekali? Tidak baik untuk karir saya, tetapi apakah menulis kode yang dirancang dengan buruk akan menjadi lebih baik dalam jangka panjang?
- Apakah pilihan saya saat ini sebenarnya adalah One True Way, dan saya harus berjuang untuk mendapatkan metrik kualitas yang lebih baik (dan / atau instrumentasi) terinstal? Untuk opsi terakhir ini, saya perlu referensi ... Saya tidak bisa hanya melambaikan tangan ke @PHB sambil bergumam. Ini bukan metrik yang Anda cari . Tidak peduli seberapa besar aku ingin bisa