haruskah saya membuang pengecualian dari konstruktor?

46

Saya tahu saya bisa melempar pengecualian dari konstruktor dalam PHP tetapi haruskah saya melakukannya? Misalnya, jika nilai parameter tidak seperti yang saya harapkan.

Atau haruskah saya menunda melemparkan pengecualian sampai suatu metode dipanggil. Apa kelebihan dan kekurangan dalam kedua kasus?

WordsWorth
sumber
pertanyaannya adalah apakah Anda ingin pengguna Anda melihat pesan kesalahan pengecualian yang jelek?
15
@LawrenceCherone tidak, bukan itu pertanyaannya. Tidak semuanya. Pertanyaannya adalah apakah akan memunculkan pengecualian segera ketika ctor tidak dapat mengatur objek menjadi keadaan yang valid dari argumen yang diteruskan ke sana atau untuk menunda itu sampai suatu metode yang beroperasi pada instance itu dengan kemungkinan keadaan tidak valid dipanggil. Lebih cocok untuk programmer sekalipun.
4
@LawrenceCherone Anda benar. Tidak ada perangkat lunak yang sengaja gagal; itu harus terus berjalan dan melihat apa yang terjadi. / s
user253751
@immibis Sarkasme baik itu bagus.
kodeart
Ini pertanyaan yang luar biasa !!! Saya bahkan tidak pernah mempertimbangkan ide ini sampai hari ini.
Rhys Johns

Jawaban:

75

Mengapa Anda menunda melempar pengecualian?

Jika Anda tahu bahwa objek tidak dapat membuat instance dengan benar dengan parameter yang diberikan, maka Anda harus melempar pengecualian.

Jika tidak, seseorang mungkin menguji objek Anda untuk null, yang tidak akan, dan dapat menganggap semuanya berjalan seperti yang diharapkan.

Ada banyak hal yang dapat dilakukan untuk objek Anda tanpa memanggil metode di atasnya: itu dapat ditambahkan ke daftar, dapat dibandingkan, dapat dikirim sebagai parameter, dll dll. Semua ini adalah hal-hal yang seharusnya tidak terjadi, mengingat itu bukan objek yang valid.

Andrei G
sumber
21

Jika konstruktor Anda dipanggil dengan parameter buruk maka Anda harus (harus?) Melempar pengecualian. Jika tidak maka Anda bisa mendapatkan objek buruk yang tidak akan berperilaku seperti yang diharapkan.

Félix Gagnon-Grenier
sumber
17

Benar!!

Anda harus membuang pengecualian jika parameter untuk membangun objek tidak valid atau tidak sesuai kontrak. Ini bukan ide yang baik untuk melanjutkan aliran mengetahui bahwa objek dibangun dengan data yang buruk yang dapat menyebabkan banyak masalah jika Anda membiarkan penelepon melanjutkan.

Itu selalu lebih baik untuk "GAGAL CEPAT DAN GAGAL AWAL"

java_mouse
sumber
7

Saya tahu saya bisa melempar pengecualian dari konstruktor dalam PHP tetapi haruskah saya melakukannya?

Itu adalah satu-satunya cara waras untuk menginformasikan bahwa konstruksi objek gagal.

BЈовић
sumber
2

Mengapa Anda tidak memvalidasi set parameter sebelum membuat instance objek Anda? Melakukan hal itu akan memastikan bahwa objek Anda akan dibuat, dengan demikian, menghilangkan salah satu sisi yang mempengaruhi yang mungkin terjadi dari kegagalannya.

Meskipun saya tahu Anda dapat memeriksa hal-hal di konstruktor Anda dan melemparkan pengecualian, saya lebih suka menulis konstruktor saya sedemikian rupa sehingga mereka tidak gagal. Saya melakukan validasi parameter sebelum membuat objek yang kemudian saya dapat melemparkan pengecualian tanpa konstruktor saya gagal. Saya juga umumnya tidak mencoba untuk instantiate objek baru di konstruktor saya, sebagai gantinya memilih untuk instantiate mereka yang saya butuhkan.

Hanya pendapat saya saja. PHP menawarkan banyak kebebasan - selamat menikmati!

Tony Mays
sumber
Saya tidak yakin mengapa jawaban ini diturunkan. Ini memberikan pendekatan yang valid menggunakan validasi parameter sebelum konstruksi objek ( metode "penjaga" ) yang merupakan cara yang baik untuk merancang kelas / fungsi Anda untuk aturan tertentu (biasanya bisnis). Jika juga tidak menjawab langsung pertanyaan OP, tapi itu masih saran yang bagus :)
kodeart