Bagaimana Anda menghindari kesamaan nama antara kelas Anda dan yang asli? [Tutup]

9

Saya baru saja mengalami "masalah menarik", yang saya ingin pendapat Anda tentang:

Saya mengembangkan sistem dan karena berbagai alasan (artinya: abstraksi, kemandirian teknologi, dll) kami membuat jenis kami sendiri untuk bertukar informasi.

Misalnya: jika ada metode yang disebut SendEmail dan dipanggil oleh logika bisnis, cara itu memiliki parameter tipe OurCompany.EMailMessage, yang merupakan objek yang sepenuhnya independen teknologi dan hanya berisi "data yang relevan dengan bisnis" (untuk Misalnya, tidak ada informasi tentang penyandian kepala).

Di dalam fungsi SendEmail, kami mendapatkan informasi ini dari objek EMailMEssage kami dan membuat objek MailMessage (yang ini spesifik untuk technolgy) sehingga dapat dikirim melalui jaringan.

Seperti yang sudah Anda ketahui, kelas kami memiliki nama yang sangat mirip dengan kelas bahasa "asli". Masalahnya adalah: ini persis seperti apa mereka, pesan email, sehingga sulit untuk menemukan nama lain yang berarti bagi mereka.

Apakah Anda sering mengalami masalah ini? Bagaimana Anda mengelola itu?

Sunting: @mgkrebbs hanya berkomentar tentang menggunakan nama yang sepenuhnya memenuhi syarat. Ini adalah pendekatan kami saat ini, tetapi sedikit terlalu bertele-tele, IMHO. Saya ingin sesuatu yang lebih bersih, jika memungkinkan.

JSBach
sumber
2
Selalu menggunakan kualifikasi tampaknya solusi yang bisa diterapkan, jika agak bertele-tele. Gunakan OurCompany.EMailMessage untuk satu jenis dan SendEmailClass.EMailMessage (atau apa pun) untuk yang lain. Apakah ada masalah dengan mengambil pendekatan ini?
mgkrebbs
Ya, saya sudah memikirkannya, tetapi itu menjadi kata kerja. Saya ingin sesuatu yang "bersih", tetapi solusi yang Anda usulkan adalah solusi saya saat ini. Saya akan menambahkan ini ke penjelasan
JSBach
3
Nama datang dalam konteks. Biasanya namespace atau semacamnya. Jadi itu seharusnya tidak menjadi masalah.
deadalnix
+1, saya suka pertanyaan ini. Saya pernah mengajukan pertanyaan ini kepada seorang instruktur sekitar 7 tahun yang lalu, dan dia pikir saya sudah lengkap "...." :)
NoChance
Bahasa apa yang Anda gunakan? Jawabannya khusus bahasa. Secara umum jawabannya adalah 'gunakan namespace'. Dalam satu aplikasi Java, cukup umum untuk memiliki nama kelas yang sama dengan yang digunakan oleh setengah lusin perpustakaan.
kevin cline

Jawaban:

3

Ini adalah masalah tentang namespace yang akan Anda gunakan untuk proyek Anda.

Pada dasarnya namespace adalah kumpulan kata kunci yang disediakan oleh semua kelas Anda dan / atau semua kelas yang ingin Anda gunakan dalam proyek Anda (termasuk kelas standar yang biasanya disediakan dengan bahasa / kompiler / IDE).

Karena namespace adalah kumpulan, beberapa aturan pada dasarnya diterapkan untuk mencegah pembuatan istilah yang berantakan tanpa perilaku yang terkait, dan beberapa bahasa seperti C # juga memungkinkan Anda untuk mendefinisikan namespace Anda sendiri seperti biasa dan juga menggunakannya di kelas lain.

Jangan bingung ruang nama dengan kata kunci dasar bahasa, keduanya adalah kumpulan kata kunci tetapi dengan perbedaan besar antara keduanya: Anda dapat memodifikasi ruang nama tetapi Anda biasanya tidak dapat mengubah kata kunci dasar suatu bahasa. Jumlah antara namespace yang telah Anda gunakan dalam proyek Anda dan kata kunci dasar bahasa yang Anda gunakan memberi Anda jumlah total kata kunci.

Topik ini banyak dibahas di internet, saya dapat menyarankan pencarian dasar dengan istilah "namespace [bahasa Anda]" o sesuatu seperti itu. Saya tidak langsung menjawab pertanyaan Anda hanya karena Anda dapat memiliki pendekatan berbeda untuk berbagai bahasa.

Mikro
sumber
3

Yah tim pengembangan lama saya gunakan untuk menambahkan akronim aplikasi di setiap kelas yang disesuaikan. Kami memiliki misalnya kelas ABCEmail .

Saya pikir ini lebih mudah daripada mengandalkan namespace tetapi juga bisa menjadi solusi pelengkap untuk penggunaan namespace.

Last but not least, karena Anda membuat objek baru, itu berarti objek asli tidak menjawab kebutuhan Anda sehingga nama File Email Anda dapat CustomizedEmail , AdvancedEmail ... dll

Amine
sumber
1
Setuju dengan poin terakhir Anda, tetapi mengapa OAEmaillebih baik dari itu OurApplication.Email? OAEMailmemiliki dampak pada setiap bagian dari perangkat lunak, sedangkan notasi namespace hanya berdampak di sana di mana konversi terjadi dan kedua kelas digunakan dalam file sumber yang sama.
Steven Jeuris
1
Saya pikir awalan adalah ide bagus ketika bahasa Anda tidak mendukung ruang nama. Tetapi jika bahasa mendukung beberapa bentuk pada namespacing kemudian gunakan (ini adalah masalah namespaces dirancang untuk menyelesaikan!). `
Martin York
@Steven Jeuris: Nama kelas harus dipilih setelah dibuat. Setelah itu, saya menemukan itu sebagai praktik buruk untuk mengubahnya ... karena semua dampak yang tidak perlu.
Amine
@Loki Astari: saya tidak tahu IDE mana yang Anda gunakan, tetapi saya menemukan bahwa nama kelas yang berbeda lebih mudah ditangani ketika mencari atau membuka kelas yang diberikan. Saya melihat proyek memiliki versi khusus "email" dan setiap kali saya ingin membuka file saya harus menelusuri beberapa namespace. Poin Anda masih valid Saya kira itu subjektif untuk organisasi paket berapa banyak kelas khusus yang akan dibuat.
Amine
1
@Amine: Saya tidak menyadari Anda sebenarnya berdebat dengan ruang nama. Saya sarankan Anda membaca tentang namespaces lagi untuk melihat semua keuntungan menggunakannya: enkapsulasi, menghilangkan ambiguitas, redundansi lebih sedikit, ... Ps: Sebagian besar IDE modern memiliki fitur pencarian yang memungkinkan Anda untuk dengan cepat menemukan file sumber tanpa harus menelusuri melalui hierarki. Mengenai komentar Anda kepada saya: refactoring konstan adalah bagian dari pengembangan perangkat lunak. Saat Anda dapat menemukan nama yang lebih cocok, berdampak besar atau tidak, Anda harus mempertimbangkan untuk mengganti nama. Namun yang terbaik adalah membicarakan hal ini dengan rekan kerja terlebih dahulu.
Steven Jeuris
3

Bahasa apa yang Anda gunakan? Jawabannya khusus bahasa. Secara umum jawabannya adalah 'gunakan namespaces'. Saya hampir tidak akan pernah memotong nama tipe untuk menghindari konflik dengan beberapa namespace eksternal.

Dalam satu aplikasi Java, cukup umum untuk memiliki nama kelas yang sama (misalnya "Tanggal") yang didefinisikan dalam setengah lusin ruang nama. Jika satu kelas perlu menggunakan dua kelas Date yang terpisah, maka salah satu kelas Date harus sepenuhnya memenuhi syarat di mana pun itu muncul, karena Java tidak mendukung alias tipe. Dalam C ++ hidup lebih mudah; Anda bisa mengganti nama salah satunya dengan typedef.

kevin cline
sumber
Saya hendak memposting jawaban yang serupa, tetapi bukannya C ++ alias contoh ingin menyebutkan C # menggunakan alias directive .
Steven Jeuris
@ Seven: Saya akan menyebutkan C # bukannya C ++, tapi sudah beberapa tahun sejak saya diprogram dalam C #, dan tidak yakin.
kevin cline
2

Apakah Anda sering mengalami masalah ini? Bagaimana Anda mengelola itu?

Itu benar-benar tergantung pada bahasa yang Anda gunakan. Di c ++ dan java, masalah ini diselesaikan dengan menggunakan namespaces. Saya menggunakan c ++, dan kebetulan saya mendapat kelas yang berbeda dengan nama yang sama. Itu bukan masalah, karena mereka berada di ruang nama yang berbeda.

Dalam bahasa lain, tidak ada jalan lain selain memberikan nama yang berbeda.

BЈовић
sumber
Untuk komputer itu bukan masalah, tetapi untuk pengembang mungkin, karena Anda punya EmailMessage dan MailMessage, misalnya.
JSBach
@Oscar Jelas. Untuk komputer bisa xyz123dan masih berfungsi sama. Saya tidak melihat cara lain maka akan bertele-tele (Anda mengatakan dalam komentar bahwa Anda mencoba menghindarinya).
BЈовић
2

Pertanyaan Anda sangat bagus. Bagaimana jika Anda awali metode Anda dengan awalan seperti U (atau u) atau cls (kependekan dari kelas)? Sebagai contoh:

clsEMailMEssage atau uEMailMEssage

Ini tidak memerlukan banyak pengetikan dan Anda dapat langsung mengetahui bahwa jenisnya adalah milik Anda.

Sunting - Sebagai tanggapan dari 2 komentar pertama:

Saya ingin mengarahkan perhatian pembaca pada fakta bahwa: Tidak semua notasi Hongaria diciptakan sama. Kita harus membedakan antara Sistem Hungaria dan Aplikasi Hungaria , saya berasumsi bahwa saran di atas mengikuti tipe Apps Hungaria, yang tidak berbahaya.

Kerugian yang terkait dengan notasi Sistem Hungaria seperti dalam penamaan ID suatu intID tidak ada dalam saran di atas.

Untuk lebih lanjut tentang ini, lihat di: Membuat Kode yang Salah Terlihat Salah - Joel On Software

Tidak ada kesempatan
sumber
3
Setiap kali seseorang merekomendasikan notasi hungaria, Tuhan membunuh anak kucing.
Konamiman
2
BIgHUmpCAmelCAsing tidak membantu.
Steven Jeuris
Komentar di atas sangat dihargai. Tolong lihat suntingan saya, meskipun saya tahu beberapa dari kita tidak akan berubah pikiran, setelah semua yang ingin anak kucing dibunuh? :)
NoChance
Saya menghapus suara turun sekarang karena Anda menambahkan beberapa alasan yang valid. Namun, saya tidak setuju bahwa Apps Hungarian lebih tepat daripada ruang nama dalam skenario ini. Ketika bahasa mendukung alias, itu solusi yang jauh lebih cocok. Lihat jawaban kevin cline .
Steven Jeuris
@ Seven Jeuris, terima kasih atas komentar Anda. Namespaces sempurna kecuali bahwa mereka agak lama untuk terus mengetik, saya akan memeriksa tautan yang Anda berikan.
NoChance