ভালো কোড মন্দ কোডঃ জাভা পার্ট - ৫

bad-codegood-codeternary-operation

জাভাতে ট্রাইনারি অপারেশন বা শর্ট ফর্মে কন্ডিশন (booleanExpression ? expression1 : expression2) লিখলে এবং যদি এক্সপ্রেশনে দুই ধরণের প্রিমিটিভ টাইপ হয়, তাহলে কোড বাগি হতে পারে। এক্সপ্রেশনে একই টাইপ প্রিমিটিভ দিতে হবে। এক্ষেত্রে হয় ক্যারেক্টার টাইপ নয় ইন্টেজার টাইপ দেয়া উচিত।



মন্দ কোড

int i = 0; 
System.out.println(true ? 'x' : 0); // prints "x" 
System.out.println(true ? 'x' : i); // prints "120"



ভালো কোড

System.out.println(true ? 'x' : '0'); // prints "x" 
System.out.println(true ? 'x' : 'i'); // prints "x"

or 

int i = 0; 
System.out.println(true ? 120 : 0); // prints "120" 
System.out.println(true ? 120 : i); // prints "120"





কখনোই জাভাতে দুইটা ফ্লোট টাইপকে ইকুয়াল (==) দিয়ে কম্পেয়ার করা উচিত না। যারা হিসাব নিকাশের সফটওয়্যার বানান, এটা জানা তাদের জন্য খুব দরকার। এর কারণ জানতে https://stackoverflow.com/questions/322749/retain-precision-with-double-in-java দেখা যেতে পারে। আমি বিস্তারিততে যাব না।


যদি ফ্লোট কে কখনো কম্পেয়ার করতেই হয়, তাহলে সবচেয়ে ভালো হয় একটা ইররর মার্জিন রেখে দুটি মানের পার্থক্যকে কম্পেয়ার করা। আর যদি সেটা সম্ভব না হয়, তাহলে BigDecimal (আমার প্রথম পছন্দ) ব্যবহার করা।



মন্দ কোড

System.out.println((0.1 + 0.2) == 0.3); // false আসবে      
System.out.println(23.42f == 23.42);     // false আসবে      



ভালো কোড

final double errorMargin = 0.001;
System.out.println( Math.abs((0.1 + 0.2) - 0.3) < errorMargin );

or

BigDecimal bg1 = new BigDecimal("5.6");
BigDecimal bg2 = new BigDecimal("5.8");
System.out.println(bg1.add(bg2).equals(new BigDecimal("11.4")));



ধন্যবাদ।