Pertanyaan FxCop: Kata majemuk harus diperlakukan sebagai istilah diskrit


FxCop ingin saya mengeja Nama Pengguna dengan huruf besar N (yaitu Nama Pengguna), karena itu adalah kata majemuk. Namun, karena alasan konsistensi kita perlu mengejanya dengan huruf kecil n - jadi baik nama pengguna atau Nama Pengguna.

Saya sudah mencoba mengutak-atik CodeAnalysisDictionary.xml dengan menambahkan bagian berikut ke bagian:

<DiscreteExceptions>
  <Term>username</Term>
</DiscreteExceptions>

Dari apa yang saya pahami bagaimana kamus kustom bekerja, ini harus memberitahu FxCop untuk memperlakukan nama pengguna sebagai istilah terpisah dan mencegah pemeriksaan CompoundWordsshouldBeCasedCorrectly (CA1702) untuk memunculkan kesalahan.

Sayangnya ini tidak berhasil. Apakah ada yang punya ide mengapa itu dan bagaimana mengatasi ini? Saya tidak ingin menambahkan penindasan, karena ini akan secara serius mengacaukan file GlobalSuppressions karena ada cukup banyak kejadian.

Diedit untuk ditambahkan: Untuk saat ini saya telah memecahkan masalah ini dengan menggunakan GlobalSuppressions, tetapi mengingat sifat masalah ini, ini tidak tampak seperti cara ideal untuk menyelesaikan masalah ini. Adakah yang bisa memberikan petunjuk di mana mencari informasi lebih lanjut tentang bagaimana FxCop menerapkan aturan yang didefinisikan dalam kamus?


32
2018-01-05 15:00


asal


Jawaban:


Saya adalah seorang pengembang di Tim Analisis FxCop / Managed Code selama 3 tahun dan saya punya jawaban Anda. Segala sesuatunya telah berubah sejak masa saya, dan saya telah lupa persis bagaimana penanganan kamus khusus bekerja dan oleh karena itu saya butuh sedikit waktu untuk memikirkan hal ini. :)

Ringkasan bisnis plan

Jawaban singkatnya adalah Anda harus menghapus semua referensi ke nama pengguna, nama pengguna, UserName, dan Nama Pengguna dari C: \ Program Files (x86) \ Microsoft FxCop 1.36 \ CustomDictionary.xml.

Biasanya, saya tidak akan merekomendasikan ini karena seharusnya tidak diperlukan, tetapi Anda telah menemukan apa yang saya yakini sebagai bug, dan inilah satu-satunya solusi yang dapat saya temukan.

Cerita lengkap

Oke, sekarang untuk panjang menjawab...

Aturan memiliki dua pemeriksaan berbeda yang berfungsi sebagai berikut:

A. Periksa kata-kata majemuk yang harus diskrit

  1. Pisahkan pengidentifikasi menjadi token: mis. FileName --> { "file", "name" }
  2. Eja periksa setiap pasangan token yang berdekatan.
  3. Jika pemeriksaan ejaan berhasil (mis. filename dianggap kata yang valid),
     kemudian kami menemukan masalah potensial karena satu kata tidak boleh diekspresikan sebagai  dua token.
  4. Namun, jika ada <Term CompoundAlternate="FileName">filename</Term>   dalam <Compound> bagian dari kamus khusus, maka itu berarti bahwa  meskipun filename adalah kata, pedoman desain (sebagian besar sebagai anggukan konsistensi  dengan seni sebelumnya dalam Kerangka yang mendahului keberadaan aturan) bersikeras  harus ditulis sebagai FileName, jadi kita harus menekan peringatan itu.
  5. Juga, jika ada <Term>filename</Term> masuk dalam <DiscreteExceptions>   bagian dari kamus khusus, maka itu diartikan bahwa meskipun 'nama file' adalah  sebuah kata, mungkin juga dua kata 'file' dan 'nama' dalam konteks yang berbeda. misalnya  Onset adalah kata, tetapi meminta pengguna untuk berubah DoSomethingOnSet untuk   DoSomethingOnset akan berisik, jadi kita harus menekan peringatan itu.

B. Periksa kata-kata terpisah yang harus berupa gabungan:

  1. Mengambil token dari A.1, periksa masing-masing individu terhadap kumpulan senyawa  istilah dalam kamus khusus.
  2. Jika ada kecocokan, maka kita harus memperingatkan sesuai dengan interpretasi pada langkah A.4.

Perhatikan bahwa peringatan Anda: Username seharusnya UserName terdeteksi di bagian B, yang tidak berkonsultasi dengan bagian DiscreteExceptions, yang mengapa Anda tidak dapat menekan peringatan dengan memodifikasi bagian itu. Masalahnya adalah kamus khusus default memiliki entri yang menyatakan bahwa casing yang benar untuk username selalu UserName. Perlu dihapus atau diganti entah bagaimana.

Serangga

Sekarang, solusi yang ideal adalah meninggalkan kamus khusus default saja, tentukan SearchFxCopDir=false dalam file proyek Anda, dan kemudian bergabung hanya dalam bagian-bagian dari kamus kustom default yang Anda inginkan dalam CustomDictionary.xml yang digunakan untuk proyek Anda. Sayangnya, ini tidak bekerja karena FxCop 1.36 mengabaikan direktif SearchFxCopDir dan selalu memperlakukannya sebagai benar. Saya yakin ini adalah bug, tetapi mungkin juga ini adalah perubahan yang disengaja karena arahannya tidak didokumentasikan dan tidak memiliki antarmuka yang sesuai. Sejujurnya aku tidak tahu ...

Kesimpulan

Mengingat bahwa FxCop selalu menggunakan kamus khusus default di samping kamus khusus proyek, satu-satunya cara Anda adalah menghapus entri yang dipermasalahkan dari kamus khusus default.

Jika saya memiliki kesempatan, saya akan menghubungi tim analisis kode saat ini untuk melihat apakah ini sebenarnya bug, dan laporkan ke sini ...


31
2018-01-12 07:27



Dalam kamus khusus yang dilengkapi dengan FxCop (terletak di sistem saya di C: \ Program Files \ Microsoft FxCop 1.36 \ CustomDixtionary.xml, tetapi YMMV) dalam Words \ Compounds memiliki a <Term CompoundAlternate="UserName">username</Term> masuk. Hapus. Anda masih membutuhkan pengecualian diskrit.


3
2018-01-12 06:24