Rost/noto'g'ri qaytaradigan usullarni moslashtirish

Java-ga rost/noto'g'ri qaytaradigan C-uslubi funksiyalarini moslashtirishda eng yaxshi amaliyot qanday?

Muammo qayerda ekanligini ko'rsatishning oddiy usuli.

public static boolean fileNameEndsWithExtension( String filename, String fileExtension)  { 
    return filename.endsWith( fileExtension );
}

E'tibor bering, fayllarni filtrlashning yanada oqlangan usuli bor (bu haqida fikr bildirishingiz mumkin). Qanday bo'lmasin, agar fayl nomi null qiymati bo'lsa, quyidagilarni bajaring:

  1. Agar fayl nomi null bo'lsa, noto'g'ri qaytarilsinmi? Agar shunday bo'lsa, fayl nomi null bo'lgan holat bilan String yoki fayl nomi berilgan fayl kengaytmasi bilan tugamaydigan holatni qanday ajratish mumkin?
  2. Qaytish turini null qiymatiga ruxsat beruvchi mantiqiy o'rash sinfiga o'zgartiring.
  3. Exception ni tashlang va dasturchini null qiymati hech qachon usulga o'tkazilmasligiga ishonch hosil qilishga majbur qilasizmi?
  4. Boshqa yechim ishlatilsinmi?

person James P.    schedule 04.04.2010    source manba
comment
Qarang: stackoverflow.com/questions Mumkin variant uchun /135845/ (4)   -  person skaffman    schedule 05.04.2010


Javoblar (4)


Agar fayl nomi null bo'lsa, NullPointerException yoki IllegalArgumentExceptionni tashlashingiz kerak. Qaysi biri eng yaxshi ekanini tanlashga ruxsat beraman. Savolda qaysilardan foydalanish haqida yaxshi bahs bor: IllegalArgumentException yoki null parametr uchun NullPointerException?

person GaryF    schedule 04.04.2010
comment
+1, albatta, agar siz uni avvalgidek qoldirsangiz, siz allaqachon tegishli NullPointerException olasiz; Men, ehtimol, boshqa qilmasam kerak. 1 va 2-variantlar dahshatli, chunki ular xatoni tuzatish qiyinroq bo'lishi mumkin bo'lgan keyingi nuqtaga qadar kechiktiradilar. - person bobince; 05.04.2010
comment
NPE va IAE haqida: Men NPE ni tavsiya qilaman, chunki u standart kutubxona orqali argument noqonuniy null ekanligini ko'rsatish uchun keng qo'llaniladi. Java 7 hatto java.util.Objects ni ham taqdim etadi, u bir qatorli nolga qarshi tekshirish va tayinlash uchun yordamchi usulga ega bo'ladi (argument null bo'lsa, NPE beradi). NPElar buni amalga oshirishning oddiy usuliga aylandi. Tegishli RFE: bugs.sun.com/view_bug.do?bug_id=6889858 - person gustafc; 05.04.2010
comment
Buni eshitish yoqimli. Bu null qiymatlarni tekshirish uchun yordamchi usulga ega bo'lishni tejaydi. - person James P.; 05.04.2010

Muayyan ilovangizning muammoli sohasida mantiqiy bo'lgan narsani qilasiz:

  1. Agar fayl nomlarining bo'sh to'plami istalgan kengaytma bilan tugaydi, deyish mantiqiy bo'lsa, true qiymatini qaytaring.
  2. Agar fayl nomlarining boʻsh toʻplami kengaytmasiz tugaydi, deyish mantiqiy boʻlsa, false qiymatini qaytaring.
  3. Agar hech kim bu savolni hech qachon so'ramasligi kerak deb aytish mantiqiy bo'lsa, kodni tashlab qo'ying.
  4. Agar uchta qiymatli natijaga ega bo'lish mantiqiy bo'lsa, albatta, Booleandan foydalaning.
  5. Yoki uchta qiymatli raqamni yarating va undan qayting.

Ko'pincha, 3-variant oqilona bo'ladi, ammo bu erda hech kim sizning arizangizga boshqalarning qo'llanilishini istisno qila olmaydi. Agar siz biron bir sababga ko'ra juda ko'p mazmunli null fayl nomlarini o'tkazsangiz, boshqalardan birini tanlash mantiqiy bo'lishi mumkin.

person bmargulies    schedule 04.04.2010

Men 1 yoki 3 dan foydalanardim. Eng yaxshisi NullPointerExceptions ni ishlataman yoki hech bo'lmaganda tasdiqlash.

Null mumkin bo'lgan mantiqiy qiymatlarni qaytarish odatda qiymatdan ko'ra ko'proq muammolarni keltirib chiqaradi, sizda null va hokazolarni tekshirishingiz kerak. Bundan tashqari, fileNameEndsWithExtension() fayl nomi haqiqiy ekanligini bilganingizdagina foydalanadigan funksiyaga o'xshaydi.

Shuni ham unutmangki, fileExtension null ham bo'lishi mumkin.

person Juha Syrjälä    schedule 04.04.2010

  1. haqiqiy IFF fayl nomini qaytaring.endsWith( fileExtension )

Agar fayl nomi null bo'lsa, men noto'g'ri qiymatini qaytaraman va null va boshqa mos kelmaydigan qiymatlar o'rtasidagi farq bilan bezovta qilmayman.

Agar null fayl nomi tekshirilishi va maxsus ishlov berilishi kerak bo'lgan alohida holat bo'lsa, u holda bu alohida tekshirilishi kerak, afzalroq endsWith() ni tekshirishdan oldin, lekin keraksiz ish vaqti istisnolarini oldini olish uchun endsWith() da null tekshiruvini saqlab qoling.

Men null = noto'g'ri xatti-harakatni tanlashimning sababi, ehtimol relyatsion ma'lumotlar bazalarining ta'siri bilan bog'liq. Quyidagi so'rov faqat shartga mos keladigan qatorlarni qaytaradi, qolgan hamma narsa (null va nomuvofiqliklar) e'tiborga olinmaydi.

select * from filenames
 where filename like '&fileExtension';
person crowne    schedule 04.04.2010
comment
Men mulohaza yuritishni tushunaman, chunki men ilgari o'rganib qolganman. Aytgancha, JQL/JPA/Hibernate bilan getResult() null qiymatni ham qaytaradi (odatda Ro'yxatga ajratilgan). - person James P.; 05.04.2010