Nah, saya berpikir bahwa itu bermuara pada perbedaan antara yang baik dan cukup baik .
Meskipun dalam banyak kasus Anda dapat menghindari penggunaan konstanta dengan menerapkan pola lain (strategi atau mungkin kelas terbang), ada sesuatu yang bisa dikatakan karena tidak memerlukan setengah lusin kelas lain untuk mewakili sebuah konsep. Saya pikir intinya adalah, seberapa besar kemungkinan ada kebutuhan akan konstanta lain. Dengan kata lain, apakah ada kebutuhan untuk memperluas ENUM yang disediakan oleh konstanta pada antarmuka. Jika Anda merasa perlu untuk mengembangkannya, gunakan pola yang lebih formal. Jika tidak, maka itu mungkin cukup (itu akan cukup baik, dan karenanya lebih sedikit kode untuk ditulis dan diuji). Berikut contoh penggunaan yang cukup baik dan buruk:
Buruk:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
Cukup baik:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
Sekarang, alasan saya memilih contoh tersebut sederhana. The User
interface mendefinisikan enum jenis pengguna. Ini kemungkinan besar akan berkembang seiring waktu dan akan lebih cocok dengan pola lain. Tetapi HTTPRequest_1_1
ini adalah kasus penggunaan yang layak, karena enum ditentukan oleh RFC2616 dan tidak akan berubah selama masa pakai kelas.
Secara umum, saya tidak melihat masalah dengan konstanta dan konstanta kelas sebagai masalah global . Saya melihatnya sebagai masalah ketergantungan. Ini perbedaan yang sempit, tetapi yang pasti. Saya melihat masalah global seperti dalam variabel global yang tidak diberlakukan, dan dengan demikian menciptakan ketergantungan global yang lunak. Tapi kelas hard-code menciptakan ketergantungan yang diberlakukan, dan dengan demikian membuat ketergantungan global yang keras. Jadi keduanya adalah dependensi. Tetapi saya menganggap global menjadi jauh lebih buruk karena tidak diberlakukan ... Itulah sebabnya saya tidak suka menggabungkan dependensi kelas dengan dependensi global di bawah spanduk yang sama ...
Jika Anda menulis MyClass::FOO
, Anda akan mendapatkan hardcode untuk detail implementasi MyClass
. Ini menciptakan hard-coupling, yang membuat kode Anda kurang fleksibel, dan karenanya harus dihindari. Namun, antarmuka ada untuk mengizinkan jenis kopling ini dengan tepat. Oleh karena MyInterface::FOO
itu jangan memperkenalkan kopling beton apa pun. Dengan itu, saya tidak akan memperkenalkan antarmuka hanya untuk menambahkan konstanta padanya.
Jadi jika Anda menggunakan antarmuka, dan Anda sangat yakin bahwa Anda (atau siapa pun dalam hal ini) tidak memerlukan nilai tambahan, maka saya tidak benar-benar melihat masalah besar dengan konstanta antarmuka ... desain tidak akan menyertakan konstanta atau kondisional atau angka ajaib atau string ajaib atau apapun yang di-hardcode. Namun, itu menambah waktu tambahan untuk pengembangan, karena Anda harus mempertimbangkan kegunaannya. Pandangan saya adalah bahwa sering kali sangat berharga untuk meluangkan waktu tambahan untuk membangun desain yang solid dan hebat. Tetapi ada kalanya cukup baik benar-benar dapat diterima (dan dibutuhkan pengembang yang berpengalaman untuk memahami perbedaannya), dan dalam kasus itu tidak masalah.
Sekali lagi, itu hanya pandangan saya tentang itu ...