Saya menulis kelas yang "harus digunakan dengan cara tertentu" (saya kira semua kelas harus ...).
Misalnya, saya membuat fooManager
kelas, yang membutuhkan panggilan ke, katakanlah Initialize(string,string)
,. Dan, untuk mendorong contoh sedikit lebih jauh, kelas tidak akan berguna jika kita tidak mendengarkan ThisHappened
aksinya.
Maksud saya adalah, kelas yang saya tulis membutuhkan pemanggilan metode. Tapi itu akan dikompilasi dengan baik jika Anda tidak memanggil metode itu dan akan berakhir dengan FooManager baru yang kosong. Pada titik tertentu, itu tidak akan berfungsi, atau mungkin crash, tergantung pada kelas dan apa fungsinya. Programer yang mengimplementasikan kelas saya jelas akan melihat ke dalamnya dan menyadari "Oh, saya tidak memanggil Inisialisasi!", Dan itu akan baik-baik saja.
Tapi saya tidak suka itu. Apa yang saya inginkan adalah kode untuk TIDAK dikompilasi jika metode tidak dipanggil; Saya kira itu tidak mungkin. Atau sesuatu yang akan segera terlihat dan jelas.
Saya menemukan diri saya bermasalah dengan pendekatan saat ini yang saya miliki di sini, yaitu sebagai berikut:
Tambahkan nilai Boolean pribadi di kelas, dan periksa di mana pun diperlukan jika kelas diinisialisasi; jika tidak, saya akan melemparkan pengecualian yang mengatakan "Kelas tidak diinisialisasi, apakah Anda yakin Anda menelepon .Initialize(string,string)
?".
Saya agak baik-baik saja dengan pendekatan itu, tetapi mengarah ke banyak kode yang dikompilasi dan, pada akhirnya, tidak perlu bagi pengguna akhir.
Juga, kadang-kadang bahkan lebih banyak kode ketika ada lebih banyak metode daripada sekadar Initiliaze
menelepon. Saya mencoba menjaga kelas saya dengan tidak terlalu banyak metode / tindakan publik, tapi itu tidak menyelesaikan masalah, hanya membuatnya masuk akal.
Yang saya cari di sini adalah:
- Apakah pendekatan saya benar?
- Apakah ada yang lebih baik?
- Apa yang kalian lakukan / sarankan?
- Apakah saya mencoba menyelesaikan non-masalah? Saya telah diberitahu oleh kolega bahwa programmerlah yang memeriksa kelas sebelum mencoba menggunakannya. Saya dengan hormat tidak setuju, tapi itu masalah lain yang saya yakini.
Sederhananya, saya mencoba mencari cara untuk tidak pernah lupa untuk mengimplementasikan panggilan ketika kelas itu digunakan kembali nanti, atau oleh orang lain.
KLARIFIKASI:
Untuk mengklarifikasi banyak pertanyaan di sini:
Saya jelas TIDAK hanya berbicara tentang bagian Inisialisasi kelas, tetapi itu seumur hidup. Cegah rekan kerja untuk memanggil metode dua kali, pastikan mereka memanggil X sebelum Y, dll. Apa pun yang pada akhirnya wajib dan dalam dokumentasi, tetapi saya ingin kode dan sesederhana dan sekecil mungkin. Saya benar-benar menyukai ide Asserts, meskipun saya cukup yakin saya perlu mencampurkan beberapa ide lain karena Asserts tidak akan selalu mungkin.
Saya menggunakan bahasa C #! Bagaimana saya tidak menyebutkan itu ?! Saya berada di lingkungan Xamarin dan membangun aplikasi seluler yang biasanya menggunakan sekitar 6 hingga 9 proyek dalam solusi, termasuk proyek PCL, iOS, Android, dan Windows. Saya telah menjadi pengembang selama sekitar satu setengah tahun (gabungan sekolah dan pekerjaan), karenanya pernyataan \ pertanyaan saya yang terkadang konyol. Semua itu mungkin tidak relevan di sini, tetapi terlalu banyak informasi tidak selalu buruk.
Saya tidak bisa selalu meletakkan segala sesuatu yang wajib dalam konstruktor, karena pembatasan platform dan penggunaan Dependency Injection, memiliki parameter selain Antarmuka tidak dimatikan. Atau mungkin pengetahuan saya tidak cukup, yang sangat memungkinkan. Sebagian besar waktu itu bukan masalah Inisialisasi, tetapi lebih
bagaimana saya bisa memastikan dia mendaftar ke acara itu?
bagaimana saya bisa memastikan dia tidak lupa untuk "menghentikan proses di beberapa titik"
Di sini saya ingat kelas Pengambilan iklan. Selama tampilan tempat Iklan terlihat, kelas akan mengambil iklan baru setiap menit. Kelas itu membutuhkan tampilan ketika dibangun di mana ia dapat menampilkan Iklan, yang bisa masuk dalam parameter jelas. Tapi begitu tampilan hilang, StopFetching () harus dipanggil. Kalau tidak, kelas akan terus mengambil iklan untuk tampilan yang bahkan tidak ada, dan itu buruk.
Juga, kelas itu memiliki acara yang harus didengarkan, seperti "AdClicked" misalnya. Semuanya berfungsi dengan baik jika tidak didengarkan, tetapi kami kehilangan pelacakan analitik di sana jika ketukan tidak terdaftar. Iklan masih berfungsi, sehingga pengguna dan pengembang tidak akan melihat perbedaan, dan analitik hanya akan memiliki data yang salah. Itu perlu, dihindari, tapi saya tidak yakin bagaimana pengembang bisa tahu mereka harus mendaftar ke acara tao. Itu adalah contoh yang disederhanakan, tetapi idenya ada di sana, "pastikan dia menggunakan Aksi publik yang tersedia" dan pada waktu yang tepat tentu saja!
initialize
dibuat terlambat setelah pembuatan objek? Apakah sang aktor terlalu "berisiko" dalam arti ia bisa melempar pengecualian dan memutus rantai penciptaan?
new
jika objek tidak siap untuk digunakan. Mengandalkan metode inisialisasi pasti akan kembali menghantui Anda dan harus dihindari kecuali benar-benar diperlukan, setidaknya itulah pengalaman saya.