Saat ini saya sedang mengerjakan basis kode yang memiliki banyak kelas yang menerapkan metode Mulai. Ini seperti konstruksi dua fase bagi saya, yang saya anggap sebagai praktik buruk. Saya tidak bisa membedakan antara ini dan konstruktor.
Kapan tepat menggunakan metode awal alih-alih konstruksi objek normal?
Kapan saya harus lebih suka menggunakan konstruktor?
Sunting: Saya tidak berpikir itu relevan tetapi bahasa pemrogramannya adalah C #, itu bisa juga berlaku untuk Java atau C ++
object-oriented-design
construction
constructors
Dave Hillier
sumber
sumber
start
dan konstruktor? dll ...init
metode semacam di luarnew
fungsi - perldoc.perl.org/perlobj.html . Idiom dari satu bahasa dapat bekerja dengan baik di sana dan tidak dalam bahasa lain.Start
metode dalam API umum termasuk utas dan stopwatch.Jawaban:
Suatu
Start()
metode (sukaRun()
,Execute()
atau yang serupa) sesuai ketika biaya membangun objek rendah, tetapi biaya menggunakannya tinggi. Sebagai contoh: Kelas yang merangkum algoritma optimasi jalur terbaik. Sepele untuk mengaturnya dengan seperangkat parameter (X
kuadrat demiY
kuadrat, dengan metode evaluasi semacam itu), tetapi mungkin perlu beberapa saat untuk dieksekusi. Jika Anda ingin membuat 20 objek ini, Anda mungkin ingin menunda eksekusi sampai semuanya dibuat - ini memungkinkan Anda untuk memparalelkannya dengan lebih mudah, misalnya.Atau, itu bisa berguna ketika Anda tidak tahu kapan objek akan diperlukan untuk memulai - mungkin karena itu didasarkan pada input pengguna, atau logika yang memilih dari daftar kemungkinan.
Ini mengasumsikan, tentu saja, itu
Start()
adalah metode yang berguna pada objek, dan bukan yang setara denganInitialize()
metode. Jika ini hanya cara tambahan untuk mengatur lebih banyak parameter, seharusnya tidak ada.sumber
Kode Lengkap (dan banyak sumber daya rekayasa perangkat lunak lainnya) menekankan pencocokan kelas Anda dengan objek dunia nyata. Saya percaya alasan mendasar untuk ini adalah karena hal itu membuatnya lebih mungkin bahwa Anda memiliki pemahaman yang benar tentang apa yang Anda implementasikan, daripada meretas ide yang tidak berwujud.
Jika Anda adalah pelanggan teori ini, saya tidak melihat ada yang salah dengan menambahkan
Start()
metode ke kelas mana pun yang seharusnya, apakah itu objek nyata, juga memiliki keadaan istirahat. Jika tidak masuk akal untuk objek Anda ada saat tidak berjalan (atau tidak masuk akal untuk objek Anda berjalan sama sekali), maka saya akan mengatakan itu adalah praktik yang buruk.sumber
Start()
bisa berhubungan dengan saklar on / off (seperti lightswitch) yang kemudian harus memilikiStop()
, atau ke tombol-tekan (seperti tombol Print pada mesin fotokopi) di mana ia memulai dan kemudian berjalan sampai selesai.Anda dapat menggunakan inisialisasi malas.
Dengan begitu Anda menghindari penggabungan temporal, artinya konsumen kelas Anda harus memanggil metode tertentu dalam urutan tertentu. Harus menelepon
start()
dulu adalah cara untuk mengetahui bagaimana kelas bekerja secara internal, yang buruk karena Anda dapat mengubahnya di masa depan.Tunda inisialisasi mahal sampai pertama kali diperlukan ..
Contoh:
sumber