Dalam sebuah contoh:
var assets = "images/"
var sounds = assets+"sounds/"
Apakah lebih konvensional untuk meletakkan garis miring di belakang jalur file?
var assets = "/images"
var sounds = assets+"/sounds"
Apakah ada metode lain yang merupakan praktik umum yang baik?
conventions
file-structure
iiridescent
sumber
sumber
File.separator
,File
danPath
API menerima keduanya/
dan `\`.Jawaban:
Hampir setiap bahasa pemrograman utama memiliki perpustakaan untuk menangani pemisah direktori untuk Anda. Anda harus memanfaatkannya. Ini akan menyederhanakan kode Anda dan mencegah bug .
Dalam pengalaman saya, alasan umum untuk menggabungkan string seperti ini adalah bahwa mereka berasal dari sumber yang berbeda. Terkadang potongan berbeda dari file konfigurasi. Terkadang ini adalah gabungan konstan dengan argumen fungsi. Dalam setiap dan semua kasus, ketika mereka berasal dari sumber yang berbeda, Anda harus mempertimbangkan beberapa kasus yang mungkin berbeda mengenai pemisah di ujung yang akan digabungkan:
"images/"
dan"/sounds"
"images"
dan"/sounds"
atau"images/"
dan"sounds"
"images"
dan"sounds"
Fakta bahwa setiap bagian berasal dari sumber yang berbeda berarti masing-masing sumber mungkin memiliki ide sendiri tentang konvensi apa yang harus diikuti, jika seseorang memikirkannya sama sekali! Apa pun panggilan kode Anda tidak perlu khawatir tentang ini . Kode Anda harus menangani semua kasus karena seseorang akan melanggar konvensi Anda . Ini akan menghasilkan waktu yang terbuang untuk menyelidiki penyebab kesalahan dan membuat perbaikan. Saya memiliki beberapa kejadian tidak menyenangkan di mana seorang rekan kerja membuat asumsi tentang bagaimana path harus diformat dalam file konfigurasi, artinya saya harus mencari kode dan mencari tahu apa yang mereka harapkan (atau memperbaiki kode).
Sebagian besar bahasa utama menyediakan metode untuk melakukan ini untuk Anda yang sudah menangani banyak kasus:
os.path.join
untuk PythonFile.join
untuk RubyPath.join
untuk Node.jsPaths.get
untuk Java (7 dan lebih tinggi)Path.Combine
untuk .NETAda peringatan dengan ini. Sejumlah ini tampaknya mengasumsikan bahwa pemisah direktori terkemuka dalam argumen kedua merujuk ke path root dan bahwa ini berarti argumen pertama harus dibuang seluruhnya. Saya tidak tahu mengapa ini dianggap berguna; bagi saya, itu hanya menyebabkan masalah. Saya tidak pernah ingin menggabungkan dua bagian jalur dan berakhir dengan bagian pertama dijatuhkan. Baca dokumentasi dengan seksama untuk kasus-kasus khusus, dan jika perlu, tulis pembungkus yang melakukan apa yang Anda inginkan dengan ini daripada penanganan khusus mereka.
Ini juga membantu jika Anda memiliki kebutuhan untuk mendukung sistem operasi yang berbeda. Kelas-kelas ini hampir di mana-mana bertanggung jawab untuk memilih pemisah yang benar. Perpustakaan biasanya memiliki cara normalisasi jalur agar sesuai dengan konvensi OS, juga.
Jika bahasa pemrograman Anda tidak memiliki perpustakaan yang tersedia, Anda harus menulis metode yang menangani semua kasus ini dan menggunakannya secara bebas dan lintas proyek.
Ini termasuk dalam kategori "jangan membuat asumsi" dan "gunakan alat yang membantu Anda."
sumber
C:\Documents and Settings\Admin
denganmy folder:document.txt
sistem * nix untuk menghasilkan/home/admin/my folder/document.txt
- trik yang lucu, tetapi di dunia nyata, heuristik yang terlibat memperkenalkan lebih banyak bug daripada yang mereka perbaiki.Paths.get()
hanya mengubah satuString
menjadiPath
objek. Untuk bergabung dengan jalur, Anda akan menggunakanPath.resolve()
, yang dapat mengambil yang lainPath
atauString
. Ada metode lain diPath
kelas yang selanjutnya memungkinkan untuk bergabung jalur dengan berbagai cara.Paths
dengan baik.[System.IO.Path]::Combine("abc", "\def")
yang memiliki perilaku yang dijelaskan, adalah cmdletJoin-Path "abc" "\def"
yang memberi"abc\def"
.Di Jawa, jawabannya adalah "tak satu pun dari yang di atas". Praktik terbaik adalah merakit nama path menggunakan
java.io.File
kelas; misalnyaThe
File
kelas juga menangani pemisah path platform tertentu.Ada masalah terpisah apakah pathname Anda harus dimulai dengan garis miring atau tidak. Tapi itu lebih berkaitan dengan kebenaran daripada praktik terbaik. Pathname yang dimulai dengan garis miring berarti sesuatu yang berbeda dengan pathname yang tidak !!
Tidak ada dukungan eksplisit untuk penanganan pathname di perpustakaan Javascript inti (ECMA), tetapi (setidaknya) Node.js memberikan dukungan melalui modul Path.
sumber
os.path.join
. PowerShell memilikijoin-path
. Saya akan menambahkan sesuatu untuk jawaban ini. Saya telah menemukan bahwa jika Anda memerlukan path file dalam beberapa bagian, itu membuat kode Anda sangat rapuh jika Anda membuat asumsi tentang salah satu dari mereka yang memiliki path file di tempat-tempat tertentu. Menggunakan kelas-kelas ini tidak hanya membantu dengan portabilitas, tetapi juga menangani semua kasus tepi yang mungkin (garis miring pada kedua ujungnya untuk digabungkan, garis miring pada satu sisi, tidak ada garis miring di antara semua). Fleksibilitas ini sangat berharga ketika Anda menjatuhkan jalur file dalam file konfigurasi.Perhatikan bahwa dalam .NET Anda harus menggunakan metode Path.Combine.
Alasannya adalah karena 'mengetahui' karakter yang benar untuk digunakan saat membuat nama folder.
Ini menghilangkan 'masalah' sebelum atau sesudah memperbaiki.
sumber
os.path.join('src', '../../../your_secret_stuff')
ini berlaku di Python; dengan kata lain, jangan gunakan metode ini secara membabi buta pada input pengguna.Saat membangun jalur, saya sering menggunakan fungsi yang menambahkan garis miring jika belum ada. Kemudian jalur dapat dibangun seperti:
di mana fs () menambahkan garis miring jika diperlukan.
sumber
Folder dan file berbeda hanya dalam satu aspek: folder berakhir dengan garis miring di mana file tidak. Lebih jauh lagi, jalur absolut dimulai dengan di
/
mana jalur relatif tidak. Jika Anda menggunakan jalur dan file yang digabungkan secara konsisten ini bersama-sama seharusnya tidak menjadi masalah.Menggabungkan dua jalur absolut secara bersamaan tidak masuk akal, karena jalur kedua harus relatif terhadap jalur pertama. Menggabungkan dua jalur relatif bersama bukanlah masalah, tetapi mungkin mengarah pada perilaku yang tidak terdefinisi jika program tidak tahu di mana jalur relatif relatif terhadap.
sumber
var a = "/my/path" + "css/" + "test.css"; //Output: "/my/pathcss/test.css"
absolutepath
seharusnya diakhiri dengan garis miring, karena itu adalah jalan. Entah bagaimana saya mengabaikan hal itu ketika saya menulis ini.Saya pikir tidak ada sihir atau "praktik umum" tentang cara menerapkan jalur, tetapi tentu saja rangkaian string bukanlah cara yang harus ditempuh. Anda dapat mengembangkan API Anda sendiri untuk menangani kasus-kasus, tetapi itu mungkin memerlukan beberapa upaya. Khususnya, Anda harus berhati-hati tentang platform yang berbeda. Sebagai contoh, di Windows
\
adalah pemisah sedangkan di sistem berbasis Unix/
adalah pemisah.Saya tidak terbiasa dengan perpustakaan Javascript, tapi saya yakin harus ada perpustakaan untuk menangani kasus ini. Di Java, misalnya, Anda dapat menggunakan API Jalur untuk menangani operasi jalur mandiri platform.
sumber
/
sebagai path nama file pembatas. Ini memang perlu quirks di baris perintah, tetapi file I / O API berfungsi dengan baik dengan forward slash.Preferensi pribadi saya adalah ini:
Saya selalu menggunakan jalur absolut (
/images/...
), rasanya kurang rentan terhadap kesalahan, bagi saya. Ini juga merupakan bukti yang lebih bodoh untuk digunakanvar sounds = assets+"/sounds"
karena meskipunassets
memiliki garis miring dan Anda berakhir/images//sounds
, itu masih akan menyelesaikan/images/sounds
. Satu penafian adalah bahwa itu tergantung pada penangan permintaan Anda. Apache tampaknya menanganinya dengan baik (setidaknya versi / konfigurasi tertentu, lihat http://www.amazon.com//gp//site-directory//ref=nav_sad ). Dengan cara lain Anda akan berakhir dengan/imagessounds
, bukan jadi bukti bodoh :) Ada juga pilihan untuk memeriksa tebasan ganda dan membersihkannya. Bukan pilihan dengan pendekatan lain.sumber
/
) adalah jalur absolut , bukan jalur relatif. Atau apakah maksud Anda hanya untuk bagian path selain yang pertama?/somewhere
adalah jalur relatif karena tidak menyertakan host, sehingga browser akan mencarinya berdasarkan host halaman saat ini ... Di dunia web,http://here/somewhere
adalah URI absolut, dan/somewhereelse
relatif terhadap itu. Dalam dunia sistem file,/somewhere
adalah mutlak, berasal dari root/
, dan "entah bagaimana" relatif terhadap direktori kerja saat ini.http://here/somewhere
adalah URI dengan jalur absolut,/somewhere
adalah referensi relatif dengan jalur absolut dansomewhere/else
merupakan referensi relatif dengan jalur relatif. Rupanya, di lingkaran itu "jalur relatif" digunakan untuk merujuk ke referensi relatif.Dalam Smalltalk sangat mudah untuk mendefinisikan metode / di String sehingga berfungsi seperti ini:
Berikut ini adalah implementasi sederhana dari metode ini (Anda dapat membuatnya lebih baik):
Catatan : Anda mungkin juga ingin memperhatikan lebih baik untuk kasus-kasus perbatasan seperti
'' / ''
,'x/' / ''
, dll, dalam rangka untuk menentukan perilaku yang tepat.sumber